diff options
Diffstat (limited to 'src/nSocket/nstack_rd/nstack_rd_ip.c')
-rw-r--r-- | src/nSocket/nstack_rd/nstack_rd_ip.c | 387 |
1 files changed, 216 insertions, 171 deletions
diff --git a/src/nSocket/nstack_rd/nstack_rd_ip.c b/src/nSocket/nstack_rd/nstack_rd_ip.c index 82035d1..d769720 100644 --- a/src/nSocket/nstack_rd/nstack_rd_ip.c +++ b/src/nSocket/nstack_rd/nstack_rd_ip.c @@ -18,157 +18,158 @@ #include <arpa/inet.h> #include "nstack_rd_data.h" #include "nstack_rd.h" -#include "nstack_rd_init.h" #include "nstack_rd_priv.h" #include "nstack_rd_ip.h" #include "nstack_log.h" #include "nstack_securec.h" +/* Optimize log */ #include "nstack_ip_addr.h" -#define NSTACK_IP_MLSTACKID RD_LWIP - #define PP_HTONL(x) ((((x) & 0xff) << 24) | \ (((x) & 0xff00) << 8) | \ (((x) & 0xff0000UL) >> 8) | \ (((x) & 0xff000000UL) >> 24)) -#define rd_ismulticast(addr)(((unsigned int)(addr) & 0xf0000000UL) == 0xe0000000UL) +#define rd_ismulticast(addr)(((ntohl(addr)) & 0xf0000000UL) == 0xe0000000UL) int g_multi_stackid = -1; /*copy rd data*/ -int -nstack_rd_ipdata_cpy (void *destdata, void *srcdata) +int nstack_rd_ip_data_cpy(void *destdata, void *srcdata) { - rd_data_item *pitem = (rd_data_item *) destdata; - rd_route_data *pdata = (rd_route_data *) srcdata; - - pitem->type = pdata->type; - pitem->ipdata.addr = pdata->ipdata.addr; - pitem->ipdata.masklen = pdata->ipdata.masklen; - pitem->ipdata.resev[0] = pdata->ipdata.resev[0]; - pitem->ipdata.resev[1] = pdata->ipdata.resev[1]; - return NSTACK_RD_SUCCESS; + rd_data_item *pitem = (rd_data_item *) destdata; + rd_route_data *pdata = (rd_route_data *) srcdata; + + pitem->type = pdata->type; + pitem->ipdata.addr = pdata->ipdata.addr; + pitem->ipdata.masklen = pdata->ipdata.masklen; + pitem->ipdata.resev[0] = pdata->ipdata.resev[0]; + pitem->ipdata.resev[1] = pdata->ipdata.resev[1]; + return NSTACK_RD_SUCCESS; } /* * Add an ip segment to the list and sort it in descending order of ip mask length * If the list already exists in the same list of ip side, then stack_id update - *ip is local byteorder + *ip is network byte order */ -int -nstack_rd_ip_item_insert (nstack_rd_list * hlist, void *rditem) +/*vars are used in macro*/ +int nstack_rd_ip_item_insert(nstack_rd_list * hlist, void *rditem) { - nstack_rd_node *pdatanode = NULL; - nstack_rd_node *tempdata = NULL; - struct hlist_node *tempnode = NULL; - struct hlist_node *tem = NULL; - - unsigned int tempip_addr = 0; - unsigned int tempip_masklen = 0; - rd_data_item *pitem = (rd_data_item *) rditem; - unsigned int ip_addr = pitem->ipdata.addr; - unsigned int ip_masklen = pitem->ipdata.masklen; - unsigned int ip_maskv = MASK_V (ip_addr, ip_masklen); - - ip_masklen = pitem->ipdata.masklen; - NSSOC_LOGDBG ("stackid:%d, ipaddr:%u.%u.%u.%u masklen:0x%x was inserted", - pitem->stack_id, ip4_addr4_16 (&pitem->ipdata.addr), - ip4_addr3_16 (&pitem->ipdata.addr), - ip4_addr2_16 (&pitem->ipdata.addr), - ip4_addr1_16 (&pitem->ipdata.addr), pitem->ipdata.masklen); - - pdatanode = (nstack_rd_node *) malloc (sizeof (nstack_rd_node)); - if (!pdatanode) + nstack_rd_node *pdatanode = NULL; + nstack_rd_node *tempdata = NULL; + struct hlist_node *tempnode = NULL; + struct hlist_node *tem = NULL; + unsigned int ip_addr = 0; + unsigned int ip_masklen = 0; + unsigned int ip_maskv = 0; + unsigned int tempip_addr = 0; + unsigned int tempip_masklen = 0; + rd_data_item *pitem = (rd_data_item *) rditem; + + ip_masklen = pitem->ipdata.masklen; + ip_addr = pitem->ipdata.addr; + ip_maskv = MASK_V(ip_addr, ip_masklen); + + /* Optimize log */ + NSSOC_LOGDBG("stackid:%d, ipaddr:*.*.%u.%u masklen:0x%x was inserted", + pitem->stack_id, FUZZY_IP_VAR(&pitem->ipdata.addr), + pitem->ipdata.masklen); + + pdatanode = (nstack_rd_node *) malloc(sizeof(nstack_rd_node)); /*this function is necessary */ + if (!pdatanode) { - NSSOC_LOGERR ("nstack rd item malloc fail"); - return NSTACK_RD_FAIL; + NSSOC_LOGERR("nstack rd item malloc fail"); + return NSTACK_RD_FAIL; } - int retVal = - MEMSET_S (pdatanode, sizeof (nstack_rd_node), 0, sizeof (nstack_rd_node)); - if (EOK != retVal) + /* add return value check */ + int retVal = memset_s(pdatanode, sizeof(nstack_rd_node), 0, + sizeof(nstack_rd_node)); + if (EOK != retVal) { - NSSOC_LOGERR ("MEMSET_S failed]retVal=%d", retVal); - free (pdatanode); - return NSTACK_RD_FAIL; + NSSOC_LOGERR("memset_s failed]retVal=%d", retVal); + free(pdatanode); /*this function is necessary */ + return NSTACK_RD_FAIL; } - INIT_HLIST_NODE (&pdatanode->rdnode); - NSTACK_RD_IP_ITEM_COPY (&(pdatanode->item), pitem); + INIT_HLIST_NODE(&pdatanode->rdnode); + NSTACK_RD_IP_ITEM_COPY(&(pdatanode->item), pitem); - if (hlist_empty (&(hlist->headlist))) + if (hlist_empty(&(hlist->headlist))) { - hlist_add_head (&(pdatanode->rdnode), &(hlist->headlist)); - return NSTACK_RD_SUCCESS; + hlist_add_head(&(pdatanode->rdnode), &(hlist->headlist)); + + return NSTACK_RD_SUCCESS; + } - hlist_for_each_entry (tempdata, tempnode, &(hlist->headlist), rdnode) - { - tem = tempnode; - tempip_addr = tempdata->item.ipdata.addr; - tempip_masklen = tempdata->item.ipdata.masklen; - if (ip_masklen < tempip_masklen) - { - continue; - } - - /*if already exist, just return success */ - if (ip_maskv == MASK_V (tempip_addr, tempip_masklen)) - { - NSSOC_LOGDBG - ("insert ip:%u.%u.%u.%u, mask:0x%x, stack_id:%d, exist orgid:%d", - ip4_addr4_16 (&pitem->ipdata.addr), - ip4_addr3_16 (&pitem->ipdata.addr), - ip4_addr2_16 (&pitem->ipdata.addr), - ip4_addr1_16 (&pitem->ipdata.addr), pitem->ipdata.masklen, - pitem->stack_id, tempdata->item.stack_id); - - tempdata->item.stack_id = pitem->stack_id; - tempdata->item.agetime = NSTACK_RD_AGETIME_MAX; - free (pdatanode); + + hlist_for_each_entry(tempdata, tempnode, &(hlist->headlist), rdnode) + { + tem = tempnode; + tempip_addr = tempdata->item.ipdata.addr; + tempip_masklen = tempdata->item.ipdata.masklen; + if (ip_masklen < tempip_masklen) + { + continue; + } + + /*if already exist, just return success */ + if (ip_maskv == MASK_V(tempip_addr, tempip_masklen)) + { + /* Optimize log */ + NSSOC_LOGDBG + ("insert ip=*.*.%u.%u, mask=0x%x, stack_id=%d, exist orgid=%d", + FUZZY_IP_VAR(&pitem->ipdata.addr), pitem->ipdata.masklen, + pitem->stack_id, tempdata->item.stack_id); + /* Optimize log */ + + tempdata->item.stack_id = pitem->stack_id; + tempdata->item.agetime = NSTACK_RD_AGETIME_MAX; + free(pdatanode); /*this function is necessary */ + return NSTACK_RD_SUCCESS; + } + hlist_add_before(&(pdatanode->rdnode), tempnode); + return NSTACK_RD_SUCCESS; - } - hlist_add_before (&(pdatanode->rdnode), tempnode); + + } + hlist_add_after(tem, &(pdatanode->rdnode)); + return NSTACK_RD_SUCCESS; - } - hlist_add_after (tem, &(pdatanode->rdnode)); - return NSTACK_RD_SUCCESS; + } /* *find stackid by ip - *input ip must netorder + *input ip must be network order */ -int -nstack_rd_ip_item_find (nstack_rd_list * hlist, void *rdkey, void *outitem) +int nstack_rd_ip_item_find(nstack_rd_list * hlist, void *rdkey, void *outitem) { - struct hlist_node *tempnode = NULL; - nstack_rd_node *tempdata = NULL; - unsigned int tempip_addr = 0; - unsigned int tempip_masklen = 0; - nstack_rd_key *key = (nstack_rd_key *) rdkey; - rd_data_item *pitem = (rd_data_item *) outitem; - unsigned int ip_addr = 0; - /*need to convert to local order */ - ip_addr = ntohl (key->ip_addr); - - hlist_for_each_entry (tempdata, tempnode, &(hlist->headlist), rdnode) - { - tempip_addr = tempdata->item.ipdata.addr; - tempip_masklen = tempdata->item.ipdata.masklen; - /*if already exist, just return success */ - if (MASK_V (ip_addr, tempip_masklen) == - MASK_V (tempip_addr, tempip_masklen)) - { - NSTACK_RD_IP_ITEM_COPY (pitem, &(tempdata->item)); - return NSTACK_RD_SUCCESS; - } - } + struct hlist_node *tempnode = NULL; + nstack_rd_node *tempdata = NULL; + unsigned int tempip_addr = 0; + unsigned int tempip_masklen = 0; + nstack_rd_key *key = (nstack_rd_key *) rdkey; + rd_data_item *pitem = (rd_data_item *) outitem; + unsigned int ip_addr = key->ip_addr; - NSSOC_LOGDBG ("ip=%u.%u.%u.%u item not found", ip4_addr4_16 (&ip_addr), - ip4_addr3_16 (&ip_addr), - ip4_addr2_16 (&ip_addr), ip4_addr1_16 (&ip_addr)); + hlist_for_each_entry(tempdata, tempnode, &(hlist->headlist), rdnode) + { + tempip_addr = tempdata->item.ipdata.addr; + tempip_masklen = tempdata->item.ipdata.masklen; + /*if already exist, just return success */ + if (MASK_V(ip_addr, tempip_masklen) == + MASK_V(tempip_addr, tempip_masklen)) + { + NSTACK_RD_IP_ITEM_COPY(pitem, &(tempdata->item)); + return NSTACK_RD_SUCCESS; + } + } - return NSTACK_RD_FAIL; + /* Optimize log */ + NSSOC_LOGDBG("ip=*.*.%u.%u item not found", FUZZY_IP_VAR(&ip_addr)); + + return NSTACK_RD_FAIL; } /***************************************************************************** @@ -180,86 +181,130 @@ nstack_rd_ip_item_find (nstack_rd_list * hlist, void *rdkey, void *outitem) * Calls : * Called By : *****************************************************************************/ -int -nstack_rd_ip_item_age (nstack_rd_list * hlist) +int nstack_rd_ip_item_age(nstack_rd_list * hlist) +{ + struct hlist_node *tempnode = NULL; + nstack_rd_node *tempdata = NULL; + nstack_rd_node *prevdata = NULL; + struct hlist_node *prevnode = NULL; + NSSOC_LOGINF("nstack rd ip age begin"); + hlist_for_each_entry(tempdata, tempnode, &(hlist->headlist), rdnode) + { + /*if agetime equal 0, remove it */ + if (tempdata->item.agetime <= 0) + { + if (prevdata) + { + /* Optimize log */ + NSSOC_LOGDBG + ("stackid=%d, addrip=*.*.%u.%u, masklen=0x%x was aged", + tempdata->item.stack_id, + FUZZY_IP_VAR(&tempdata->item.ipdata.addr), + tempdata->item.ipdata.masklen); + + hlist_del_init(prevnode); + free(prevdata); /*this function is necessary */ + } + prevdata = tempdata; + prevnode = tempnode; + } + else + { + tempdata->item.agetime--; + } + } + if (prevdata) + { + if (tempdata) + { + /* Optimize log */ + NSSOC_LOGDBG + ("stackid:%d, addrip:*.*.%u.%u, masklen:0x%x was last aged", + tempdata->item.stack_id, + FUZZY_IP_VAR(&tempdata->item.ipdata.addr), + tempdata->item.ipdata.masklen); + } + hlist_del_init(prevnode); + free(prevdata); /*this function is necessary */ + } + NSSOC_LOGINF("nstack rd ip age end"); + return NSTACK_RD_SUCCESS; +} + +void nstack_rd_ip_item_clean(nstack_rd_list * hlist) { - struct hlist_node *tempnode = NULL; - nstack_rd_node *tempdata = NULL; - nstack_rd_node *prevdata = NULL; - struct hlist_node *prevnode = NULL; - NSSOC_LOGINF ("nstack rd ip age begin"); - hlist_for_each_entry (tempdata, tempnode, &(hlist->headlist), rdnode) - { - /*if agetime equal 0, remove it */ - if (tempdata->item.agetime <= 0) - { + struct hlist_node *tempnode = NULL; + nstack_rd_node *tempdata = NULL; + nstack_rd_node *prevdata = NULL; + struct hlist_node *prevnode = NULL; + NSSOC_LOGINF("nstack rd ip item clean begin"); + hlist_for_each_entry(tempdata, tempnode, &(hlist->headlist), rdnode) + { if (prevdata) - { + { NSSOC_LOGDBG - ("stackid:%d, addrip:%u.%u.%u.%u, masklen:0x%x was aged", - tempdata->item.stack_id, - ip4_addr4_16 (&tempdata->item.ipdata.addr), - ip4_addr3_16 (&tempdata->item.ipdata.addr), - ip4_addr2_16 (&tempdata->item.ipdata.addr), - ip4_addr1_16 (&tempdata->item.ipdata.addr), - tempdata->item.ipdata.masklen); - - hlist_del_init (prevnode); - free (prevdata); - } + ("stackid=%d, addrip=*.*.%u.%u, masklen=0x%x was aged", + tempdata->item.stack_id, + FUZZY_IP_VAR(&tempdata->item.ipdata.addr), + tempdata->item.ipdata.masklen); + + hlist_del_init(prevnode); + free(prevdata); /*this function is necessary */ + } + prevdata = tempdata; prevnode = tempnode; - } - else - { - tempdata->item.agetime--; - } - } - if (prevdata) + } + if (prevdata) { - if (tempdata) + if (tempdata) { - NSSOC_LOGDBG - ("stackid:%d, addrip:%u.%u.%u.%u, masklen:0x%x was last aged", - tempdata->item.stack_id, - ip4_addr4_16 (&tempdata->item.ipdata.addr), - ip4_addr3_16 (&tempdata->item.ipdata.addr), - ip4_addr2_16 (&tempdata->item.ipdata.addr), - ip4_addr1_16 (&tempdata->item.ipdata.addr), - tempdata->item.ipdata.masklen); + NSSOC_LOGDBG + ("stackid:%d, addrip:*.*.%u.%u, masklen:0x%x was last aged", + tempdata->item.stack_id, + FUZZY_IP_VAR(&tempdata->item.ipdata.addr), + tempdata->item.ipdata.masklen); } - hlist_del_init (prevnode); - free (prevdata); + hlist_del_init(prevnode); + free(prevdata); /*this function is necessary */ } - NSSOC_LOGINF ("nstack rd ip age end"); - return NSTACK_RD_SUCCESS; + NSSOC_LOGINF("nstack rd ip item clean end"); +} + +static int nstack_get_stackid_byname(char *name) +{ + int stacknum = g_rd_local_data->stack_num; + int iindex = 0; + nstack_rd_stack_info *pstack = NULL; + for (iindex = 0; iindex < stacknum; iindex++) + { + pstack = &(g_rd_local_data->pstack_info[iindex]); + if (0 == strcmp(pstack->name, name)) + { + return pstack->stack_id; + } + } + return -1; } /* *find stackid by spec ip(multicast ip) - *input ip must netorder + *input ip must be network order */ -int -nstack_rd_ip_spec (void *rdkey) +int nstack_rd_ip_spec(void *rdkey) { - nstack_rd_key *key = (nstack_rd_key *) rdkey; - unsigned int ip_addr = 0; + nstack_rd_key *key = (nstack_rd_key *) rdkey; + unsigned int ip_addr = 0; - ip_addr = ntohl (key->ip_addr); + ip_addr = (key->ip_addr); - if (rd_ismulticast (ip_addr)) + if (rd_ismulticast(ip_addr)) { - if (-1 == g_multi_stackid) + if (-1 == g_multi_stackid) { - g_multi_stackid = nstack_get_stackid_byname (NSTACK_IP_MLSTACKID); + g_multi_stackid = nstack_get_stackid_byname(RD_STACKPOOL_NAME); } - return g_multi_stackid; + return g_multi_stackid; } - return -1; -} - -int -nstack_rd_ip_default (void *rdkey) -{ - return NSTACK_GET_STACK (0); + return -1; } |