Date: Thu, 25 Jan 2007 17:30:35 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 113517 for review Message-ID: <200701251730.l0PHUZoJ088557@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113517 Change 113517 by zec@zec_tca51 on 2007/01/25 17:30:26 Let arptimer() run in all vnets, not only in the default one. While there, virtualize a few arp-related sysctls. Affected files ... .. //depot/projects/vimage/src/sys/netinet/if_ether.c#7 edit .. //depot/projects/vimage/src/sys/netinet/vinet.h#8 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#13 edit Differences ... ==== //depot/projects/vimage/src/sys/netinet/if_ether.c#7 (text+ko) ==== @@ -83,13 +83,15 @@ SYSCTL_NODE(_net_link_ether, PF_INET, inet, CTLFLAG_RW, 0, ""); /* timer values */ -static int arpt_prune = (5*60*1); /* walk list every 5 minutes */ -static int arpt_keep = (20*60); /* once resolved, good for 20 more minutes */ +#ifndef VIMAGE +static int arpt_prune; +static int arpt_keep; +#endif -SYSCTL_INT(_net_link_ether_inet, OID_AUTO, prune_intvl, CTLFLAG_RW, - &arpt_prune, 0, "ARP table prune interval in seconds"); -SYSCTL_INT(_net_link_ether_inet, OID_AUTO, max_age, CTLFLAG_RW, - &arpt_keep, 0, "ARP entry lifetime in seconds"); +SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, prune_intvl, + CTLFLAG_RW, arpt_prune, 0, "ARP table prune interval in seconds"); +SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, max_age, + CTLFLAG_RW, arpt_keep, 0, "ARP entry lifetime in seconds"); #define rt_expire rt_rmx.rmx_expire @@ -101,26 +103,28 @@ u_short la_asked; /* # requests sent */ }; +static struct ifqueue arpintrq; + #ifndef VIMAGE static LIST_HEAD(, llinfo_arp) llinfo_arp; +static int arp_maxtries; +static int useloopback; +static int arp_proxyall; +static struct callout arp_callout; #endif -static struct ifqueue arpintrq; -static int arp_allocated; - -static int arp_maxtries = 5; -static int useloopback = 1; /* use loopback interface for local traffic */ -static int arp_proxyall = 0; -static struct callout arp_callout; - -SYSCTL_INT(_net_link_ether_inet, OID_AUTO, maxtries, CTLFLAG_RW, - &arp_maxtries, 0, "ARP resolution attempts before returning error"); -SYSCTL_INT(_net_link_ether_inet, OID_AUTO, useloopback, CTLFLAG_RW, - &useloopback, 0, "Use the loopback interface for local traffic"); -SYSCTL_INT(_net_link_ether_inet, OID_AUTO, proxyall, CTLFLAG_RW, - &arp_proxyall, 0, "Enable proxy ARP for all suitable requests"); +SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, maxtries, + CTLFLAG_RW, arp_maxtries, 0, + "ARP resolution attempts before returning error"); +SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, useloopback, + CTLFLAG_RW, useloopback, 0, + "Use the loopback interface for local traffic"); +SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, proxyall, + CTLFLAG_RW, arp_proxyall, 0, + "Enable proxy ARP for all suitable requests"); static void arp_init(void); +static int arp_iattach(void); static void arp_rtrequest(int, struct rtentry *, struct rt_addrinfo *); static void arprequest(struct ifnet *, struct in_addr *, struct in_addr *, u_char *); @@ -132,6 +136,17 @@ static void in_arpinput(struct mbuf *); #endif +#ifdef VIMAGE +static struct vnet_modinfo vnet_arp_modinfo = { + .id = VNET_MOD_ARP, + .flags = VNET_MFLAG_ORDER_2ND, + .name = "arp", + .symmap = NULL, + .i_attach = arp_iattach, + .i_detach = NULL, +}; +#endif + /* * Timeout routine. Age arp_tab entries periodically. */ @@ -173,7 +188,7 @@ RADIX_NODE_HEAD_UNLOCK(V_rt_tables[AF_INET]); CURVNETB_RESTORE(); - callout_reset(&arp_callout, arpt_prune * hz, arptimer, arg); + callout_reset(&V_arp_callout, V_arpt_prune * hz, arptimer, arg); } /* @@ -253,7 +268,6 @@ log(LOG_DEBUG, "%s: malloc failed\n", __func__); break; } - arp_allocated++; /* * We are storing a route entry outside of radix tree. So, * it can be found and accessed by other means than radix @@ -308,7 +322,7 @@ rt->rt_expire = 0; bcopy(IF_LLADDR(rt->rt_ifp), LLADDR(SDL(gate)), SDL(gate)->sdl_alen = rt->rt_ifp->if_addrlen); - if (useloopback) { + if (V_useloopback) { rt->rt_ifp = V_loif; rt->rt_rmx.rmx_mtu = V_loif->if_mtu; } @@ -400,6 +414,7 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, struct sockaddr *dst, u_char *desten) { + INIT_VNET_INET(ifp->if_vnetb); struct llinfo_arp *la = NULL; struct rtentry *rt = NULL; struct sockaddr_dl *sdl; @@ -504,7 +519,7 @@ * if we have already sent arp_maxtries ARP requests. Retransmit the * ARP request, but not faster than one request per second. */ - if (la->la_asked < arp_maxtries) + if (la->la_asked < V_arp_maxtries) error = EWOULDBLOCK; /* First request. */ else error = (rt == rt0) ? EHOSTDOWN : EHOSTUNREACH; @@ -809,9 +824,9 @@ th->rcf = trld->trld_rcf; } if (rt->rt_expire) - rt->rt_expire = time_uptime + arpt_keep; + rt->rt_expire = time_uptime + V_arpt_keep; la->la_asked = 0; - la->la_preempt = arp_maxtries; + la->la_preempt = V_arp_maxtries; hold = la->la_hold; la->la_hold = NULL; RT_UNLOCK(rt); @@ -830,7 +845,7 @@ if (rt == NULL) { struct sockaddr_in sin; - if (!arp_proxyall) + if (!V_arp_proxyall) goto drop; bzero(&sin, sizeof sin); @@ -993,18 +1008,35 @@ ifa->ifa_flags |= RTF_CLONING; } +static int +arp_iattach(void) +{ + INIT_VNET_INET(curvnetb); + + V_arpt_prune = (5*60*1); /* walk list every 5 minutes */ + V_arpt_keep = (20*60); /* once resolved, good for 20 more minutes */ + V_arp_maxtries = 5; + V_useloopback = 1; /* use loopback interface for local traffic */ + V_arp_proxyall = 0; + + LIST_INIT(&V_llinfo_arp); + callout_init(&V_arp_callout, CALLOUT_MPSAFE); + callout_reset(&V_arp_callout, hz, arptimer, curvnetb); + + return 0; +} + static void arp_init(void) { - INIT_VNET_INET(curvnetb); /* XXX should panic here! */ -printf("arp_init\n"); - +#ifdef VIMAGE + vnet_mod_register(&vnet_arp_modinfo); +#else + arp_iattach(); +#endif arpintrq.ifq_maxlen = 50; mtx_init(&arpintrq.ifq_mtx, "arp_inq", NULL, MTX_DEF); - LIST_INIT(&V_llinfo_arp); /* XXX */ - callout_init(&arp_callout, CALLOUT_MPSAFE); netisr_register(NETISR_ARP, arpintr, &arpintrq, NETISR_MPSAFE); - callout_reset(&arp_callout, hz, arptimer, curvnetb); } SYSINIT(arp, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, arp_init, 0); ==== //depot/projects/vimage/src/sys/netinet/vinet.h#8 (text+ko) ==== @@ -62,6 +62,12 @@ struct in_multihead _in_multihead; LIST_HEAD(, llinfo_arp) _llinfo_arp; + struct callout _arp_callout; + int _arpt_prune; + int _arpt_keep; + int _arp_maxtries; + int _useloopback; + int _arp_proxyall; int _ipforwarding; @@ -118,6 +124,12 @@ #define V_in_multihead VNET_INET(in_multihead) #define V_llinfo_arp VNET_INET(llinfo_arp) +#define V_arp_callout VNET_INET(arp_callout) +#define V_arpt_prune VNET_INET(arpt_prune) +#define V_arpt_keep VNET_INET(arpt_keep) +#define V_arp_maxtries VNET_INET(arp_maxtries) +#define V_useloopback VNET_INET(useloopback) +#define V_arp_proxyall VNET_INET(arp_proxyall) #define V_ipforwarding VNET_INET(ipforwarding) ==== //depot/projects/vimage/src/sys/sys/vimage.h#13 (text+ko) ==== @@ -68,6 +68,7 @@ #define VNET_MOD_IPX 4 #define VNET_MOD_ATALK 5 #define VNET_MOD_IPFW 8 +#define VNET_MOD_ARP 29 #define VNET_MOD_RTABLE 30 #define VNET_MOD_LOIF 31 #define VNET_MOD_DYNAMIC_START 32
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701251730.l0PHUZoJ088557>