📄 hna_table.c
字号:
hna_subnet=(struct subnet_list *)malloc(sizeof(struct subnet_list)); hna_subnet->next=host_entry->hna_list_of_subnet; host_entry->hna_list_of_subnet=hna_subnet; hna_host=olsr_insert_host_in_order_list(host_entry,subnet_entry); /*linking the last and the dest*/ hna_host->host=host_entry; hna_subnet->subnet=subnet_entry; /******** added by Y.Ge *******/ /* update subnet timer */ timeradd(&now, &hold_time_tmp, &hna_subnet->subnet_timer); /******** end of revision ******/ } } /**************** added by Y.Ge **********/ else { /* update subnet timer */ timeradd(&now, &hold_time_tmp, &hna_subnet->subnet_timer); } /**************** end of revision **********/ } netaddr=netaddr->next; } /*if(debug_level>5) { printf("the message->originator;%s\n",inet_ntop(AF_INET6,&(message->originator),str,46)); olsr_print_hna_host_table(); olsr_print_hna_subnet_table(); }*/ return;}/*------------------------------------------------------------------------*/voidolsr_release_hna_table(){ olsr_u8_t index; struct hna_subnet_entry *hna_subnet; struct hna_subnet_entry *hna_subnet_tmp; struct hna_subnet_hash *subnet_hash_hna; struct hna_host_entry *hna_host; struct hna_host_entry *hna_host_tmp; struct hna_host_hash *host_hash_hna; for(index=0;index<HASHSIZE;index++) { subnet_hash_hna=&hnasubnettable[index]; hna_subnet=subnet_hash_hna->hna_subnet_forw; while(hna_subnet!=(struct hna_subnet_entry *)subnet_hash_hna) { hna_subnet_tmp=hna_subnet; hna_subnet=hna_subnet->hna_subnet_forw; olsr_delete_hna_subnet_table(hna_subnet_tmp); } } for(index=0;index<HASHSIZE;index++) { host_hash_hna=&hnahosttable[index]; hna_host=host_hash_hna->hna_host_forw; while(hna_host!=(struct hna_host_entry *)host_hash_hna) { hna_host_tmp=hna_host; hna_host=hna_host->hna_host_forw; olsr_delete_hna_host_table(hna_host_tmp); } }}/*------------------------------------------------------------------------*//************* added by Y.Ge ************/void olsr_time_out_subnet_list(struct hna_host_entry *hna_host){ struct subnet_list *subnet_list; struct subnet_list *subnet_list_tmp; struct hna_subnet_entry *hna_subnet; int hna_time_out = 0; subnet_list = hna_host->hna_list_of_subnet; hna_host->hna_list_of_subnet = NULL; while(subnet_list!=NULL) { if(olsr_timed_out(&subnet_list->subnet_timer)) { hna_time_out = 1; if (debug_level>1) { printf("-------------- time (%d, %d), hna_hubnet timed out! --------\n", now.tv_sec, now.tv_usec); printf("the hna host is: %s, subnet is:%s\n", convert_address_to_string(&hna_host->hna_host_addr), convert_address_to_string(&subnet_list->subnet->hna_subnet_addr)); printf("hna subnet timer is: %d, %d\n", subnet_list->subnet_timer.tv_sec,subnet_list->subnet_timer.tv_usec); fprintf(y_file,"-------------- time (%d, %d), hna_hubnet timed out! --------\n", now.tv_sec, now.tv_usec); fprintf(y_file,"the hna host is: %s, subnet is:\n", convert_address_to_string(&hna_host->hna_host_addr), convert_address_to_string(&subnet_list->subnet->hna_subnet_addr)); fprintf(y_file,"hna subnet timer is: %d, %d\n", subnet_list->subnet_timer.tv_sec,subnet_list->subnet_timer.tv_usec); } hna_subnet = subnet_list->subnet; olsr_delete_list_of_subnet(hna_subnet, &hna_host->hna_host_addr); subnet_list_tmp = subnet_list; subnet_list = subnet_list_tmp->next; free (subnet_list_tmp); changes_topology=UP; } else { subnet_list_tmp = subnet_list; subnet_list = subnet_list->next; subnet_list_tmp->next = hna_host->hna_list_of_subnet; hna_host->hna_list_of_subnet = subnet_list_tmp; } } if (hna_time_out) { if (debug_level > 1) { printf ("************* after HNA subnet time out, the HNA tables are *************\n"); olsr_print_hna_host_table(); olsr_print_hna_subnet_table(); fprintf (y_file,"************* after HNA subnet time out, the HNA tables are *************\n"); olsr_print_trace_hna_host_table(); olsr_print_trace_hna_subnet_table(); } hna_time_out = 0; }}/************* end of revission **********//*------------------------------------------------------------------------*/voidolsr_time_out_hna_table(){ /* We only check the last table because we didn't include a time out in the dest entries */ olsr_u8_t index; struct hna_host_entry *hna_host; struct hna_host_entry *hna_host_tmp; struct hna_host_hash *host_hash_hna; int hna_time_out = 0; for(index=0;index<HASHSIZE;index++) { host_hash_hna=&hnahosttable[index]; hna_host=host_hash_hna->hna_host_forw; while(hna_host!=(struct hna_host_entry *)host_hash_hna) { if(olsr_timed_out(&hna_host->hna_host_timer)) { hna_time_out = 1; if (debug_level>1) { printf("-------------- time (%d, %d), hna_host timed out! --------\n", now.tv_sec, now.tv_usec); printf("the hna host is: %s\n", convert_address_to_string(&hna_host->hna_host_addr)); printf("hna host timer is: %d, %d\n", hna_host->hna_host_timer.tv_sec,hna_host->hna_host_timer.tv_usec); fprintf(y_file,"-------------- time (%d, %d), hna_host timed out! --------\n", now.tv_sec, now.tv_usec); fprintf(y_file,"the hna host is: %s\n", convert_address_to_string(&hna_host->hna_host_addr)); fprintf(y_file,"hna host timer is: %d, %d\n", hna_host->hna_host_timer.tv_sec,hna_host->hna_host_timer.tv_usec); } hna_host_tmp=hna_host; hna_host=hna_host->hna_host_forw; olsr_delete_hna_host_table(hna_host_tmp); changes_topology=UP; } else { /************** added by Y.Ge **********/ olsr_time_out_subnet_list(hna_host); /************* end of revision *********/ hna_host=hna_host->hna_host_forw; } } } if (hna_time_out) { if (debug_level > 1) { printf ("************* after HNA host time out, the HNA tables are *************\n"); olsr_print_hna_host_table(); olsr_print_hna_subnet_table(); fprintf (y_file,"************* after HNA host time out, the HNA tables are *************\n"); olsr_print_trace_hna_host_table(); olsr_print_trace_hna_subnet_table(); } hna_time_out = 0; }}/*------------------------------------------------------------------------*/voidolsr_print_hna_host_table(){ olsr_u8_t index; struct hna_host_entry *hna_host; struct hna_host_hash *host_hash_hna; struct subnet_list *hna_subnet_list; char str[46]; printf("hna host table: %02d:%02d:%02d. %06lu\n", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, now.tv_usec); printf("-------hna host table------------\n"); for(index=0;index<HASHSIZE;index++) { host_hash_hna=&hnahosttable[index]; for(hna_host=host_hash_hna->hna_host_forw;hna_host!=(struct hna_host_entry *)host_hash_hna;hna_host=hna_host->hna_host_forw) { printf("%s ;[host_of; ",inet_ntop(AF_INET6,&hna_host->hna_host_addr,str,46)); hna_subnet_list=hna_host->hna_list_of_subnet; while(hna_subnet_list!=NULL) { printf("%s <%d, %d> ;",inet_ntop(AF_INET6,(&hna_subnet_list->subnet->hna_subnet_addr),str,46), hna_subnet_list->subnet_timer.tv_sec, hna_subnet_list->subnet_timer.tv_usec); hna_subnet_list=hna_subnet_list->next; } printf("]\n"); printf (" -------->hna host timer: %d %d\n", hna_host->hna_host_timer.tv_sec, hna_host->hna_host_timer.tv_usec); } }}/*------------------------------------------------------------------------*/voidolsr_print_hna_subnet_table(){ olsr_u8_t index; struct hna_subnet_entry *hna_subnet; struct hna_subnet_hash *subnet_hash_hna; struct host_list *hna_host_list; char str[46]; printf("hna subnet table: %02d:%02d:%02d. %06lu\n", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, now.tv_usec); printf("-------hna subnet table------------\n"); for(index=0;index<HASHSIZE;index++) { subnet_hash_hna=&hnasubnettable[index]; for(hna_subnet=subnet_hash_hna->hna_subnet_forw;hna_subnet!=(struct hna_subnet_entry *)subnet_hash_hna;hna_subnet=hna_subnet->hna_subnet_forw) { printf("%s ;[subnet_of; ",inet_ntop(AF_INET6,&hna_subnet->hna_subnet_addr,str,46)); hna_host_list=hna_subnet->hna_list_of_host; while(hna_host_list!=NULL) { printf("%s ;",inet_ntop(AF_INET6,(&hna_host_list->host->hna_host_addr),str,46)); hna_host_list=hna_host_list->next; } printf("]\n"); } }}/*------------------------------------------------------------------------*//********* added bby Y.Ge *********/voidolsr_print_trace_hna_host_table(){ olsr_u8_t index; struct hna_host_entry *hna_host; struct hna_host_hash *host_hash_hna; struct subnet_list *hna_subnet_list; char str[46]; fprintf(y_file,"hna host table: %02d:%02d:%02d. %06lu\n", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, now.tv_usec); fprintf(y_file,"-------hna host table------------\n"); for(index=0;index<HASHSIZE;index++) { host_hash_hna=&hnahosttable[index]; for(hna_host=host_hash_hna->hna_host_forw;hna_host!=(struct hna_host_entry *)host_hash_hna;hna_host=hna_host->hna_host_forw) { fprintf(y_file,"%s ;[host_of; ",inet_ntop(AF_INET6,&hna_host->hna_host_addr,str,46)); hna_subnet_list=hna_host->hna_list_of_subnet; while(hna_subnet_list!=NULL) { fprintf(y_file,"%s ;",inet_ntop(AF_INET6,(&hna_subnet_list->subnet->hna_subnet_addr),str,46)); hna_subnet_list=hna_subnet_list->next; } fprintf(y_file,"]\n"); fprintf (y_file," -------->hna host timer: %d %d\n", hna_host->hna_host_timer.tv_sec, hna_host->hna_host_timer.tv_usec); } }}/*------------------------------------------------------------------------*/voidolsr_print_trace_hna_subnet_table(){ olsr_u8_t index; struct hna_subnet_entry *hna_subnet; struct hna_subnet_hash *subnet_hash_hna; struct host_list *hna_host_list; char str[46]; fprintf(y_file,"hna subnet table: %02d:%02d:%02d. %06lu\n", nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, now.tv_usec); fprintf(y_file,"-------hna subnet table------------\n"); for(index=0;index<HASHSIZE;index++) { subnet_hash_hna=&hnasubnettable[index]; for(hna_subnet=subnet_hash_hna->hna_subnet_forw;hna_subnet!=(struct hna_subnet_entry *)subnet_hash_hna;hna_subnet=hna_subnet->hna_subnet_forw) { fprintf(y_file,"%s ;[subnet_of; ",inet_ntop(AF_INET6,&hna_subnet->hna_subnet_addr,str,46)); hna_host_list=hna_subnet->hna_list_of_host; while(hna_host_list!=NULL) { fprintf(y_file,"%s ;",inet_ntop(AF_INET6,(&hna_host_list->host->hna_host_addr),str,46)); hna_host_list=hna_host_list->next; } fprintf(y_file,"]\n"); } }}/*------------------------------------------------------------------------*//* * Perform prefix comparison bitwise * if return 1, addr == prefix * if return 0, addr!=prefix */int olsr_prefix_compare(struct in6_addr *addr, struct in6_addr *prefix, int nprefix){ int i; if (nprefix > 128) return 0; for (i = 0; nprefix > 0; nprefix -= 8, i++) { if (nprefix >= 8) { if (addr->s6_addr[i] != prefix->s6_addr[i]) return 0; } else { if (((addr->s6_addr[i] ^ prefix->s6_addr[i]) & ((~0) << (8 - nprefix))) != 0) return 0; return 1; } } return 1;};/*------------------------------------------------------------------------*//* * Perform address setting bitwise according to prefix */int olsr_prefix_setting(struct in6_addr *addr, int nprefix){ int i; if (nprefix > 128) return 0; for (i = 0; i < 16; nprefix -= 8, i++) { if(nprefix <= 0) addr->s6_addr[i]=0; else if(nprefix < 8) addr->s6_addr[i]=addr->s6_addr[i]&((~0)<<(8-nprefix)); } return 1;};/*------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -