/
* *INDENT-OFF* */ typedef CLIB_PACKED (struct { mac_address_t mac; ip4_address_t ip4; }) ethernet_arp_ip4_over_ethernet_address_t; /* *INDENT-ON* */ /* *INDENT-OFF* */ typedef CLIB_PACKED (struct { u8 mac[6]; ip4_address_t ip4; }) ethernet_arp_ip4_over_ethernet_address_t; /* *INDENT-ON* */
ip_neighbor_add
/** * @brief Control Plane hook to remove an ARP entry */ int vnet_arp_unset_ip4_over_ethernet (vnet_main_t * vnm, u32 sw_if_index, void *a_arg) { ethernet_arp_ip4_over_ethernet_address_t *a = a_arg; vnet_arp_set_ip4_over_ethernet_rpc_args_t args; args.sw_if_index = sw_if_index; args.flags = ETHERNET_ARP_ARGS_REMOVE; clib_memcpy (&args.a, a, sizeof (*a)); vl_api_rpc_call_main_thread (set_ip4_over_ethernet_rpc_callback, (u8 *) & args, sizeof (args)); return 0; }
add_ip4_neighbor (test_main_t * tm, int add_del) { vl_api_ip_neighbor_add_del_t *mp; u32 tmp; mp = vl_msg_api_alloc (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL); mp->client_index = tm->my_client_index; mp->context = 0xdeadbeef; mp->sw_if_index = ntohl (6); mp->is_add = add_del; clib_memset (mp->mac_address, 0xbe, sizeof (mp->mac_address)); tmp = ntohl (0x0101010a); clib_memcpy (mp->dst_address, &tmp, 4); vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp); }
vl_api_ip_neighbor_add_del_t_handler (vl_api_ip_neighbor_add_del_t * mp,
vlib_main_t * vm)
vl_api_ip_neighbor_add_del_t_handler (vl_api_ip_neighbor_add_del_t * mp, vlib_main_t * vm) { if (mp->is_add) rv = vnet_arp_set_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index), &a, mp->is_static, mp->is_no_adj_fib); else rv = vnet_arp_unset_ip4_over_ethernet (vnm, ntohl (mp->sw_if_index), &a);
20.01 vl_api_ip_neighbor_add_del_t_handler if (mp->is_add) rv = ip_neighbor_add (&ip, type, &mac, ntohl (mp->neighbor.sw_if_index), flags, &stats_index); else rv = ip_neighbor_del (&ip, type, ntohl (mp->neighbor.sw_if_index));
ip_neighbor_learn (const ip_neighbor_learn_t * l) { ip_neighbor_add (&l->ip, l->type, &l->mac, l->sw_if_index, IP_NEIGHBOR_FLAG_DYNAMIC, NULL); }
flags = ip_neighbor_flags_decode (mp->neighbor.flags); type = ip_address_decode (&mp->neighbor.ip_address, &ip); mac_address_decode (mp->neighbor.mac_address, &mac); /* must be static or dynamic, default to dynamic */ if (!(flags & IP_NEIGHBOR_FLAG_STATIC) && !(flags & IP_NEIGHBOR_FLAG_DYNAMIC)) flags |= IP_NEIGHBOR_FLAG_DYNAMIC;
原文:https://www.cnblogs.com/dream397/p/12789828.html