Пример #1
0
void neigh_create(switchlink_handle_t vrf_h,
                  switchlink_ip_addr_t *ipaddr,
                  switchlink_mac_addr_t mac_addr,
                  switchlink_handle_t intf_h) {
  switchlink_db_status_t status;
  switchlink_db_neigh_info_t neigh_info;

  if ((ipaddr->family == AF_INET6) &&
      IN6_IS_ADDR_MULTICAST(&(ipaddr->ip.v6addr))) {
    return;
  }

  memset(&neigh_info, 0, sizeof(switchlink_db_neigh_info_t));
  neigh_info.vrf_h = vrf_h;
  neigh_info.intf_h = intf_h;
  memcpy(&(neigh_info.ip_addr), ipaddr, sizeof(switchlink_ip_addr_t));

  status = switchlink_db_neighbor_get_info(&neigh_info);
  if (status == SWITCHLINK_DB_STATUS_SUCCESS) {
    if (memcmp(neigh_info.mac_addr, mac_addr, sizeof(switchlink_mac_addr_t)) ==
        0) {
      // no change
      return;
    }

    // update, currently handled as a delete followed by add
    neigh_delete(vrf_h, ipaddr, intf_h);
  }

  memcpy(neigh_info.mac_addr, mac_addr, sizeof(switchlink_mac_addr_t));
  if (switchlink_nexthop_create(&neigh_info) == -1) {
    return;
  }
  if (switchlink_neighbor_create(&neigh_info) == -1) {
    switchlink_nexthop_delete(&neigh_info);
    return;
  }
  switchlink_db_neighbor_add(&neigh_info);

  // add a host route
  route_create(g_default_vrf_h, ipaddr, ipaddr, 0, intf_h);
}
Пример #2
0
static void
neigh_delete(switchlink_handle_t vrf_h, switchlink_ip_addr_t *ipaddr,
             switchlink_handle_t intf_h) {
    switchlink_db_neigh_info_t neigh_info;
    switchlink_db_status_t status;

    memset(&neigh_info, 0, sizeof(switchlink_db_neigh_info_t));
    neigh_info.vrf_h = vrf_h;
    neigh_info.intf_h = intf_h;
    memcpy(&(neigh_info.ip_addr), ipaddr, sizeof(switchlink_ip_addr_t));
    status = switchlink_db_neighbor_get_info(&neigh_info);
    if (status != SWITCHLINK_DB_STATUS_SUCCESS) {
        return;
    }

    switchlink_neighbor_delete(&neigh_info);
    switchlink_nexthop_delete(&neigh_info);
    switchlink_db_neighbor_delete(&neigh_info);

    // delete the host route
    route_delete(g_default_vrf_h, ipaddr);
}