int del_tree( ptree_t* t ) { int i,j; if(NULL == t) goto exit; /* delete all the children */ for(i=0; i< PTREE_CHILDREN; i++) { /* shm_free the rg array of rt_info */ if(NULL!=t->ptnode[i].rg) { for(j=0;j<t->ptnode[i].rg_pos;j++) { /* if non intermediate delete the routing info */ if(t->ptnode[i].rg[j].rtlw !=NULL) del_rt_list(t->ptnode[i].rg[j].rtlw); } shm_free(t->ptnode[i].rg); } /* if non leaf delete all the children */ if(t->ptnode[i].next != NULL) del_tree(t->ptnode[i].next); } shm_free(t); exit: return 0; }
void free_rt_data( rt_data_t* rt_data, int all ) { int j; if(NULL!=rt_data) { /* del GW list */ del_pgw_list(rt_data->pgw_l); rt_data->pgw_l = 0 ; /* del prefix tree */ del_tree(rt_data->pt); rt_data->pt = 0 ; /* del prefixless rules */ if(NULL!=rt_data->noprefix.rg) { for(j=0;j<rt_data->noprefix.rg_pos;j++) { if(rt_data->noprefix.rg[j].rtlw !=NULL) { del_rt_list(rt_data->noprefix.rg[j].rtlw); rt_data->noprefix.rg[j].rtlw = 0; } } shm_free(rt_data->noprefix.rg); rt_data->noprefix.rg = 0; } /* del carriers */ del_carriers_list(rt_data->carriers); rt_data->carriers=0; /* del top level */ if (all) shm_free(rt_data); } }
void free_rt_data( rt_data_t* rt_data, int all ) { int j; if(NULL!=rt_data) { /* del GW list */ del_pgw_list(rt_data->pgw_l); rt_data->pgw_l = 0 ; /* del GW addr list */ del_pgw_addr_list(rt_data->pgw_addr_l); rt_data->pgw_addr_l =0; /* del prefix tree */ del_tree(rt_data->pt); /* del prefixless rules */ if(NULL!=rt_data->noprefix.rg) { for(j=0;j<rt_data->noprefix.rg_pos;j++) { if(rt_data->noprefix.rg[j].rtlw !=NULL) { del_rt_list(rt_data->noprefix.rg[j].rtlw); rt_data->noprefix.rg[j].rtlw = 0; } } shm_free(rt_data->noprefix.rg); rt_data->noprefix.rg = 0; } /* del top level or reset to 0 it's content */ if (all) shm_free(rt_data); else memset(rt_data, 0, sizeof(rt_data_t)); } }