mi_node_t * mi_tbl_add(EXTAP_DBG_PARM mi_node_t **root, u_int8_t *ip, u_int8_t *mac, int ipver) { int i, len = mi_ip_len(ipver); mi_node_t *a; /* * Non unicast addresses should not be added. Since the * addresses being added come from ARP request/response * (for IPv4), or Neighbor Discovery/Advertisement * (for IPv6) packets, the input need not be validated. */ if ((a = mi_tbl_lkup2(*root, ip, ipver)) != NULL) { eadbg3("%s(%d): ignore dup " eamstr " for " eaistr "\n", f, l, eamac(mac), eaip(ip)); return a; } for (i = 0; i < NUM_MITBL_ENTRIES; i++) { if (mi_node_is_free(&mi_tbl[i])) { OS_MEMCPY(mi_tbl[i].h_dest, mac, ETH_ALEN); OS_MEMCPY(mi_tbl[i].ip, ip, len); mi_tbl[i].ip_ver = ipver; mi_tbl[i].len = len; eadbg3("%s(%d): saving " eamstr " for " eaistr "\n", f, l, eamac(mac), eaip(ip)); return &mi_tbl[i]; } } eadbg3("%s(%d): cant save " eamstr " for " eaistr "\n", f, l, eamac(mac), eaip(ip)); return NULL; }
mi_node_t * mi_tbl_lkup2(mi_node_t *root, u_int8_t *ip, int ipver) { int i, len = mi_ip_len(ipver); for (i = 0; i < NUM_MITBL_ENTRIES; i++) { if (!mi_node_is_free(&mi_tbl[i]) && (mi_tbl[i].ip_ver == ipver) && (OS_MEMCMP(ip, mi_tbl[i].ip, len) == 0)) { return &mi_tbl[i]; } } return NULL; }