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); }
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); }