Lines Matching +full:cfg +full:-
1 /*-
70 static void nptv6_free_config(struct nptv6_cfg *cfg);
73 static int nptv6_rewrite_internal(struct nptv6_cfg *cfg, struct mbuf **mp,
75 static int nptv6_rewrite_external(struct nptv6_cfg *cfg, struct mbuf **mp,
79 (struct nptv6_cfg *)SRV_OBJECT((chain), insntod(cmd, kidx)->kidx)
83 (a)->s6_addr32[0] &= (m)->s6_addr32[0]; \
84 (a)->s6_addr32[1] &= (m)->s6_addr32[1]; \
85 (a)->s6_addr32[2] &= (m)->s6_addr32[2]; \
86 (a)->s6_addr32[3] &= (m)->s6_addr32[3]; \
91 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
92 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
93 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
94 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
111 nptv6_getlasthdr(struct nptv6_cfg *cfg, struct mbuf *m, int *offset) in nptv6_getlasthdr() argument
118 if (m->m_len < hlen) in nptv6_getlasthdr()
119 return (-1); in nptv6_getlasthdr()
122 proto = ip6->ip6_nxt; in nptv6_getlasthdr()
126 if (m->m_len < hlen) in nptv6_getlasthdr()
127 return (-1); in nptv6_getlasthdr()
128 proto = hbh->ip6h_nxt; in nptv6_getlasthdr()
129 hlen += (hbh->ip6h_len + 1) << 3; in nptv6_getlasthdr()
137 nptv6_translate_icmpv6(struct nptv6_cfg *cfg, struct mbuf **mp, int offset) in nptv6_translate_icmpv6() argument
144 if (offset > m->m_len) in nptv6_translate_icmpv6()
145 return (-1); in nptv6_translate_icmpv6()
147 NPTV6_DEBUG("ICMPv6 type %d", icmp6->icmp6_type); in nptv6_translate_icmpv6()
148 switch (icmp6->icmp6_type) { in nptv6_translate_icmpv6()
164 return (-1); in nptv6_translate_icmpv6()
167 if (offset + sizeof(*ip6) > m->m_pkthdr.len) in nptv6_translate_icmpv6()
168 return (-1); in nptv6_translate_icmpv6()
169 if (offset + sizeof(*ip6) > m->m_len) in nptv6_translate_icmpv6()
172 return (-1); in nptv6_translate_icmpv6()
174 NPTV6_IPDEBUG("offset %d, %s -> %s %d", offset, in nptv6_translate_icmpv6()
175 inet_ntop(AF_INET6, &ip6->ip6_src, _s, sizeof(_s)), in nptv6_translate_icmpv6()
176 inet_ntop(AF_INET6, &ip6->ip6_dst, _d, sizeof(_d)), in nptv6_translate_icmpv6()
177 ip6->ip6_nxt); in nptv6_translate_icmpv6()
178 if (IN6_ARE_MASKED_ADDR_EQUAL(&ip6->ip6_src, in nptv6_translate_icmpv6()
179 &cfg->external, &cfg->mask)) in nptv6_translate_icmpv6()
180 return (nptv6_rewrite_external(cfg, mp, offset)); in nptv6_translate_icmpv6()
181 else if (IN6_ARE_MASKED_ADDR_EQUAL(&ip6->ip6_dst, in nptv6_translate_icmpv6()
182 &cfg->internal, &cfg->mask)) in nptv6_translate_icmpv6()
183 return (nptv6_rewrite_internal(cfg, mp, offset)); in nptv6_translate_icmpv6()
188 return (-1); in nptv6_translate_icmpv6()
192 nptv6_search_index(struct nptv6_cfg *cfg, struct in6_addr *a) in nptv6_search_index() argument
196 if (cfg->flags & NPTV6_48PLEN) in nptv6_search_index()
201 if (a->s6_addr16[idx] != 0xffff) in nptv6_search_index()
205 * an IID of all-zeros while performing address mapping, that in nptv6_search_index()
210 (a->s6_addr32[2] == 0 && a->s6_addr32[3] == 0)) in nptv6_search_index()
211 return (-1); in nptv6_search_index()
221 for (i = 0; i < 8 && mask->s6_addr8[i] != 0; i++) { in nptv6_copy_addr()
222 dst->s6_addr8[i] &= ~mask->s6_addr8[i]; in nptv6_copy_addr()
223 dst->s6_addr8[i] |= src->s6_addr8[i] & mask->s6_addr8[i]; in nptv6_copy_addr()
228 nptv6_rewrite_internal(struct nptv6_cfg *cfg, struct mbuf **mp, int offset) in nptv6_rewrite_internal() argument
236 NPTV6_IPDEBUG("offset %d, %s -> %s %d", offset, in nptv6_rewrite_internal()
237 inet_ntop(AF_INET6, &ip6->ip6_src, _s, sizeof(_s)), in nptv6_rewrite_internal()
238 inet_ntop(AF_INET6, &ip6->ip6_dst, _d, sizeof(_d)), in nptv6_rewrite_internal()
239 ip6->ip6_nxt); in nptv6_rewrite_internal()
241 addr = &ip6->ip6_src; in nptv6_rewrite_internal()
249 addr = &ip6->ip6_dst; in nptv6_rewrite_internal()
251 idx = nptv6_search_index(cfg, addr); in nptv6_rewrite_internal()
260 ICMP6_DST_UNREACH_ADDR, 0, (*mp)->m_pkthdr.rcvif); in nptv6_rewrite_internal()
265 adj = addr->s6_addr16[idx]; in nptv6_rewrite_internal()
266 nptv6_copy_addr(&cfg->external, addr, &cfg->mask); in nptv6_rewrite_internal()
267 adj = cksum_add(adj, cfg->adjustment); in nptv6_rewrite_internal()
270 addr->s6_addr16[idx] = adj; in nptv6_rewrite_internal()
276 proto = nptv6_getlasthdr(cfg, *mp, &offset); in nptv6_rewrite_internal()
278 nptv6_translate_icmpv6(cfg, mp, offset) != 0)) in nptv6_rewrite_internal()
280 NPTV6STAT_INC(cfg, in2ex); in nptv6_rewrite_internal()
286 nptv6_rewrite_external(struct nptv6_cfg *cfg, struct mbuf **mp, int offset) in nptv6_rewrite_external() argument
294 NPTV6_IPDEBUG("offset %d, %s -> %s %d", offset, in nptv6_rewrite_external()
295 inet_ntop(AF_INET6, &ip6->ip6_src, _s, sizeof(_s)), in nptv6_rewrite_external()
296 inet_ntop(AF_INET6, &ip6->ip6_dst, _d, sizeof(_d)), in nptv6_rewrite_external()
297 ip6->ip6_nxt); in nptv6_rewrite_external()
299 addr = &ip6->ip6_dst; in nptv6_rewrite_external()
307 addr = &ip6->ip6_src; in nptv6_rewrite_external()
309 idx = nptv6_search_index(cfg, addr); in nptv6_rewrite_external()
318 ICMP6_DST_UNREACH_ADDR, 0, (*mp)->m_pkthdr.rcvif); in nptv6_rewrite_external()
323 adj = addr->s6_addr16[idx]; in nptv6_rewrite_external()
324 nptv6_copy_addr(&cfg->internal, addr, &cfg->mask); in nptv6_rewrite_external()
325 adj = cksum_add(adj, ~cfg->adjustment); in nptv6_rewrite_external()
328 addr->s6_addr16[idx] = adj; in nptv6_rewrite_external()
334 proto = nptv6_getlasthdr(cfg, *mp, &offset); in nptv6_rewrite_external()
336 nptv6_translate_icmpv6(cfg, mp, offset) != 0)) in nptv6_rewrite_external()
338 NPTV6STAT_INC(cfg, ex2in); in nptv6_rewrite_external()
351 struct nptv6_cfg *cfg; in ipfw_nptv6() local
358 if (cmd->opcode != O_EXTERNAL_ACTION || in ipfw_nptv6()
359 insntod(cmd, kidx)->kidx != V_nptv6_eid || in ipfw_nptv6()
360 icmd->opcode != O_EXTERNAL_INSTANCE || in ipfw_nptv6()
361 (cfg = NPTV6_LOOKUP(chain, icmd)) == NULL || in ipfw_nptv6()
362 (cfg->flags & NPTV6_READY) == 0) in ipfw_nptv6()
365 * We need act as router, so when forwarding is disabled - in ipfw_nptv6()
368 if (V_ip6_forwarding == 0 || args->f_id.addr_type != 6) in ipfw_nptv6()
375 ip6 = mtod(args->m, struct ip6_hdr *); in ipfw_nptv6()
376 NPTV6_IPDEBUG("eid %u, oid %u, %s -> %s %d", in ipfw_nptv6()
377 insntod(cmd, kidx)->kidx, insntod(icmd, kidx)->kidx, in ipfw_nptv6()
378 inet_ntop(AF_INET6, &ip6->ip6_src, _s, sizeof(_s)), in ipfw_nptv6()
379 inet_ntop(AF_INET6, &ip6->ip6_dst, _d, sizeof(_d)), in ipfw_nptv6()
380 ip6->ip6_nxt); in ipfw_nptv6()
381 if (IN6_ARE_MASKED_ADDR_EQUAL(&ip6->ip6_src, in ipfw_nptv6()
382 &cfg->internal, &cfg->mask)) { in ipfw_nptv6()
387 if (IN6_ARE_MASKED_ADDR_EQUAL(&ip6->ip6_dst, in ipfw_nptv6()
388 &cfg->internal, &cfg->mask)) in ipfw_nptv6()
390 ret = nptv6_rewrite_internal(cfg, &args->m, 0); in ipfw_nptv6()
391 } else if (IN6_ARE_MASKED_ADDR_EQUAL(&ip6->ip6_dst, in ipfw_nptv6()
392 &cfg->external, &cfg->mask)) in ipfw_nptv6()
393 ret = nptv6_rewrite_external(cfg, &args->m, 0); in ipfw_nptv6()
397 * If address wasn't rewrited - free mbuf and terminate the search. in ipfw_nptv6()
400 if (args->m != NULL) { in ipfw_nptv6()
401 m_freem(args->m); in ipfw_nptv6()
402 args->m = NULL; /* mark mbuf as consumed */ in ipfw_nptv6()
404 NPTV6STAT_INC(cfg, dropped); in ipfw_nptv6()
409 /* Update args->f_id when one_pass is off */ in ipfw_nptv6()
411 ip6 = mtod(args->m, struct ip6_hdr *); in ipfw_nptv6()
412 args->f_id.src_ip6 = ip6->ip6_src; in ipfw_nptv6()
413 args->f_id.dst_ip6 = ip6->ip6_dst; in ipfw_nptv6()
422 struct nptv6_cfg *cfg; in nptv6_alloc_config() local
424 cfg = malloc(sizeof(struct nptv6_cfg), M_IPFW, M_WAITOK | M_ZERO); in nptv6_alloc_config()
425 COUNTER_ARRAY_ALLOC(cfg->stats, NPTV6STATS, M_WAITOK); in nptv6_alloc_config()
426 cfg->no.name = cfg->name; in nptv6_alloc_config()
427 cfg->no.etlv = IPFW_TLV_NPTV6_NAME; in nptv6_alloc_config()
428 cfg->no.set = set; in nptv6_alloc_config()
429 strlcpy(cfg->name, name, sizeof(cfg->name)); in nptv6_alloc_config()
430 return (cfg); in nptv6_alloc_config()
434 nptv6_free_config(struct nptv6_cfg *cfg) in nptv6_free_config() argument
437 COUNTER_ARRAY_FREE(cfg->stats, NPTV6STATS); in nptv6_free_config()
438 free(cfg, M_IPFW); in nptv6_free_config()
442 nptv6_export_config(struct ip_fw_chain *ch, struct nptv6_cfg *cfg, in nptv6_export_config() argument
446 uc->internal = cfg->internal; in nptv6_export_config()
447 if (cfg->flags & NPTV6_DYNAMIC_PREFIX) in nptv6_export_config()
448 memcpy(uc->if_name, cfg->if_name, IF_NAMESIZE); in nptv6_export_config()
450 uc->external = cfg->external; in nptv6_export_config()
451 uc->plen = cfg->plen; in nptv6_export_config()
452 uc->flags = cfg->flags & NPTV6_FLAGSMASK; in nptv6_export_config()
453 uc->set = cfg->no.set; in nptv6_export_config()
454 strlcpy(uc->name, cfg->no.name, sizeof(uc->name)); in nptv6_export_config()
469 uc = (ipfw_nptv6_cfg *)ipfw_get_sopt_space(da->sd, sizeof(*uc)); in export_config_cb()
470 nptv6_export_config(da->ch, (struct nptv6_cfg *)no, uc); in export_config_cb()
477 struct nptv6_cfg *cfg; in nptv6_find() local
479 cfg = (struct nptv6_cfg *)ipfw_objhash_lookup_name_type(ni, set, in nptv6_find()
482 return (cfg); in nptv6_find()
486 nptv6_calculate_adjustment(struct nptv6_cfg *cfg) in nptv6_calculate_adjustment() argument
492 for (i = 0, p = (uint16_t *)&cfg->internal; in nptv6_calculate_adjustment()
493 p < (uint16_t *)(&cfg->internal + 1); p++) in nptv6_calculate_adjustment()
497 for (e = 0, p = (uint16_t *)&cfg->external; in nptv6_calculate_adjustment()
498 p < (uint16_t *)(&cfg->external + 1); p++) in nptv6_calculate_adjustment()
501 /* Adjustment value for Int->Ext direction */ in nptv6_calculate_adjustment()
502 cfg->adjustment = cksum_add(~e, i); in nptv6_calculate_adjustment()
518 nptv6_set_external(struct nptv6_cfg *cfg, struct in6_addr *addr) in nptv6_set_external() argument
521 cfg->external = *addr; in nptv6_set_external()
522 IN6_MASK_ADDR(&cfg->external, &cfg->mask); in nptv6_set_external()
523 nptv6_calculate_adjustment(cfg); in nptv6_set_external()
524 cfg->flags |= NPTV6_READY; in nptv6_set_external()
532 nptv6_find_prefix(struct ip_fw_chain *ch, struct nptv6_cfg *cfg, in nptv6_find_prefix() argument
539 MPASS(cfg->flags & NPTV6_DYNAMIC_PREFIX); in nptv6_find_prefix()
543 ifp = ifunit_ref(cfg->if_name); in nptv6_find_prefix()
548 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in nptv6_find_prefix()
549 if (ifa->ifa_addr->sa_family != AF_INET6) in nptv6_find_prefix()
552 if (nptv6_check_prefix(&ia->ia_addr.sin6_addr) || in nptv6_find_prefix()
553 IN6_ARE_MASKED_ADDR_EQUAL(&ia->ia_addr.sin6_addr, in nptv6_find_prefix()
554 &cfg->internal, &cfg->mask)) in nptv6_find_prefix()
557 nptv6_set_external(cfg, &ia->ia_addr.sin6_addr); in nptv6_find_prefix()
576 struct nptv6_cfg *cfg; in ifaddr_cb() local
579 cfg = (struct nptv6_cfg *)SRV_OBJECT(ch, no->kidx); in ifaddr_cb()
580 if ((cfg->flags & NPTV6_DYNAMIC_PREFIX) == 0) in ifaddr_cb()
585 if (strncmp(args->ifp->if_xname, cfg->if_name, IF_NAMESIZE)) in ifaddr_cb()
587 if (args->ifp->if_flags & IFF_DYING) { /* XXX: is it possible? */ in ifaddr_cb()
588 cfg->flags &= ~NPTV6_READY; in ifaddr_cb()
591 if (args->event == IFADDR_EVENT_DEL) { in ifaddr_cb()
593 if ((cfg->flags & NPTV6_READY) == 0) in ifaddr_cb()
596 if (IN6_ARE_MASKED_ADDR_EQUAL(&cfg->external, args->addr, in ifaddr_cb()
597 &cfg->mask) != 0) in ifaddr_cb()
600 cfg->flags &= ~NPTV6_READY; in ifaddr_cb()
603 if (cfg->flags & NPTV6_READY) in ifaddr_cb()
606 if (nptv6_check_prefix(args->addr) || in ifaddr_cb()
607 IN6_ARE_MASKED_ADDR_EQUAL(args->addr, &cfg->internal, in ifaddr_cb()
608 &cfg->mask)) in ifaddr_cb()
612 MPASS(!(cfg->flags & NPTV6_READY)); in ifaddr_cb()
614 if_ref(args->ifp); in ifaddr_cb()
615 nptv6_find_prefix(ch, cfg, args->ifp); in ifaddr_cb()
626 if (ifa->ifa_addr->sa_family != AF_INET6) in nptv6_ifaddrevent_handler()
630 args.addr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; in nptv6_ifaddrevent_handler()
655 struct nptv6_cfg *cfg; in nptv6_create() local
657 if (sd->valsize != sizeof(*olh) + sizeof(*uc)) in nptv6_create()
660 olh = (ipfw_obj_lheader *)sd->kbuf; in nptv6_create()
662 if (ipfw_check_object_name_generic(uc->name) != 0) in nptv6_create()
664 if (uc->plen < 8 || uc->plen > 64 || uc->set >= IPFW_MAX_SETS) in nptv6_create()
666 if (nptv6_check_prefix(&uc->internal)) in nptv6_create()
668 in6_prefixlen2mask(&mask, uc->plen); in nptv6_create()
669 if ((uc->flags & NPTV6_DYNAMIC_PREFIX) == 0 && ( in nptv6_create()
670 nptv6_check_prefix(&uc->external) || in nptv6_create()
671 IN6_ARE_MASKED_ADDR_EQUAL(&uc->external, &uc->internal, &mask))) in nptv6_create()
676 if (nptv6_find(ni, uc->name, uc->set) != NULL) { in nptv6_create()
682 cfg = nptv6_alloc_config(uc->name, uc->set); in nptv6_create()
683 cfg->plen = uc->plen; in nptv6_create()
684 cfg->flags = uc->flags & NPTV6_FLAGSMASK; in nptv6_create()
685 if (cfg->plen <= 48) in nptv6_create()
686 cfg->flags |= NPTV6_48PLEN; in nptv6_create()
687 cfg->mask = mask; in nptv6_create()
688 cfg->internal = uc->internal; in nptv6_create()
689 IN6_MASK_ADDR(&cfg->internal, &mask); in nptv6_create()
690 if (cfg->flags & NPTV6_DYNAMIC_PREFIX) in nptv6_create()
691 memcpy(cfg->if_name, uc->if_name, IF_NAMESIZE); in nptv6_create()
693 nptv6_set_external(cfg, &uc->external); in nptv6_create()
695 if ((uc->flags & NPTV6_DYNAMIC_PREFIX) != 0 && in nptv6_create()
702 if (ipfw_objhash_alloc_idx(ni, &cfg->no.kidx) != 0) { in nptv6_create()
704 nptv6_free_config(cfg); in nptv6_create()
707 ipfw_objhash_add(ni, &cfg->no); in nptv6_create()
708 SRV_OBJECT(ch, cfg->no.kidx) = cfg; in nptv6_create()
709 if (cfg->flags & NPTV6_DYNAMIC_PREFIX) in nptv6_create()
710 nptv6_find_prefix(ch, cfg, NULL); in nptv6_create()
728 struct nptv6_cfg *cfg; in nptv6_destroy() local
730 if (sd->valsize != sizeof(*oh)) in nptv6_destroy()
733 oh = (ipfw_obj_header *)sd->kbuf; in nptv6_destroy()
734 if (ipfw_check_object_name_generic(oh->ntlv.name) != 0) in nptv6_destroy()
738 cfg = nptv6_find(CHAIN_TO_SRV(ch), oh->ntlv.name, oh->ntlv.set); in nptv6_destroy()
739 if (cfg == NULL) { in nptv6_destroy()
743 if (cfg->no.refcnt > 0) { in nptv6_destroy()
748 ipfw_reset_eaction_instance(ch, V_nptv6_eid, cfg->no.kidx); in nptv6_destroy()
749 SRV_OBJECT(ch, cfg->no.kidx) = NULL; in nptv6_destroy()
750 ipfw_objhash_del(CHAIN_TO_SRV(ch), &cfg->no); in nptv6_destroy()
751 ipfw_objhash_free_idx(CHAIN_TO_SRV(ch), cfg->no.kidx); in nptv6_destroy()
754 nptv6_free_config(cfg); in nptv6_destroy()
786 if (sd->valsize < sizeof(ipfw_obj_lheader)) in nptv6_list()
792 olh->count = ipfw_objhash_count_type(CHAIN_TO_SRV(ch), in nptv6_list()
794 olh->objsize = sizeof(ipfw_nptv6_cfg); in nptv6_list()
795 olh->size = sizeof(*olh) + olh->count * olh->objsize; in nptv6_list()
797 if (sd->valsize < olh->size) { in nptv6_list()
812 (_stats)->_field = NPTV6STAT_FETCH(_cfg, _field)
814 export_stats(struct ip_fw_chain *ch, struct nptv6_cfg *cfg, in export_stats() argument
818 __COPY_STAT_FIELD(cfg, stats, in2ex); in export_stats()
819 __COPY_STAT_FIELD(cfg, stats, ex2in); in export_stats()
820 __COPY_STAT_FIELD(cfg, stats, dropped); in export_stats()
836 struct nptv6_cfg *cfg; in nptv6_stats() local
842 if (sd->valsize % sizeof(uint64_t)) in nptv6_stats()
844 if (sd->valsize < sz) in nptv6_stats()
849 if (ipfw_check_object_name_generic(oh->ntlv.name) != 0 || in nptv6_stats()
850 oh->ntlv.set >= IPFW_MAX_SETS) in nptv6_stats()
855 cfg = nptv6_find(CHAIN_TO_SRV(ch), oh->ntlv.name, oh->ntlv.set); in nptv6_stats()
856 if (cfg == NULL) { in nptv6_stats()
860 export_stats(ch, cfg, &stats); in nptv6_stats()
865 ctlv->head.type = IPFW_TLV_COUNTERS; in nptv6_stats()
866 ctlv->head.length = sz - sizeof(ipfw_obj_header); in nptv6_stats()
867 ctlv->count = sizeof(stats) / sizeof(uint64_t); in nptv6_stats()
868 ctlv->objsize = sizeof(uint64_t); in nptv6_stats()
869 ctlv->version = 1; in nptv6_stats()
885 struct nptv6_cfg *cfg; in nptv6_reset_stats() local
888 if (sd->valsize != sizeof(*oh)) in nptv6_reset_stats()
890 oh = (ipfw_obj_header *)sd->kbuf; in nptv6_reset_stats()
891 if (ipfw_check_object_name_generic(oh->ntlv.name) != 0 || in nptv6_reset_stats()
892 oh->ntlv.set >= IPFW_MAX_SETS) in nptv6_reset_stats()
896 cfg = nptv6_find(CHAIN_TO_SRV(ch), oh->ntlv.name, oh->ntlv.set); in nptv6_reset_stats()
897 if (cfg == NULL) { in nptv6_reset_stats()
901 COUNTER_ARRAY_ZERO(cfg->stats, NPTV6STATS); in nptv6_reset_stats()
920 icmd = cmd0 - F_LEN(cmd0); in nptv6_classify()
922 cmd->opcode, insntod(cmd, kidx)->kidx, in nptv6_classify()
923 icmd->opcode, insntod(icmd, kidx)->kidx); in nptv6_classify()
924 if (icmd->opcode != O_EXTERNAL_ACTION || in nptv6_classify()
925 insntod(icmd, kidx)->kidx != V_nptv6_eid) in nptv6_classify()
928 *puidx = insntod(cmd0, kidx)->kidx; in nptv6_classify()
937 insntod(cmd0, kidx)->kidx = idx; in nptv6_update_kidx()
938 NPTV6_DEBUG("opcode %u, kidx -> %u", cmd->opcode, idx); in nptv6_update_kidx()
949 NPTV6_DEBUG("uidx %u, type %u, err %d", ti->uidx, ti->type, err); in nptv6_findbyname()
964 NPTV6_DEBUG("kidx %u -> %s", idx, no->name); in nptv6_findbykidx()
993 struct nptv6_cfg *cfg; in destroy_config_cb() local
999 cfg = (struct nptv6_cfg *)SRV_OBJECT(ch, no->kidx); in destroy_config_cb()
1000 SRV_OBJECT(ch, no->kidx) = NULL; in destroy_config_cb()
1001 ipfw_objhash_del(ni, &cfg->no); in destroy_config_cb()
1002 ipfw_objhash_free_idx(ni, cfg->no.kidx); in destroy_config_cb()
1003 nptv6_free_config(cfg); in destroy_config_cb()