static void conf_default(struct mip6_config *c) { memset(c, 0, sizeof(*c)); /* Common options */ #ifdef ENABLE_VT c->vt_hostname = VT_DEFAULT_HOSTNAME; c->vt_service = VT_DEFAULT_SERVICE; #endif c->mip6_entity = MIP6_ENTITY_CN; pmgr_init(NULL, &conf.pmgr); INIT_LIST_HEAD(&c->net_ifaces); INIT_LIST_HEAD(&c->bind_acl); c->DefaultBindingAclPolicy = IP6_MH_BAS_ACCEPTED; /* IPsec options */ c->UseMnHaIPsec = 1; INIT_LIST_HEAD(&c->ipsec_policies); /* MN options */ c->MnMaxHaBindingLife = MAX_BINDING_LIFETIME; c->MnMaxCnBindingLife = MAX_RR_BINDING_LIFETIME; tssetdsec(c->InitialBindackTimeoutFirstReg_ts, 1.5);/*seconds*/ tssetsec(c->InitialBindackTimeoutReReg_ts, INITIAL_BINDACK_TIMEOUT);/*seconds*/ INIT_LIST_HEAD(&c->home_addrs); c->MoveModulePath = NULL; /* internal */ c->DoRouteOptimizationMN = 1; c->SendMobPfxSols = 1; c->OptimisticHandoff = 0; /* HA options */ c->SendMobPfxAdvs = 1; c->SendUnsolMobPfxAdvs = 1; c->MaxMobPfxAdvInterval = 86400; /* seconds */ c->MinMobPfxAdvInterval = 600; /* seconds */ c->HaMaxBindingLife = MAX_BINDING_LIFETIME; /* CN bindings */ c->DoRouteOptimizationCN = 1; }
static void conf_default(struct mip6_config *c) { int i; memset(c, 0, sizeof(*c)); /* Common options */ #ifdef ENABLE_VT c->vt_hostname = VT_DEFAULT_HOSTNAME; c->vt_service = VT_DEFAULT_SERVICE; #endif c->mip6_entity = MIP6_ENTITY_CN; pmgr_init(NULL, &conf.pmgr); INIT_LIST_HEAD(&c->net_ifaces); INIT_LIST_HEAD(&c->bind_acl); c->DefaultBindingAclPolicy = IP6_MH_BAS_ACCEPTED; /* IPsec options */ c->UseMnHaIPsec = 1; INIT_LIST_HEAD(&c->ipsec_policies); /* MN options */ c->MnMaxHaBindingLife = MAX_BINDING_LIFETIME; c->MnMaxCnBindingLife = MAX_RR_BINDING_LIFETIME; tssetdsec(c->InitialBindackTimeoutFirstReg_ts, 1.5);/*seconds*/ tssetsec(c->InitialBindackTimeoutReReg_ts, INITIAL_BINDACK_TIMEOUT);/*seconds*/ INIT_LIST_HEAD(&c->home_addrs); c->MoveModulePath = NULL; /* internal */ c->DoRouteOptimizationMN = 1; c->MobRtrUseExplicitMode = 1; c->SendMobPfxSols = 1; c->OptimisticHandoff = 0; /* HA options */ c->SendMobPfxAdvs = 1; c->SendUnsolMobPfxAdvs = 1; c->MaxMobPfxAdvInterval = 86400; /* seconds */ c->MinMobPfxAdvInterval = 600; /* seconds */ c->HaMaxBindingLife = MAX_BINDING_LIFETIME; INIT_LIST_HEAD(&c->nemo_ha_served_prefixes); /* PMIP global options */ c->RFC5213TimestampBasedApproachInUse = 1; c->RFC5213MobileNodeGeneratedTimestampInUse = 1; c->RFC5213FixedMAGLinkLocalAddressOnAllAccessLinks = in6addr_any; c->RFC5213FixedMAGLinkLayerAddressOnAllAccessLinks = in6addr_any; struct timespec lifetime_tunnels; lifetime_tunnels.tv_sec = 60; lifetime_tunnels.tv_nsec = 0; c->MaxDelayBeforeDynamicTunnelingDelete = lifetime_tunnels; // 60000 milliseconds /* PMIP LMA options */ struct timespec lifetime1; lifetime1.tv_sec = 10; lifetime1.tv_nsec = 0; c->RFC5213MinDelayBeforeBCEDelete = lifetime1; // 10000 milliseconds struct timespec lifetime2; lifetime2.tv_sec = 1; lifetime2.tv_nsec = 500000000; c->RFC5213MaxDelayBeforeNewBCEAssign = lifetime2; // 1500 milliseconds struct timespec lifetime3; lifetime3.tv_sec = 0; lifetime3.tv_nsec = 300000000; c->RFC5213TimestampValidityWindow = lifetime3; // 300 milliseconds /* CN bindings */ c->DoRouteOptimizationCN = 1; /* PMIP MAG options */ c->RFC5213EnableMAGLocalRouting = 0; c->HomeNetworkPrefix = in6addr_any; c->NumMags = 0; for (i = 0; i < PMIP_MAX_MAGS; i++) { c->MagAddressIngress[i] = in6addr_loopback; c->MagAddressEgress[i] = in6addr_loopback; } c->MagDeviceIngress = ""; c->MagDeviceEgress = ""; c->LmaAddress = in6addr_loopback; c->OurAddress = in6addr_loopback; //Lifetime for PB entry struct timespec lifetime4; lifetime4.tv_sec = 40; lifetime4.tv_nsec = 0; c->PBULifeTime = lifetime4; struct timespec lifetime5; lifetime5.tv_sec = 40; lifetime5.tv_nsec = 0; c->PBALifeTime = lifetime5; //Time for N_Retransmissions struct timespec lifetime6; lifetime6.tv_sec = 1; lifetime6.tv_nsec = 0; c->RetransmissionTimeOut = lifetime6; //Define the maximum # of message retransmissions. int Max_rets = 5; c->MaxMessageRetransmissions = Max_rets; c->TunnelingEnabled = 0; c->DynamicTunnelingEnabled = 0; c->RadiusClientConfigFile = ""; c->RadiusPassword = ""; }
/* static void conf_default(struct mip6_config *c) { memset(c, 0, sizeof(*c)); // Common options #ifdef ENABLE_VT c->vt_hostname = VT_DEFAULT_HOSTNAME; c->vt_service = VT_DEFAULT_SERVICE; #endif c->mip6_entity = MIP6_ENTITY_CN; pmgr_init(NULL, &conf.pmgr); INIT_LIST_HEAD(&c->net_ifaces); INIT_LIST_HEAD(&c->bind_acl); c->DefaultBindingAclPolicy = IP6_MH_BAS_ACCEPTED; // IPsec options c->UseMnHaIPsec = 1; INIT_LIST_HEAD(&c->ipsec_policies); // MN options c->MnMaxHaBindingLife = MAX_BINDING_LIFETIME; c->MnMaxCnBindingLife = MAX_RR_BINDING_LIFETIME; tssetdsec(c->InitialBindackTimeoutFirstReg_ts, 1.5);//seconds tssetsec(c->InitialBindackTimeoutReReg_ts, INITIAL_BINDACK_TIMEOUT);//seconds INIT_LIST_HEAD(&c->home_addrs); c->MoveModulePath = NULL; // internal c->DoRouteOptimizationMN = 1; c->SendMobPfxSols = 1; c->OptimisticHandoff = 0; // HA options c->SendMobPfxAdvs = 1; c->SendUnsolMobPfxAdvs = 1; c->MaxMobPfxAdvInterval = 86400; // seconds c->MinMobPfxAdvInterval = 600; // seconds c->HaMaxBindingLife = MAX_BINDING_LIFETIME; // CN bindings c->DoRouteOptimizationCN = 1; } */ static void conf_default(struct mip6_config *c) { memset(c, 0, sizeof(*c)); // Common options #ifdef ENABLE_VT c->vt_hostname = VT_DEFAULT_HOSTNAME; c->vt_service = VT_DEFAULT_SERVICE; #endif c->mip6_entity = MIP6_ENTITY_CN; pmgr_init(NULL, &conf.pmgr); INIT_LIST_HEAD(&c->net_ifaces); INIT_LIST_HEAD(&c->bind_acl); c->DefaultBindingAclPolicy = IP6_MH_BAS_ACCEPTED; // IPsec options c->UseMnHaIPsec = 0; INIT_LIST_HEAD(&c->ipsec_policies); // MN options c->MnMaxHaBindingLife = MAX_BINDING_LIFETIME; c->MnMaxCnBindingLife = MAX_RR_BINDING_LIFETIME; tssetdsec(c->InitialBindackTimeoutFirstReg_ts, 1.5);//seconds tssetsec(c->InitialBindackTimeoutReReg_ts, INITIAL_BINDACK_TIMEOUT);//seconds INIT_LIST_HEAD(&c->home_addrs); c->MoveModulePath = NULL; // internal c->DoRouteOptimizationMN = 1; c->SendMobPfxSols = 1; c->OptimisticHandoff = 0; // HA options c->SendMobPfxAdvs = 1; c->SendUnsolMobPfxAdvs = 1; c->MaxMobPfxAdvInterval = 86400; // seconds c->MinMobPfxAdvInterval = 600; // seconds c->HaMaxBindingLife = MAX_BINDING_LIFETIME; // CN bindings c->DoRouteOptimizationCN = 1; //Default Values for variables. c->HomeNetworkPrefix = in6addr_any; c->MagAddressIngress = in6addr_loopback; c->MagAddressEgress = in6addr_loopback; c->LmaAddress = in6addr_loopback; c->OurAddress = in6addr_loopback; //Lifetime for PB entry struct timespec lifetime1; //15 sec //lifetime1.tv_sec = 60; lifetime1.tv_sec = 1000; lifetime1.tv_nsec = 0; c->PBULifeTime = lifetime1; struct timespec lifetime2; //15 sec //lifetime2.tv_sec = 30; lifetime2.tv_sec = 1000; lifetime2.tv_nsec = 0; c->PBALifeTime = lifetime2; //Time for N_Retransmissions struct timespec lifetime3; // 0.5 sec lifetime3.tv_sec = 5; lifetime3.tv_nsec = 0; c->NRetransmissionTime = lifetime3; //Define the maximum # of message retransmissions. int Max_rets = 5; c->MaxMessageRetransmissions = Max_rets; c->TunnelingEnabled = 0; c->DynamicTunnelingEnabled = 0; c->RadiusClientConfigFile = ""; c->RadiusPassword = ""; }
int mh_bu_parse(struct ip6_mh_binding_update *bu, ssize_t len, const struct in6_addr_bundle *in_addrs, struct in6_addr_bundle *out_addrs, struct mh_options *mh_opts, struct timespec *lifetime, uint8_t *key) { struct in6_addr *our_addr, *peer_addr, *remote_coa; struct ip6_mh_opt_altcoa *alt_coa; struct ip6_mh_opt_nonce_index *non_ind; struct ip6_mh_opt_auth_data *bauth; uint16_t bu_flags; int ret; MDBG("Binding Update Received\n"); if (len < sizeof(struct ip6_mh_binding_update) || mh_opt_parse(&bu->ip6mhbu_hdr, len, sizeof(struct ip6_mh_binding_update), mh_opts) < 0) return -1; peer_addr = in_addrs->src; if (!in6_is_addr_routable_unicast(peer_addr)) return -1; remote_coa = in_addrs->remote_coa; if (remote_coa && !IN6_ARE_ADDR_EQUAL(remote_coa, peer_addr)) out_addrs->remote_coa = remote_coa; else out_addrs->remote_coa = NULL; alt_coa = mh_opt(&bu->ip6mhbu_hdr, mh_opts, IP6_MHOPT_ALTCOA); if (alt_coa) out_addrs->bind_coa = &alt_coa->ip6moa_addr; else out_addrs->bind_coa = in_addrs->remote_coa; our_addr = in_addrs->dst; tsclear(*lifetime); if (out_addrs->bind_coa) { if (!in6_is_addr_routable_unicast(out_addrs->bind_coa)) return -1; if (!IN6_ARE_ADDR_EQUAL(out_addrs->bind_coa, peer_addr)) { /* check that there is no circular reference */ if (bce_exists(our_addr, out_addrs->bind_coa)) return -1; tssetsec(*lifetime, ntohs(bu->ip6mhbu_lifetime) << 2); } } /* Use Home address of MN for calculating BU and BA auth data * for deregs. */ if (!out_addrs->bind_coa) out_addrs->bind_coa = in_addrs->src; bu_flags = bu->ip6mhbu_flags; out_addrs->src = in_addrs->dst; out_addrs->dst = in_addrs->src; out_addrs->local_coa = NULL; non_ind = mh_opt(&bu->ip6mhbu_hdr, mh_opts, IP6_MHOPT_NONCEID); if (bu_flags & IP6_MH_BU_HOME) return non_ind ? -1 : 0; if (!non_ind) return -1; MDBG("src %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(peer_addr)); MDBG("coa %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(out_addrs->bind_coa)); if (tsisset(*lifetime)) ret = rr_cn_calc_Kbm(ntohs(non_ind->ip6moni_home_nonce), ntohs(non_ind->ip6moni_coa_nonce), peer_addr, out_addrs->bind_coa, key); else /* Only use home nonce and address for dereg. */ ret = rr_cn_calc_Kbm(ntohs(non_ind->ip6moni_home_nonce), 0, peer_addr, NULL, key); if (ret) return ret; bauth = mh_opt(&bu->ip6mhbu_hdr, mh_opts, IP6_MHOPT_BAUTH); if (!bauth) return -1; /* Authenticator is calculated with MH checksum set to 0 */ bu->ip6mhbu_hdr.ip6mh_cksum = 0; if (mh_verify_auth_data(bu, len, bauth, out_addrs->bind_coa, our_addr, key) < 0) return -1; return IP6_MH_BAS_ACCEPTED; }