PERFORCE change 160676 for review
Marko Zec
zec at FreeBSD.org
Wed Apr 15 16:26:02 PDT 2009
http://perforce.freebsd.org/chv.cgi?CH=160676
Change 160676 by zec at zec_amdx2 on 2009/04/15 23:25:57
A small step towards allowing for "options VIMAGE" builds
to compile.
Affected files ...
.. //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 edit
.. //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 edit
.. //depot/projects/vimage-commit2/src/sys/net/route.c#33 edit
.. //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 edit
.. //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 edit
.. //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 edit
.. //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 edit
.. //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 edit
.. //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 edit
Differences ...
==== //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#15 (text+ko) ====
@@ -42,12 +42,18 @@
#ifndef VIMAGE_GLOBALS
MALLOC_DEFINE(M_VIMAGE, "vimage", "vimage resource container");
+MALLOC_DEFINE(M_VNET, "vnet", "network stack control block");
static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head;
static TAILQ_HEAD(vnet_modpending_head, vnet_modlink) vnet_modpending_head;
static void vnet_mod_complete_registration(struct vnet_modlink *);
static int vnet_mod_constructor(struct vnet_modlink *);
+/* curvnet should be thread-local - this is only a temporary step */
+#ifdef VIMAGE
+struct vnet *curvnet;
+#endif
+
void
vnet_mod_register(const struct vnet_modinfo *vmi)
{
@@ -194,7 +200,13 @@
for (mapentry = vml->vml_modinfo->vmi_symmap;
mapentry->name != NULL; mapentry++) {
if (strcmp(symstr, mapentry->name) == 0) {
- lookup->symvalue = (u_long) mapentry->base;
+#ifdef VIMAGE
+ lookup->symvalue =
+ (u_long) curvnet->mod_data[vml->vml_modinfo->vmi_id];
+ lookup->symvalue += mapentry->offset;
+#else
+ lookup->symvalue = (u_long) mapentry->offset;
+#endif
lookup->symsize = mapentry->size;
return (0);
}
@@ -206,9 +218,21 @@
static void
vi_init(void *unused)
{
+ struct vnet *vnet;
TAILQ_INIT(&vnet_modlink_head);
TAILQ_INIT(&vnet_modpending_head);
+
+#ifdef VIMAGE
+ LIST_INIT(&vnet_head);
+
+ vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT | M_ZERO);
+ if (vnet == NULL)
+ panic("vi_alloc: malloc failed");
+ LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le);
+
+ curvnet = LIST_FIRST(&vnet_head);
+#endif
}
static void
==== //depot/projects/vimage-commit2/src/sys/net/if_gif.c#22 (text+ko) ====
@@ -303,8 +303,10 @@
if_clone_detach(&gif_cloner);
mtx_destroy(&gif_mtx);
#ifdef INET6
+#ifndef VIMAGE
V_ip6_gif_hlim = 0; /* XXX -> vnet_gif_idetach() */
#endif
+#endif
break;
default:
return EOPNOTSUPP;
==== //depot/projects/vimage-commit2/src/sys/net/if_loop.c#24 (text+ko) ====
@@ -174,7 +174,6 @@
static int
loop_modevent(module_t mod, int type, void *data)
{
- INIT_VNET_NET(curvnet);
switch (type) {
case MOD_LOAD:
==== //depot/projects/vimage-commit2/src/sys/net/if_var.h#16 (text+ko) ====
@@ -116,6 +116,7 @@
struct ifnet {
void *if_softc; /* pointer to driver state */
void *if_l2com; /* pointer to protocol bits */
+ struct vnet *if_vnet; /* pointer to vnet */
TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */
char if_xname[IFNAMSIZ]; /* external name (name + unit) */
const char *if_dname; /* driver name */
==== //depot/projects/vimage-commit2/src/sys/net/route.c#33 (text+ko) ====
@@ -178,7 +178,7 @@
static int vnet_route_iattach(const void *unused __unused)
{
- INIT_VNET_INET(curvnet);
+ INIT_VNET_NET(curvnet);
int table;
struct domain *dom;
int fam;
==== //depot/projects/vimage-commit2/src/sys/net/rtsock.c#20 (text+ko) ====
@@ -1203,7 +1203,6 @@
static void
rt_dispatch(struct mbuf *m, const struct sockaddr *sa)
{
- INIT_VNET_NET(curvnet);
struct m_tag *tag;
/*
==== //depot/projects/vimage-commit2/src/sys/netinet/igmp.c#24 (text+ko) ====
@@ -141,13 +141,8 @@
static int sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS);
static int sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS);
-#ifdef VIMAGE
static vnet_attach_fn vnet_igmp_iattach;
static vnet_detach_fn vnet_igmp_idetach;
-#else
-static int vnet_igmp_iattach(const void *);
-static int vnet_igmp_idetach(const void *);
-#endif /* VIMAGE */
/*
* System-wide globals.
@@ -340,6 +335,7 @@
static int
sysctl_igmp_default_version(SYSCTL_HANDLER_ARGS)
{
+ INIT_VNET_INET(curvnet);
int error;
int new;
@@ -379,6 +375,7 @@
static int
sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS)
{
+ INIT_VNET_INET(curvnet);
int error;
int i;
@@ -420,6 +417,7 @@
sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS)
{
INIT_VNET_NET(curvnet);
+ INIT_VNET_INET(curvnet);
int *name;
int error;
u_int namelen;
@@ -505,6 +503,7 @@
static __inline int
igmp_isgroupreported(const struct in_addr addr)
{
+ INIT_VNET_INET(curvnet);
if (in_allhosts(addr) ||
((!V_igmp_sendlocal && IN_LOCAL_GROUP(ntohl(addr.s_addr)))))
@@ -567,6 +566,7 @@
static struct igmp_ifinfo *
igi_alloc_locked(/*const*/ struct ifnet *ifp)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct igmp_ifinfo *igi;
IGMP_LOCK_ASSERT();
@@ -712,6 +712,7 @@
static void
igi_delete_locked(const struct ifnet *ifp)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct igmp_ifinfo *igi, *tigi;
CTR3(KTR_IGMPV3, "%s: freeing igmp_ifinfo for ifp %p(%s)",
@@ -836,6 +837,7 @@
igmp_input_v2_query(struct ifnet *ifp, const struct ip *ip,
const struct igmp *igmp)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct ifmultiaddr *ifma;
struct igmp_ifinfo *igi;
struct in_multi *inm;
@@ -928,6 +930,7 @@
static void
igmp_v2_update_group(struct in_multi *inm, const int timer)
{
+ INIT_VNET_INET(curvnet);
CTR4(KTR_IGMPV3, "%s: %s/%s timer=%d", __func__,
inet_ntoa(inm->inm_addr), inm->inm_ifp->if_xname, timer);
@@ -975,6 +978,7 @@
igmp_input_v3_query(struct ifnet *ifp, const struct ip *ip,
/*const*/ struct igmpv3 *igmpv3)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct igmp_ifinfo *igi;
struct in_multi *inm;
uint32_t maxresp, nsrc, qqi;
@@ -1119,6 +1123,7 @@
igmp_input_v3_group_query(struct in_multi *inm, struct igmp_ifinfo *igi,
int timer, /*const*/ struct igmpv3 *igmpv3)
{
+ INIT_VNET_INET(curvnet);
int retval;
uint16_t nsrc;
@@ -1221,6 +1226,7 @@
igmp_input_v1_report(struct ifnet *ifp, /*const*/ struct ip *ip,
/*const*/ struct igmp *igmp)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct in_ifaddr *ia;
struct in_multi *inm;
@@ -1327,6 +1333,7 @@
igmp_input_v2_report(struct ifnet *ifp, /*const*/ struct ip *ip,
/*const*/ struct igmp *igmp)
{
+ INIT_VNET_INET(ifp->if_vnet);
struct in_ifaddr *ia;
struct in_multi *inm;
@@ -1612,21 +1619,15 @@
void
igmp_fasttimo(void)
{
-#ifdef VIMAGE
VNET_ITERATOR_DECL(vnet_iter);
VNET_LIST_RLOCK();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
- INIT_VNET_INET(vnet_iter);
igmp_fasttimo_vnet();
CURVNET_RESTORE();
}
VNET_LIST_RUNLOCK();
-#else /* !VIMAGE */
-
- igmp_fasttimo_vnet();
-#endif /* VIMAGE */
}
/*
@@ -1638,6 +1639,7 @@
static void
igmp_fasttimo_vnet(void)
{
+ INIT_VNET_INET(curvnet);
struct ifqueue scq; /* State-change packets */
struct ifqueue qrq; /* Query response packets */
struct ifnet *ifp;
@@ -1765,6 +1767,7 @@
static void
igmp_v1v2_process_group_timer(struct in_multi *inm, const int version)
{
+ INIT_VNET_INET(curvnet);
int report_timer_expired;
IN_MULTI_LOCK_ASSERT();
@@ -1813,6 +1816,7 @@
struct ifqueue *qrq, struct ifqueue *scq,
struct in_multi *inm, const int uri_fasthz)
{
+ INIT_VNET_INET(curvnet);
int query_response_timer_expired;
int state_change_retransmit_timer_expired;
@@ -2002,6 +2006,7 @@
static void
igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
struct ifmultiaddr *ifma;
struct ifnet *ifp;
struct in_multi *inm;
@@ -2077,6 +2082,7 @@
static void
igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
IGMP_LOCK_ASSERT();
@@ -2153,20 +2159,15 @@
void
igmp_slowtimo(void)
{
-#ifdef VIMAGE
VNET_ITERATOR_DECL(vnet_iter);
VNET_LIST_RLOCK();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
- INIT_VNET_INET(vnet_iter);
igmp_slowtimo_vnet();
CURVNET_RESTORE();
}
VNET_LIST_RUNLOCK();
-#else /* !VIMAGE */
- igmp_slowtimo_vnet();
-#endif /* VIMAGE */
}
/*
@@ -2175,6 +2176,7 @@
static void
igmp_slowtimo_vnet(void)
{
+ INIT_VNET_INET(curvnet);
struct igmp_ifinfo *igi;
IGMP_LOCK();
@@ -2202,9 +2204,6 @@
IGMP_LOCK_ASSERT();
ifp = inm->inm_ifp;
- /* XXX are these needed ? */
- INIT_VNET_NET(ifp->if_vnet);
- INIT_VNET_INET(ifp->if_vnet);
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL)
@@ -2342,6 +2341,7 @@
static int
igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
struct ifnet *ifp;
struct ifqueue *ifq;
int error, retval, syncstates;
@@ -2470,6 +2470,7 @@
static int
igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
struct ifnet *ifp;
int retval;
@@ -2529,6 +2530,7 @@
static void
igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
int syncstates;
syncstates = 1;
@@ -3314,6 +3316,7 @@
static void
igmp_v3_dispatch_general_query(struct igmp_ifinfo *igi)
{
+ INIT_VNET_INET(curvnet);
struct ifmultiaddr *ifma, *tifma;
struct ifnet *ifp;
struct in_multi *inm;
@@ -3395,12 +3398,14 @@
CTR2(KTR_IGMPV3, "%s: transmit %p", __func__, m);
/*
- * Restore VNET image pointer from enqueued mbuf chain
+ * Set VNET image pointer from enqueued mbuf chain
* before doing anything else. Whilst we use interface
* indexes to guard against interface detach, they are
* unique to each VIMAGE and must be retrieved.
*/
CURVNET_SET(m->m_pkthdr.header);
+ INIT_VNET_NET(curvnet);
+ INIT_VNET_INET(curvnet);
ifindex = igmp_restore_context(m);
/*
@@ -3482,7 +3487,6 @@
static struct mbuf *
igmp_v3_encap_report(struct ifnet *ifp, struct mbuf *m)
{
- INIT_VNET_NET(curvnet);
INIT_VNET_INET(curvnet);
struct igmp_report *igmp;
struct ip *ip;
@@ -3661,15 +3665,28 @@
return (0);
}
-#ifdef VIMAGE
+/*
+ * XXX Are igi_head and igmpstat really accessed via kmem / kldsym?
+ * If so, given that they are members of struct vnet_inet, they should
+ * be registered with VNET_MOD_INET, not here. Revisit!!!
+ */
+#if 0
static struct vnet_symmap vnet_igmp_symmap[] = {
VNET_SYMMAP(igmp, igi_head),
VNET_SYMMAP(igmp, igmpstat),
VNET_SYMMAP_END
};
-VNET_MOD_DECLARE(IGMP, igmp, vnet_igmp_iattach, vnet_igmp_idetach,
- vnet_igmp_symmap);
-#endif /* VIMAGE */
+#endif
+
+#ifndef VIMAGE_GLOBALS
+static vnet_modinfo_t vnet_igmp_modinfo = {
+ .vmi_id = VNET_MOD_IGMP,
+ .vmi_name = "igmp",
+ .vmi_dependson = VNET_MOD_INET,
+ .vmi_iattach = vnet_igmp_iattach,
+ .vmi_idetach = vnet_igmp_idetach
+};
+#endif
static int
igmp_modevent(module_t mod, int type, void *unused __unused)
@@ -3678,22 +3695,20 @@
switch (type) {
case MOD_LOAD:
igmp_sysinit();
-#ifdef VIMAGE
+#ifndef VIMAGE_GLOBALS
vnet_mod_register(&vnet_igmp_modinfo);
#else
- (void)vnet_igmp_iattach(NULL);
-#endif /* VIMAGE */
+ vnet_igmp_iattach(NULL);
+#endif
break;
case MOD_UNLOAD:
-#ifdef VIMAGE
- /*
- * TODO: Allow module unload if any VIMAGE instances
- * are using this module.
- */
- return (EBUSY);
+#ifndef VIMAGE_GLOBALS
+#ifdef NOTYET
+ vnet_mod_deregister(&vnet_igmp_modinfo);
+#endif
#else
- (void)vnet_igmp_idetach(NULL);
-#endif /* VIMAGE */
+ vnet_igmp_idetach(NULL);
+#endif
igmp_sysuninit();
break;
default:
==== //depot/projects/vimage-commit2/src/sys/netinet/in.c#21 (text+ko) ====
@@ -1017,7 +1017,6 @@
static void
in_purgemaddrs(struct ifnet *ifp)
{
- INIT_VNET_INET(ifp->if_vnet);
LIST_HEAD(,in_multi) purgeinms;
struct in_multi *inm, *tinm;
struct ifmultiaddr *ifma;
==== //depot/projects/vimage-commit2/src/sys/netinet/in_mcast.c#19 (text+ko) ====
@@ -392,7 +392,6 @@
in_getmulti(struct ifnet *ifp, const struct in_addr *group,
struct in_multi **pinm)
{
- INIT_VNET_INET(ifp->if_vnet);
struct sockaddr_in gsin;
struct ifmultiaddr *ifma;
struct in_ifinfo *ii;
@@ -1821,6 +1820,7 @@
inp_lookup_mcast_ifp(const struct inpcb *inp,
const struct sockaddr_in *gsin, const struct in_addr ina)
{
+ INIT_VNET_INET(curvnet);
struct ifnet *ifp;
KASSERT(gsin->sin_family == AF_INET, ("%s: not AF_INET", __func__));
@@ -1866,7 +1866,6 @@
inp_join_group(struct inpcb *inp, struct sockopt *sopt)
{
INIT_VNET_NET(curvnet);
- INIT_VNET_INET(curvnet);
struct group_source_req gsr;
sockunion_t *gsa, *ssa;
struct ifnet *ifp;
@@ -2319,6 +2318,7 @@
inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
{
INIT_VNET_NET(curvnet);
+ INIT_VNET_INET(curvnet);
struct in_addr addr;
struct ip_mreqn mreqn;
struct ifnet *ifp;
==== //depot/projects/vimage-commit2/src/sys/netinet/in_pcb.h#16 (text+ko) ====
@@ -221,6 +221,8 @@
#define in6p_icmp6filt inp_depend6.inp6_icmp6filt
#define in6p_cksum inp_depend6.inp6_cksum
+#define inp_vnet inp_pcbinfo->ipi_vnet
+
/*
* The range of the generation count, as used in this implementation, is 9e19.
* We would have to create 300 billion connections per second for this number
@@ -298,8 +300,12 @@
struct rwlock ipi_lock;
/*
- * vimage 1
- * general use 1
+ * Pointer to network stack instance
+ */
+ struct vnet *ipi_vnet;
+
+ /*
+ * general use 2
*/
void *ipi_pspare[2];
};
==== //depot/projects/vimage-commit2/src/sys/netinet/in_rmx.c#25 (text+ko) ====
@@ -250,6 +250,8 @@
static void
in_rtqtimo(void *rock)
{
+ INIT_VNET_NET(curvnet); /* XXX revisit!!! */
+ INIT_VNET_INET(curvnet); /* XXX revisit!!! */
int fibnum;
void *newrock;
struct timeval atv;
==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#46 (text+ko) ====
@@ -288,6 +288,7 @@
static void
tcp_zone_change(void *tag)
{
+ INIT_VNET_INET(curvnet);
uma_zone_set_max(V_tcbinfo.ipi_zone, maxsockets);
uma_zone_set_max(V_tcpcb_zone, maxsockets);
==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_syncache.h#5 (text+ko) ====
@@ -96,6 +96,7 @@
#define SYNCOOKIE_LIFETIME 16 /* seconds */
struct syncache_head {
+ struct vnet *sch_vnet;
struct mtx sch_mtx;
TAILQ_HEAD(sch_head, syncache) sch_bucket;
struct callout sch_timer;
==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_timewait.c#23 (text+ko) ====
@@ -132,6 +132,7 @@
static int
sysctl_maxtcptw(SYSCTL_HANDLER_ARGS)
{
+ INIT_VNET_INET(curvnet);
int error, new;
if (maxtcptw == 0)
@@ -158,6 +159,7 @@
void
tcp_tw_zone_change(void)
{
+ INIT_VNET_INET(curvnet);
if (maxtcptw == 0)
uma_zone_set_max(V_tcptw_zone, tcptw_auto_size());
==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_var.h#11 (text+ko) ====
@@ -35,6 +35,8 @@
#include <netinet/tcp.h>
+struct vnet;
+
/*
* Kernel variables for tcp.
*/
@@ -186,7 +188,8 @@
int t_rttlow; /* smallest observerved RTT */
u_int32_t rfbuf_ts; /* recv buffer autoscaling timestamp */
int rfbuf_cnt; /* recv buffer autoscaling byte count */
- void *t_pspare[3]; /* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */
+ struct vnet *t_vnet; /* pointer to parent vnet */
+ void *t_pspare[2]; /* toe usrreqs / toepcb * / congestion algo / vimage / 1 general use */
struct toe_usrreqs *t_tu; /* offload operations vector */
void *t_toe; /* TOE pcb pointer */
int t_bytes_acked; /* # bytes acked during current RTT */
==== //depot/projects/vimage-commit2/src/sys/netinet/udp_usrreq.c#33 (text+ko) ====
@@ -155,6 +155,7 @@
static void
udp_zone_change(void *tag)
{
+ INIT_VNET_INET(curvnet);
uma_zone_set_max(V_udbinfo.ipi_zone, maxsockets);
}
==== //depot/projects/vimage-commit2/src/sys/netinet6/in6_rmx.c#26 (text+ko) ====
@@ -289,7 +289,6 @@
in6_rtqtimo(void *rock)
{
CURVNET_SET_QUIET((struct vnet *) rock);
- INIT_VNET_NET((struct vnet *) rock);
INIT_VNET_INET6((struct vnet *) rock);
struct radix_node_head *rnh = rock;
struct rtqk_arg arg;
@@ -377,7 +376,6 @@
in6_mtutimo(void *rock)
{
CURVNET_SET_QUIET((struct vnet *) rock);
- INIT_VNET_NET((struct vnet *) rock);
INIT_VNET_INET6((struct vnet *) rock);
struct radix_node_head *rnh = rock;
struct mtuex_arg arg;
==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6.c#25 (text+ko) ====
@@ -869,7 +869,6 @@
struct llentry *
nd6_lookup(struct in6_addr *addr6, int flags, struct ifnet *ifp)
{
- INIT_VNET_INET6(curvnet);
struct sockaddr_in6 sin6;
struct llentry *ln;
int llflags = 0;
==== //depot/projects/vimage-commit2/src/sys/netinet6/nd6_rtr.c#23 (text+ko) ====
@@ -1543,6 +1543,7 @@
int
nd6_prefix_onlink(struct nd_prefix *pr)
{
+ INIT_VNET_NET(curvnet);
INIT_VNET_INET6(curvnet);
struct ifaddr *ifa;
struct ifnet *ifp = pr->ndpr_ifp;
==== //depot/projects/vimage-commit2/src/sys/sys/socketvar.h#4 (text+ko) ====
@@ -45,6 +45,8 @@
#include <sys/sockopt.h>
#endif
+struct vnet;
+
/*
* Kernel structure per socket.
* Contains send and receive buffer queues,
@@ -72,6 +74,7 @@
short so_state; /* (b) internal state flags SS_* */
int so_qstate; /* (e) internal state flags SQ_* */
void *so_pcb; /* protocol control block */
+ struct vnet *so_vnet; /* network stack instance */
struct protosw *so_proto; /* (a) protocol handle */
/*
* Variables for connection queuing.
==== //depot/projects/vimage-commit2/src/sys/sys/sysctl.h#17 (text+ko) ====
@@ -163,6 +163,8 @@
const char *oid_fmt;
int oid_refcnt;
const char *oid_descr;
+ short oid_v_subs;
+ short oid_v_mod;
};
#define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l)
==== //depot/projects/vimage-commit2/src/sys/sys/vimage.h#38 (text+ko) ====
@@ -48,8 +48,8 @@
struct vnet_symmap {
char *name;
- void *base;
- size_t size;
+ size_t offset;
+ size_t size;
};
typedef struct vnet_symmap vnet_symmap_t;
@@ -71,12 +71,6 @@
const char *vml_iname;
};
-#define VNET_SYMMAP(mod, name) \
- { #name, &(vnet_ ## mod ## _0._ ## name), \
- sizeof(vnet_ ## mod ## _0._ ## name) }
-
-#define VNET_SYMMAP_END { NULL, 0 }
-
/* stateful modules */
#define VNET_MOD_NET 0 /* MUST be 0 - implicit dependency */
#define VNET_MOD_NETGRAPH 1
@@ -108,7 +102,11 @@
#define VNET_MOD_DYNAMIC_START 32
#define VNET_MOD_MAX 64
-/* Sysctl virtualization macros need these name mappings bellow */
+/* Major module IDs for vimage sysctl virtualization */
+#define V_GLOBAL 0 /* global variable - no indirection */
+#define V_NET 1
+
+/* Name mappings for minor module IDs in vimage sysctl virtualization */
#define V_MOD_vnet_net VNET_MOD_NET
#define V_MOD_vnet_netgraph VNET_MOD_NETGRAPH
#define V_MOD_vnet_inet VNET_MOD_INET
@@ -128,21 +126,67 @@
#define VSYM(base, sym) (sym)
#else
#ifdef VIMAGE
-#error "No option VIMAGE yet!"
+#define VSYM(base, sym) ((base)->_ ## sym)
#else
#define VSYM(base, sym) (base ## _0._ ## sym)
#endif
#endif
+#ifndef VIMAGE_GLOBALS
+#ifdef VIMAGE
+#define VNET_SYMMAP(mod, name) \
+ { #name, offsetof(struct vnet_ ## mod, _ ## name), \
+ sizeof(((struct vnet_ ## mod *) curthread)->_ ## name) }
+#else
+#define VNET_SYMMAP(mod, name) \
+ { #name, &(vnet_ ## mod ## _0._ ## name), \
+ sizeof(vnet_ ## mod ## _0._ ## name) }
+#endif
+#define VNET_SYMMAP_END { NULL, 0 }
+#endif /* !VIMAGE_GLOBALS */
+
+#ifdef VIMAGE
+struct vnet {
+ void *mod_data[VNET_MOD_MAX];
+ LIST_ENTRY(vnet) vnet_le; /* all vnets list */
+ u_int vnet_magic_n;
+};
+
+extern struct vnet *curvnet;
+#endif
+
+#ifdef VIMAGE
+#ifdef VNET_DEBUG
+#define INIT_FROM_VNET(vnet, modindex, modtype, sym) \
+ if (vnet != curvnet) \
+ panic("in %s:%d %s()\n vnet=%p curvnet=%p", \
+ __FILE__, __LINE__, __FUNCTION__, \
+ vnet, curvnet); \
+ modtype *sym = (vnet)->mod_data[modindex];
+#else /* !VNET_DEBUG */
+#define INIT_FROM_VNET(vnet, modindex, modtype, sym) \
+ modtype *sym = (vnet)->mod_data[modindex];
+#endif /* !VNET_DEBUG */
+#else /* !VIMAGE */
+#define INIT_FROM_VNET(vnet, modindex, modtype, sym)
+#endif
+
+#ifdef VIMAGE
+LIST_HEAD(vnet_list_head, vnet);
+extern struct vnet_list_head vnet_head;
+#define VNET_ITERATOR_DECL(arg) struct vnet *arg;
+#define VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le)
+#else
+#define VNET_ITERATOR_DECL(arg)
+#define VNET_FOREACH(arg)
+#endif
+
/* Non-VIMAGE null-macros */
#define IS_DEFAULT_VNET(arg) 1
#define CURVNET_SET(arg)
#define CURVNET_SET_QUIET(arg)
#define CURVNET_RESTORE()
#define VNET_ASSERT(condition)
-#define INIT_FROM_VNET(vnet, modindex, modtype, sym)
-#define VNET_ITERATOR_DECL(arg)
-#define VNET_FOREACH(arg)
#define VNET_LIST_RLOCK()
#define VNET_LIST_RUNLOCK()
#define INIT_VPROCG(arg)
More information about the p4-projects
mailing list