//--------------------------------------------------------------------------------------------------------------------- static int pmip_cache_delete_each(void *data, void *arg) //--------------------------------------------------------------------------------------------------------------------- { pmip_entry_t *bce = (pmip_entry_t *) data; if (is_mag()) { //Delete existing route & rule for the deleted MN mag_remove_route(&bce->mn_addr, bce->link); int usercount = tunnel_getusers(bce->tunnel); dbg("# of binding entries %d \n", usercount); if (usercount == 1) { route_del(bce->tunnel, RT6_TABLE_PMIP, IP6_RT_PRIO_MIP6_FWD, &in6addr_any, 0, &in6addr_any, 0, NULL); } //decrement users of old tunnel. pmip_tunnel_del(bce->tunnel); } //Delete existing route for the deleted MN if (is_lma()) { lma_remove_route(&bce->mn_addr, bce->tunnel); //decrement users of old tunnel. pmip_tunnel_del(bce->tunnel); } //Delete the Entry. free_iov_data((struct iovec *) &bce->mh_vec, bce->iovlen); pmip_bce_delete(bce); return 0; }
//--------------------------------------------------------------------------------------------------------------------- void pmip_cleanup(void) //--------------------------------------------------------------------------------------------------------------------- { // Anh Khuong: add if (is_lma()) { #ifdef LMA_BUFFERING pmip_buffering_cleanup(); #endif #ifdef USE_PMIP_RO if (!undefined_RO) pmip_ro_cleanup(); #endif } if (is_mag()) { #ifdef NAMYEONG_PAPER pmip_buffering_cleanup(); #endif } // Anh Khuong: end //Release the pmip cache ==> deletes the routes and rules and "default route on PMIP" and tunnels created. dbg("Release all occupied resources...\n"); //delete the default rule. dbg("Remove default rule...\n"); rule_del(NULL, RT6_TABLE_MIP6, IP6_RULE_PRIO_MIP6_FWD, RTN_UNICAST, &in6addr_any, 0, &in6addr_any, 0, 0); dbg("Release pmip_cache...\n"); pmip_cache_iterate(pmip_cache_delete_each, NULL); //#undef HAVE_PCAP_BREAKLOOP #define HAVE_PCAP_BREAKLOOP #ifdef HAVE_PCAP_BREAKLOOP /* * We have "pcap_breakloop()"; use it, so that we do as little * as possible in the signal handler (it's probably not safe * to do anything with standard I/O streams in a signal handler - * the ANSI C standard doesn't say it is). */ if (is_mag()) { pcap_breakloop(pcap_descr); } #endif }
void conf_show(struct mip6_config *c) { /* Common options */ dbg("config_file = %s\n", c->config_file); #ifdef ENABLE_VT dbg("vt_hostname = %s\n", c->vt_hostname); dbg("vt_service = %s\n", c->vt_service); #endif dbg("mip6_entity = %u\n", c->mip6_entity); dbg("debug_level = %u\n", c->debug_level); dbg("debug_log_file = %s\n", (c->debug_log_file ? c->debug_log_file : "stderr")); if (c->pmgr.so_path) dbg("PolicyModulePath = %s\n", c->pmgr.so_path); dbg("DefaultBindingAclPolicy = %u\n", c->DefaultBindingAclPolicy); dbg("NonVolatileBindingCache = %s\n", CONF_BOOL_STR(c->NonVolatileBindingCache)); /* IPsec options */ dbg("KeyMngMobCapability = %s\n", CONF_BOOL_STR(c->KeyMngMobCapability)); dbg("UseMnHaIPsec = %s\n", CONF_BOOL_STR(c->UseMnHaIPsec)); /* MN options */ dbg("MnMaxHaBindingLife = %u\n", c->MnMaxHaBindingLife); dbg("MnMaxCnBindingLife = %u\n", c->MnMaxCnBindingLife); dbg("MnRouterProbes = %u\n", c->MnRouterProbes); dbg("MnRouterProbeTimeout = %f\n", tstodsec(c->MnRouterProbeTimeout_ts)); dbg("InitialBindackTimeoutFirstReg = %f\n", tstodsec(c->InitialBindackTimeoutFirstReg_ts)); dbg("InitialBindackTimeoutReReg = %f\n", tstodsec(c->InitialBindackTimeoutReReg_ts)); if (c->MoveModulePath) dbg("MoveModulePath = %s\n", c->MoveModulePath); dbg("UseCnBuAck = %s\n", CONF_BOOL_STR(c->CnBuAck)); dbg("DoRouteOptimizationMN = %s\n", CONF_BOOL_STR(c->DoRouteOptimizationMN)); dbg("MnUseAllInterfaces = %s\n", CONF_BOOL_STR(c->MnUseAllInterfaces)); dbg("MnDiscardHaParamProb = %s\n", CONF_BOOL_STR(c->MnDiscardHaParamProb)); dbg("SendMobPfxSols = %s\n", CONF_BOOL_STR(c->SendMobPfxSols)); dbg("OptimisticHandoff = %s\n", CONF_BOOL_STR(c->OptimisticHandoff)); /* HA options */ dbg("SendMobPfxAdvs = %s\n", CONF_BOOL_STR(c->SendMobPfxAdvs)); dbg("SendUnsolMobPfxAdvs = %s\n", CONF_BOOL_STR(c->SendUnsolMobPfxAdvs)); dbg("MaxMobPfxAdvInterval = %u\n", c->MaxMobPfxAdvInterval); dbg("MinMobPfxAdvInterval = %u\n", c->MinMobPfxAdvInterval); dbg("HaMaxBindingLife = %u\n", c->HaMaxBindingLife); /* CN options */ dbg("DoRouteOptimizationCN = %s\n", CONF_BOOL_STR(c->DoRouteOptimizationCN)); /* PMIP options */ dbg("AllLmaMulticastAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->AllLmaMulticastAddress)); dbg("LmaAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->LmaAddress)); if (is_mag()) { dbg("MagAddressIngress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressIngress)); dbg("MagAddressEgress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressEgress)); } dbg("OurAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->OurAddress)); dbg("HomeNetworkPrefix = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->HomeNetworkPrefix)); dbg("PBULifeTime = %u seconds\n",c->PBULifeTime.tv_sec); dbg("PBALifeTime = %u seconds\n",c->PBALifeTime.tv_sec); dbg("NRetransmissionTime = %u seconds\n",c->NRetransmissionTime.tv_sec); dbg("MaxMessageRetransmissions = %u\n", c->MaxMessageRetransmissions); dbg("TunnelingEnabled = %s\n", CONF_BOOL_STR(c->TunnelingEnabled)); dbg("DynamicTunnelingEnabled = %s\n", CONF_BOOL_STR(c->DynamicTunnelingEnabled)); dbg("RadiusClientConfigFile = %s\n", (c->RadiusClientConfigFile ? c->RadiusClientConfigFile : "No Config file")); dbg("RadiusPassword = %s\n", (c->RadiusPassword ? c->RadiusPassword : "******")); }
void conf_show(struct mip6_config *c) { int i; /* Common options */ dbg("config_file = %s\n", c->config_file); #ifdef ENABLE_VT dbg("vt_hostname = %s\n", c->vt_hostname); dbg("vt_service = %s\n", c->vt_service); #endif dbg("mip6_entity = %u\n", c->mip6_entity); dbg("debug_level = %u\n", c->debug_level); dbg("debug_log_file = %s\n", (c->debug_log_file ? c->debug_log_file : "stderr")); if (c->pmgr.so_path) dbg("PolicyModulePath = %s\n", c->pmgr.so_path); dbg("DefaultBindingAclPolicy = %u\n", c->DefaultBindingAclPolicy); dbg("NonVolatileBindingCache = %s\n", CONF_BOOL_STR(c->NonVolatileBindingCache)); /* IPsec options */ dbg("KeyMngMobCapability = %s\n", CONF_BOOL_STR(c->KeyMngMobCapability)); dbg("UseMnHaIPsec = %s\n", CONF_BOOL_STR(c->UseMnHaIPsec)); /* MN options */ dbg("MnMaxHaBindingLife = %u\n", c->MnMaxHaBindingLife); dbg("MnMaxCnBindingLife = %u\n", c->MnMaxCnBindingLife); dbg("MnRouterProbes = %u\n", c->MnRouterProbes); dbg("MnRouterProbeTimeout = %f\n", tstodsec(c->MnRouterProbeTimeout_ts)); dbg("InitialBindackTimeoutFirstReg = %f\n", tstodsec(c->InitialBindackTimeoutFirstReg_ts)); dbg("InitialBindackTimeoutReReg = %f\n", tstodsec(c->InitialBindackTimeoutReReg_ts)); if (c->MoveModulePath) dbg("MoveModulePath = %s\n", c->MoveModulePath); dbg("UseCnBuAck = %s\n", CONF_BOOL_STR(c->CnBuAck)); dbg("DoRouteOptimizationMN = %s\n", CONF_BOOL_STR(c->DoRouteOptimizationMN)); dbg("MnUseAllInterfaces = %s\n", CONF_BOOL_STR(c->MnUseAllInterfaces)); dbg("MnDiscardHaParamProb = %s\n", CONF_BOOL_STR(c->MnDiscardHaParamProb)); dbg("SendMobPfxSols = %s\n", CONF_BOOL_STR(c->SendMobPfxSols)); dbg("OptimisticHandoff = %s\n", CONF_BOOL_STR(c->OptimisticHandoff)); dbg("MobRtrUseExplicitMode = %s\n", CONF_BOOL_STR(c->MobRtrUseExplicitMode)); /* HA options */ dbg("SendMobPfxAdvs = %s\n", CONF_BOOL_STR(c->SendMobPfxAdvs)); dbg("SendUnsolMobPfxAdvs = %s\n", CONF_BOOL_STR(c->SendUnsolMobPfxAdvs)); dbg("MaxMobPfxAdvInterval = %u\n", c->MaxMobPfxAdvInterval); dbg("MinMobPfxAdvInterval = %u\n", c->MinMobPfxAdvInterval); dbg("HaMaxBindingLife = %u\n", c->HaMaxBindingLife); dbg("HaAcceptMobRtr = %s\n", CONF_BOOL_STR(c->HaAcceptMobRtr)); /* CN options */ dbg("DoRouteOptimizationCN = %s\n", CONF_BOOL_STR(c->DoRouteOptimizationCN)); /* PMIP options */ dbg("RFC5213TimestampBasedApproachInUse = %s\n",CONF_BOOL_STR(c->RFC5213TimestampBasedApproachInUse)); dbg("RFC5213MobileNodeGeneratedTimestampInUse = %s\n",CONF_BOOL_STR(c->RFC5213MobileNodeGeneratedTimestampInUse)); dbg("RFC5213FixedMAGLinkLocalAddressOnAllAccessLinks = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->RFC5213FixedMAGLinkLocalAddressOnAllAccessLinks)); dbg("RFC5213FixedMAGLinkLayerAddressOnAllAccessLinks = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->RFC5213FixedMAGLinkLayerAddressOnAllAccessLinks)); /* PMIP LMA options */ dbg("RFC5213MinDelayBeforeBCEDelete = %u.%9u seconds\n",c->RFC5213MinDelayBeforeBCEDelete.tv_sec,c->RFC5213MinDelayBeforeBCEDelete.tv_nsec); dbg("RFC5213MaxDelayBeforeNewBCEAssign = %u.%9u seconds\n",c->RFC5213MaxDelayBeforeNewBCEAssign.tv_sec,c->RFC5213MaxDelayBeforeNewBCEAssign.tv_nsec); dbg("RFC5213TimestampValidityWindow = %u.%9u seconds\n",c->RFC5213TimestampValidityWindow.tv_sec,c->RFC5213TimestampValidityWindow.tv_nsec); /* PMIP MAG options */ dbg("RFC5213EnableMAGLocalRouting = %s\n", CONF_BOOL_STR(c->RFC5213EnableMAGLocalRouting)); dbg("AllLmaMulticastAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->AllLmaMulticastAddress)); dbg("LmaAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->LmaAddress)); if (is_ha()) { for (i = 0; i < c->NumMags; i++) { dbg("MAG %d: \n", i); dbg(" MagAddressIngress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressIngress[i])); dbg(" MagAddressEgress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressEgress[i])); } } if (is_mag()) { dbg("MagAddressIngress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressIngress[0])); dbg("MagAddressEgress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->MagAddressEgress[0])); dbg("MagDeviceIngress = %s\n", (c->MagDeviceIngress ? c->MagDeviceIngress : "No device")); dbg("MagDeviceEgress = %s\n", (c->MagDeviceEgress ? c->MagDeviceEgress : "No device")); dbg("PBULifeTime = %u.%9u seconds\n",c->PBULifeTime.tv_sec,c->PBULifeTime.tv_nsec); dbg("RetransmissionTimeOut = %u.%9u seconds\n",c->RetransmissionTimeOut.tv_sec,c->RetransmissionTimeOut.tv_nsec); dbg("RadiusClientConfigFile = %s\n", (c->RadiusClientConfigFile ? c->RadiusClientConfigFile : "No Config file")); dbg("RadiusPassword = %s\n", (c->RadiusPassword ? c->RadiusPassword : "******")); dbg("PcapSyslogAssociationGrepString = %s\n", (c->PcapSyslogAssociationGrepString ? c->PcapSyslogAssociationGrepString : "No syslog association grep string")); dbg("PcapSyslogDeAssociationGrepString = %s\n", (c->PcapSyslogDeAssociationGrepString ? c->PcapSyslogDeAssociationGrepString : "No syslog de-association grep string")); } dbg("OurAddress = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->OurAddress)); dbg("HomeNetworkPrefix = %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&c->HomeNetworkPrefix)); dbg("MaxMessageRetransmissions = %u\n", c->MaxMessageRetransmissions); dbg("TunnelingEnabled = %s\n", CONF_BOOL_STR(c->TunnelingEnabled)); dbg("DynamicTunnelingEnabled = %s\n", CONF_BOOL_STR(c->DynamicTunnelingEnabled)); dbg("MaxDelayBeforeDynamicTunnelingDelete = %u.%9u seconds\n",c->MaxDelayBeforeDynamicTunnelingDelete.tv_sec,c->MaxDelayBeforeDynamicTunnelingDelete.tv_nsec); }
//--------------------------------------------------------------------------------------------------------------------- void pmip_timer_bce_expired_handler(struct tq_elem *tqe) { int mutex_return_code; mutex_return_code = pthread_rwlock_wrlock(&pmip_lock); if (mutex_return_code != 0) { dbg("pthread_rwlock_wrlock(&pmip_lock) %s\n", strerror(mutex_return_code)); } printf("-------------------------------------\n"); if (!task_interrupted()) { pmip_entry_t *e = tq_data(tqe, pmip_entry_t, tqe); mutex_return_code = pthread_rwlock_wrlock(&e->lock); if (mutex_return_code != 0) { dbg("pthread_rwlock_wrlock(&e->lock) %s\n", strerror(mutex_return_code)); } dbg("Retransmissions counter : %d\n", e->n_rets_counter); if (e->n_rets_counter == 0) { dbg("Retransmissions counter expired\n"); free_iov_data((struct iovec *) &e->mh_vec, e->iovlen); if (is_mag()) { //++e->seqno_out; dbg("Calling deregistration\n"); mag_dereg(e, 1); pmipcache_release_entry(e); pmip_bce_delete(e); return; } //Delete existing route for the deleted MN if (is_ha()) { lma_dereg(e, 0, 0); pmipcache_release_entry(e); pmip_bce_delete(e); return; } mutex_return_code = pthread_rwlock_unlock(&pmip_lock); if (mutex_return_code != 0) { dbg("pthread_rwlock_unlock(&pmip_lock) %s\n", strerror(mutex_return_code)); } return; } if (is_mag()) { dbg("Send NS for Neighbour Reachability for:%x:%x:%x:%x:%x:%x:%x:%x iif=%d\n", NIP6ADDR(&e->mn_hw_address), e->link); //Create NS for Reachability test! //ndisc_send_ns(e->link, &conf.MagAddressIngress[0], solicited_mcast(&e->mn_suffix), get_mn_addr(e)); ndisc_send_ns(e->link, get_mn_addr(e)); struct timespec expires; clock_gettime(CLOCK_REALTIME, &e->add_time); tsadd(e->add_time, conf.RetransmissionTimeOut, expires); // Add a new task for deletion of entry if No Na is received. add_task_abs(&expires, &e->tqe, pmip_timer_bce_expired_handler); dbg("Start the Timer for Retransmission/Deletion ....\n"); //Decrements the Retransmissions counter. e->n_rets_counter--; mutex_return_code = pthread_rwlock_unlock(&e->lock); if (mutex_return_code != 0) { dbg("pthread_rwlock_unlock(&e->lock) %s\n", strerror(mutex_return_code)); } } if (is_ha()) { lma_dereg(e, 0, 0); pmipcache_release_entry(e); pmip_bce_delete(e); return; } } mutex_return_code = pthread_rwlock_unlock(&pmip_lock); if (mutex_return_code != 0) { dbg("pthread_rwlock_unlock(&pmip_lock) %s\n", strerror(mutex_return_code)); } }