/* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ void ip_init(void) { const struct protosw *pr; int i; sysctl_net_inet_ip_setup(NULL); pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl", NULL, IPL_SOFTNET); pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW); if (pr == 0) panic("ip_init"); for (i = 0; i < IPPROTO_MAX; i++) ip_protox[i] = pr - inetsw; for (pr = inetdomain.dom_protosw; pr < inetdomain.dom_protoswNPROTOSW; pr++) if (pr->pr_domain->dom_family == PF_INET && pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW) ip_protox[pr->pr_protocol] = pr - inetsw; ip_reass_init(); ip_ids = ip_id_init(); ip_id = time_second & 0xfffff; ipintrq.ifq_maxlen = IFQ_MAXLEN; TAILQ_INIT(&in_ifaddrhead); in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true, &in_ifaddrhash); in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true, &in_multihash); ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout); #ifdef GATEWAY ipflow_init(ip_hashsize); #endif /* Register our Packet Filter hook. */ inet_pfil_hook = pfil_head_create(PFIL_TYPE_AF, (void *)AF_INET); KASSERT(inet_pfil_hook != NULL); #ifdef MBUFTRACE MOWNER_ATTACH(&ip_tx_mowner); MOWNER_ATTACH(&ip_rx_mowner); #endif /* MBUFTRACE */ ipstat_percpu = percpu_alloc(sizeof(uint64_t) * IP_NSTATS); }
void domain_attach(struct domain *dp) { const struct protosw *pr; STAILQ_INSERT_TAIL(&domains, dp, dom_link); if (dp->dom_family < __arraycount(domain_array)) domain_array[dp->dom_family] = dp; if (dp->dom_init) (*dp->dom_init)(); #ifdef MBUFTRACE if (dp->dom_mowner.mo_name[0] == '\0') { strncpy(dp->dom_mowner.mo_name, dp->dom_name, sizeof(dp->dom_mowner.mo_name)); MOWNER_ATTACH(&dp->dom_mowner); } #endif for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { if (pr->pr_init) (*pr->pr_init)(); } if (max_linkhdr < 16) /* XXX */ max_linkhdr = 16; max_hdr = max_linkhdr + max_protohdr; max_datalen = MHLEN - max_hdr; }
void mpls_init(void) { #ifdef MBUFTRACE MOWNER_ATTACH(&mpls_owner); #endif memset(&mplsintrq, 0, sizeof(mplsintrq)); mplsintrq.ifq_maxlen = 256; sysctl_net_mpls_setup(NULL); }
static int loop_clone_create(struct if_clone *ifc, int unit) { struct ifnet *ifp; ifp = if_alloc(IFT_LOOP); if_initname(ifp, ifc->ifc_name, unit); ifp->if_mtu = LOMTU; ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST | IFF_RUNNING; // ifp->if_ioctl = loioctl; ifp->if_output = looutput; #ifdef ALTQ ifp->if_start = lostart; #endif ifp->if_type = IFT_LOOP; ifp->if_hdrlen = 0; ifp->if_addrlen = 0; ifp->if_dlt = DLT_NULL; IFQ_SET_READY(&ifp->if_snd); if (unit == 0) lo0ifp = ifp; if_attach(ifp); if_alloc_sadl(ifp); #if NBPFILTER > 0 bpfattach(ifp, DLT_NULL, sizeof(u_int)); #endif #ifdef MBUFTRACE ifp->if_mowner = malloc(sizeof(struct mowner)); strlcpy(ifp->if_mowner->mo_name, ifp->if_xname, sizeof(ifp->if_mowner->mo_name)); MOWNER_ATTACH(ifp->if_mowner); #endif return (0); }
static int loop_clone_create(struct if_clone *ifc, int unit) { struct ifnet *ifp; #ifdef T2EX int error; #endif ifp = if_alloc(IFT_LOOP); #ifdef T2EX if ( ifp == NULL ) { error = ENOMEM; goto err_ret0; } #endif if_initname(ifp, ifc->ifc_name, unit); ifp->if_mtu = LOMTU; ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST | IFF_RUNNING; ifp->if_ioctl = loioctl; ifp->if_output = looutput; #ifdef ALTQ ifp->if_start = lostart; #endif ifp->if_type = IFT_LOOP; ifp->if_hdrlen = 0; ifp->if_addrlen = 0; ifp->if_dlt = DLT_NULL; IFQ_SET_READY(&ifp->if_snd); if (unit == 0) lo0ifp = ifp; #ifndef T2EX if_attach(ifp); if_alloc_sadl(ifp); #else error = if_attach(ifp); if ( error != 0 ) { goto err_ret1; } error = if_alloc_sadl(ifp); if ( error != 0 ) { goto err_ret2; } #endif #if NBPFILTER > 0 #ifndef T2EX bpfattach(ifp, DLT_NULL, sizeof(u_int)); #else error = bpfattach(ifp, DLT_NULL, sizeof(u_int)); if ( error != 0 ) { goto err_ret3; } #endif #endif #ifdef MBUFTRACE ifp->if_mowner = malloc(sizeof(struct mowner), M_DEVBUF, M_WAITOK | M_ZERO); #ifdef T2EX if ( ifp->if_mowner == NULL ) { error = ENOMEM; goto err_ret4; } #endif strlcpy(ifp->if_mowner->mo_name, ifp->if_xname, sizeof(ifp->if_mowner->mo_name)); #ifndef T2EX MOWNER_ATTACH(ifp->if_mowner); #else error = MOWNER_ATTACH(ifp->if_mowner); if ( error != 0 ) { goto err_ret5; } #endif #endif return (0); #ifdef T2EX #ifdef MBUFTRACE err_ret5: free(ifp->if_mowner, M_DEVBUF); err_ret4: bpfdetach(ifp); #endif #if NBPFILTER > 0 err_ret3: if_free_sadl(ifp); #endif err_ret2: if_detach(ifp); err_ret1: if_free(ifp); err_ret0: return error; #endif }
void domaininit() { struct domain *dp; struct protosw *pr; #undef unix /* * KAME NOTE: ADDDOMAIN(route) is moved to the last part so that * it will be initialized as the *first* element. confusing! */ #ifndef lint ADDDOMAIN(unix); #ifdef INET ADDDOMAIN(inet); #endif #ifdef INET6 ADDDOMAIN(inet6); #endif #ifdef NS ADDDOMAIN(ns); #endif #ifdef ISO ADDDOMAIN(iso); #endif #ifdef CCITT ADDDOMAIN(ccitt); #endif #ifdef NATM ADDDOMAIN(natm); #endif #ifdef NETATALK ADDDOMAIN(atalk); #endif #if defined(IPSEC) || defined(FAST_IPSEC) ADDDOMAIN(key); #endif #ifdef MIP6 ADDDOMAIN(mip); #endif #ifdef INET #if NARP > 0 ADDDOMAIN(arp); #endif #endif ADDDOMAIN(route); #endif /* ! lint */ for (dp = domains; dp; dp = dp->dom_next) { if (dp->dom_init) (*dp->dom_init)(); #ifdef MBUFTRACE if (dp->dom_mowner.mo_name[0] == '\0') { strncpy(dp->dom_mowner.mo_name, dp->dom_name, sizeof(dp->dom_mowner.mo_name)); MOWNER_ATTACH(&dp->dom_mowner); } #endif for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) if (pr->pr_init) (*pr->pr_init)(); } if (max_linkhdr < 16) /* XXX */ max_linkhdr = 16; max_hdr = max_linkhdr + max_protohdr; max_datalen = MHLEN - max_hdr; callout_init(&pffasttimo_ch); callout_init(&pfslowtimo_ch); callout_reset(&pffasttimo_ch, 1, pffasttimo, NULL); callout_reset(&pfslowtimo_ch, 1, pfslowtimo, NULL); }