3077 lines
89 KiB
Diff
3077 lines
89 KiB
Diff
diff -ur sys.20081015/netinet/ip_mroute.c sys/netinet/ip_mroute.c
|
|
--- sys.20081015/netinet/ip_mroute.c 2008-08-16 16:29:19.000000000 -0700
|
|
+++ sys/netinet/ip_mroute.c 2008-11-05 16:30:04.000000000 -0800
|
|
@@ -99,6 +99,7 @@
|
|
#include <netinet/pim_var.h>
|
|
#include <netinet/udp.h>
|
|
#ifdef INET6
|
|
+#include <netinet6/vinet6.h>
|
|
#include <netinet/ip6.h>
|
|
#include <netinet6/in6_var.h>
|
|
#include <netinet6/ip6_mroute.h>
|
|
@@ -112,21 +113,30 @@
|
|
* Control debugging code for rsvp and multicast routing code.
|
|
* Can only set them with the debugger.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static u_int rsvpdebug; /* non-zero enables debugging */
|
|
|
|
static u_int mrtdebug; /* any set of the flags below */
|
|
+#endif /* !VIMAGE */
|
|
#define DEBUG_MFC 0x02
|
|
#define DEBUG_FORWARD 0x04
|
|
#define DEBUG_EXPIRE 0x08
|
|
#define DEBUG_XMIT 0x10
|
|
#define DEBUG_PIM 0x20
|
|
|
|
+#ifndef VIMAGE
|
|
#define VIFI_INVALID ((vifi_t) -1)
|
|
+#endif /* !VIMAGE */
|
|
|
|
#define M_HASCL(m) ((m)->m_flags & M_EXT)
|
|
|
|
static MALLOC_DEFINE(M_MRTABLE, "mroutetbl", "multicast routing tables");
|
|
|
|
+static int vnet_mroute_iattach(const void *);
|
|
+static int vnet_mroute_idetach(const void *);
|
|
+
|
|
+VNET_MOD_DECLARE(MROUTE, mroute, vnet_mroute_iattach, vnet_mroute_idetach, INET, NULL)
|
|
+
|
|
/*
|
|
* Locking. We use two locks: one for the virtual interface table and
|
|
* one for the forwarding table. These locks may be nested in which case
|
|
@@ -140,48 +150,59 @@
|
|
*
|
|
*/
|
|
|
|
+#ifndef VIMAGE
|
|
static struct mrtstat mrtstat;
|
|
-SYSCTL_STRUCT(_net_inet_ip, OID_AUTO, mrtstat, CTLFLAG_RW,
|
|
- &mrtstat, mrtstat,
|
|
+#endif /* !VIMAGE */
|
|
+SYSCTL_V_STRUCT(V_NET, vnet_mroute, _net_inet_ip, OID_AUTO, mrtstat,
|
|
+ CTLFLAG_RW, mrtstat, mrtstat,
|
|
"Multicast Routing Statistics (struct mrtstat, netinet/ip_mroute.h)");
|
|
-
|
|
+#ifndef VIMAGE
|
|
static struct mfc *mfctable[MFCTBLSIZ];
|
|
-SYSCTL_OPAQUE(_net_inet_ip, OID_AUTO, mfctable, CTLFLAG_RD,
|
|
- &mfctable, sizeof(mfctable), "S,*mfc[MFCTBLSIZ]",
|
|
+SYSCTL_V_OID(V_NET, vnet_mroute, _net_inet_ip, CTLTYPE_OPAQUE|OID_AUTO,
|
|
+ mfctable, CTLFLAG_RD, mfctable, sizeof(mfctable), sysctl_handle_opaque,
|
|
+ "S,*mfc[MFCTBLSIZ]",
|
|
"Multicast Forwarding Table (struct *mfc[MFCTBLSIZ], netinet/ip_mroute.h)");
|
|
|
|
static struct mtx mrouter_mtx;
|
|
-#define MROUTER_LOCK() mtx_lock(&mrouter_mtx)
|
|
-#define MROUTER_UNLOCK() mtx_unlock(&mrouter_mtx)
|
|
-#define MROUTER_LOCK_ASSERT() mtx_assert(&mrouter_mtx, MA_OWNED)
|
|
+#endif /* !VIMAGE */
|
|
+#define MROUTER_LOCK() mtx_lock(&V_mrouter_mtx)
|
|
+#define MROUTER_UNLOCK() mtx_unlock(&V_mrouter_mtx)
|
|
+#define MROUTER_LOCK_ASSERT() mtx_assert(&V_mrouter_mtx, MA_OWNED)
|
|
#define MROUTER_LOCK_INIT() \
|
|
- mtx_init(&mrouter_mtx, "IPv4 multicast forwarding", NULL, MTX_DEF)
|
|
-#define MROUTER_LOCK_DESTROY() mtx_destroy(&mrouter_mtx)
|
|
+ mtx_init(&V_mrouter_mtx, "IPv4 multicast forwarding", NULL, MTX_DEF)
|
|
+#define MROUTER_LOCK_DESTROY() mtx_destroy(&V_mrouter_mtx)
|
|
|
|
+#ifndef VIMAGE
|
|
static struct mtx mfc_mtx;
|
|
-#define MFC_LOCK() mtx_lock(&mfc_mtx)
|
|
-#define MFC_UNLOCK() mtx_unlock(&mfc_mtx)
|
|
-#define MFC_LOCK_ASSERT() mtx_assert(&mfc_mtx, MA_OWNED)
|
|
-#define MFC_LOCK_INIT() mtx_init(&mfc_mtx, "mroute mfc table", NULL, MTX_DEF)
|
|
-#define MFC_LOCK_DESTROY() mtx_destroy(&mfc_mtx)
|
|
+#endif /* !VIMAGE */
|
|
+#define MFC_LOCK() mtx_lock(&V_mfc_mtx)
|
|
+#define MFC_UNLOCK() mtx_unlock(&V_mfc_mtx)
|
|
+#define MFC_LOCK_ASSERT() mtx_assert(&V_mfc_mtx, MA_OWNED)
|
|
+#define MFC_LOCK_INIT() mtx_init(&V_mfc_mtx, "mroute mfc table", NULL, MTX_DEF)
|
|
+#define MFC_LOCK_DESTROY() mtx_destroy(&V_mfc_mtx)
|
|
|
|
+#ifndef VIMAGE
|
|
static struct vif viftable[MAXVIFS];
|
|
-SYSCTL_OPAQUE(_net_inet_ip, OID_AUTO, viftable, CTLFLAG_RD,
|
|
- &viftable, sizeof(viftable), "S,vif[MAXVIFS]",
|
|
+SYSCTL_V_OID(V_NET, vnet_mroute, _net_inet_ip, CTLTYPE_OPAQUE|OID_AUTO, viftable,
|
|
+ CTLFLAG_RD, viftable, sizeof(viftable), sysctl_handle_opaque,
|
|
+ "S,vif[MAXVIFS]",
|
|
"Multicast Virtual Interfaces (struct vif[MAXVIFS], netinet/ip_mroute.h)");
|
|
|
|
static struct mtx vif_mtx;
|
|
-#define VIF_LOCK() mtx_lock(&vif_mtx)
|
|
-#define VIF_UNLOCK() mtx_unlock(&vif_mtx)
|
|
-#define VIF_LOCK_ASSERT() mtx_assert(&vif_mtx, MA_OWNED)
|
|
-#define VIF_LOCK_INIT() mtx_init(&vif_mtx, "mroute vif table", NULL, MTX_DEF)
|
|
-#define VIF_LOCK_DESTROY() mtx_destroy(&vif_mtx)
|
|
+#endif /* !VIMAGE */
|
|
+#define VIF_LOCK() mtx_lock(&V_vif_mtx)
|
|
+#define VIF_UNLOCK() mtx_unlock(&V_vif_mtx)
|
|
+#define VIF_LOCK_ASSERT() mtx_assert(&V_vif_mtx, MA_OWNED)
|
|
+#define VIF_LOCK_INIT() mtx_init(&V_vif_mtx, "mroute vif table", NULL, MTX_DEF)
|
|
+#define VIF_LOCK_DESTROY() mtx_destroy(&V_vif_mtx)
|
|
|
|
+#ifndef VIMAGE
|
|
static u_char nexpire[MFCTBLSIZ];
|
|
|
|
static eventhandler_tag if_detach_event_tag = NULL;
|
|
|
|
static struct callout expire_upcalls_ch;
|
|
+#endif /* !VIMAGE */
|
|
|
|
#define EXPIRE_TIMEOUT (hz / 4) /* 4x / second */
|
|
#define UPCALL_EXPIRE 6 /* number of timeouts */
|
|
@@ -196,25 +217,31 @@
|
|
* Pending timeouts are stored in a hash table, the key being the
|
|
* expiration time. Periodically, the entries are analysed and processed.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
#define BW_METER_BUCKETS 1024
|
|
static struct bw_meter *bw_meter_timers[BW_METER_BUCKETS];
|
|
-static struct callout bw_meter_ch;
|
|
+static struct callout V_bw_meter_ch;
|
|
+#endif /* !VIMAGE */
|
|
#define BW_METER_PERIOD (hz) /* periodical handling of bw meters */
|
|
|
|
/*
|
|
* Pending upcalls are stored in a vector which is flushed when
|
|
* full, or periodically
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static struct bw_upcall bw_upcalls[BW_UPCALLS_MAX];
|
|
static u_int bw_upcalls_n; /* # of pending upcalls */
|
|
static struct callout bw_upcalls_ch;
|
|
+#endif /* !VIMAGE */
|
|
#define BW_UPCALLS_PERIOD (hz) /* periodical flush of bw upcalls */
|
|
|
|
+#ifndef VIMAGE
|
|
static struct pimstat pimstat;
|
|
+#endif /* !VIMAGE */
|
|
|
|
SYSCTL_NODE(_net_inet, IPPROTO_PIM, pim, CTLFLAG_RW, 0, "PIM");
|
|
-SYSCTL_STRUCT(_net_inet_pim, PIMCTL_STATS, stats, CTLFLAG_RD,
|
|
- &pimstat, pimstat,
|
|
+SYSCTL_V_STRUCT(V_NET, vnet_mroute, _net_inet_pim, PIMCTL_STATS, stats,
|
|
+ CTLFLAG_RD, pimstat, pimstat,
|
|
"PIM Statistics (struct pimstat, netinet/pim_var.h)");
|
|
|
|
static u_long pim_squelch_wholepkt = 0;
|
|
@@ -222,6 +249,7 @@
|
|
&pim_squelch_wholepkt, 0,
|
|
"Disable IGMP_WHOLEPKT notifications if rendezvous point is unspecified");
|
|
|
|
+
|
|
extern struct domain inetdomain;
|
|
struct protosw in_pim_protosw = {
|
|
.pr_type = SOCK_RAW,
|
|
@@ -291,13 +319,17 @@
|
|
0 /* flags */
|
|
};
|
|
|
|
+#ifndef VIMAGE
|
|
static struct ifnet multicast_register_if;
|
|
static vifi_t reg_vif_num = VIFI_INVALID;
|
|
+#endif /* !VIMAGE */
|
|
|
|
/*
|
|
* Private variables.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static vifi_t numvifs;
|
|
+#endif /* !VIMAGE */
|
|
|
|
static u_long X_ip_mcast_src(int vifi);
|
|
static int X_ip_mforward(struct ip *ip, struct ifnet *ifp,
|
|
@@ -337,7 +369,7 @@
|
|
static void bw_upcalls_send(void);
|
|
static void schedule_bw_meter(struct bw_meter *x, struct timeval *nowp);
|
|
static void unschedule_bw_meter(struct bw_meter *x);
|
|
-static void bw_meter_process(void);
|
|
+static void bw_meter_process(struct vnet *vnet);
|
|
static void expire_bw_upcalls_send(void *);
|
|
static void expire_bw_meter_process(void *);
|
|
|
|
@@ -352,7 +384,9 @@
|
|
/*
|
|
* whether or not special PIM assert processing is enabled.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static int pim_assert;
|
|
+#endif /* !VIMAGE */
|
|
/*
|
|
* Rate limit for assert notification messages, in usec
|
|
*/
|
|
@@ -367,7 +401,9 @@
|
|
MRT_MFC_FLAGS_BORDER_VIF |
|
|
MRT_MFC_RP |
|
|
MRT_MFC_BW_UPCALL);
|
|
+#ifndef VIMAGE
|
|
static uint32_t mrt_api_config = 0;
|
|
+#endif /* !VIMAGE */
|
|
|
|
/*
|
|
* Hash function for a source, group entry
|
|
@@ -383,11 +419,12 @@
|
|
static struct mfc *
|
|
mfc_find(in_addr_t o, in_addr_t g)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *rt;
|
|
|
|
MFC_LOCK_ASSERT();
|
|
|
|
- for (rt = mfctable[MFCHASH(o,g)]; rt; rt = rt->mfc_next)
|
|
+ for (rt = V_mfctable[MFCHASH(o,g)]; rt; rt = rt->mfc_next)
|
|
if ((rt->mfc_origin.s_addr == o) &&
|
|
(rt->mfc_mcastgrp.s_addr == g) && (rt->mfc_stall == NULL))
|
|
break;
|
|
@@ -424,7 +461,8 @@
|
|
static int
|
|
X_ip_mrouter_set(struct socket *so, struct sockopt *sopt)
|
|
{
|
|
- INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_INET(so->so_vnet);
|
|
+ INIT_VNET_MROUTE(so->so_vnet);
|
|
int error, optval;
|
|
vifi_t vifi;
|
|
struct vifctl vifc;
|
|
@@ -468,7 +506,7 @@
|
|
* select data size depending on API version.
|
|
*/
|
|
if (sopt->sopt_name == MRT_ADD_MFC &&
|
|
- mrt_api_config & MRT_API_FLAGS_ALL) {
|
|
+ V_mrt_api_config & MRT_API_FLAGS_ALL) {
|
|
error = sooptcopyin(sopt, &mfc, sizeof(struct mfcctl2),
|
|
sizeof(struct mfcctl2));
|
|
} else {
|
|
@@ -525,6 +563,7 @@
|
|
static int
|
|
X_ip_mrouter_get(struct socket *so, struct sockopt *sopt)
|
|
{
|
|
+ INIT_VNET_MROUTE(so->so_vnet);
|
|
int error;
|
|
static int version = 0x0305; /* !!! why is this here? XXX */
|
|
|
|
@@ -534,7 +573,7 @@
|
|
break;
|
|
|
|
case MRT_ASSERT:
|
|
- error = sooptcopyout(sopt, &pim_assert, sizeof pim_assert);
|
|
+ error = sooptcopyout(sopt, &V_pim_assert, sizeof V_pim_assert);
|
|
break;
|
|
|
|
case MRT_API_SUPPORT:
|
|
@@ -542,7 +581,7 @@
|
|
break;
|
|
|
|
case MRT_API_CONFIG:
|
|
- error = sooptcopyout(sopt, &mrt_api_config, sizeof mrt_api_config);
|
|
+ error = sooptcopyout(sopt, &V_mrt_api_config, sizeof V_mrt_api_config);
|
|
break;
|
|
|
|
default:
|
|
@@ -590,6 +629,7 @@
|
|
static int
|
|
get_sg_cnt(struct sioc_sg_req *req)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *rt;
|
|
|
|
MFC_LOCK();
|
|
@@ -612,18 +652,19 @@
|
|
static int
|
|
get_vif_cnt(struct sioc_vif_req *req)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
vifi_t vifi = req->vifi;
|
|
|
|
VIF_LOCK();
|
|
- if (vifi >= numvifs) {
|
|
+ if (vifi >= V_numvifs) {
|
|
VIF_UNLOCK();
|
|
return EINVAL;
|
|
}
|
|
|
|
- req->icount = viftable[vifi].v_pkt_in;
|
|
- req->ocount = viftable[vifi].v_pkt_out;
|
|
- req->ibytes = viftable[vifi].v_bytes_in;
|
|
- req->obytes = viftable[vifi].v_bytes_out;
|
|
+ req->icount = V_viftable[vifi].v_pkt_in;
|
|
+ req->ocount = V_viftable[vifi].v_pkt_out;
|
|
+ req->ibytes = V_viftable[vifi].v_bytes_in;
|
|
+ req->obytes = V_viftable[vifi].v_bytes_out;
|
|
VIF_UNLOCK();
|
|
|
|
return 0;
|
|
@@ -632,24 +673,30 @@
|
|
static void
|
|
ip_mrouter_reset(void)
|
|
{
|
|
- bzero((caddr_t)mfctable, sizeof(mfctable));
|
|
- bzero((caddr_t)nexpire, sizeof(nexpire));
|
|
-
|
|
- pim_assert = 0;
|
|
- mrt_api_config = 0;
|
|
-
|
|
- callout_init(&expire_upcalls_ch, CALLOUT_MPSAFE);
|
|
-
|
|
- bw_upcalls_n = 0;
|
|
- bzero((caddr_t)bw_meter_timers, sizeof(bw_meter_timers));
|
|
- callout_init(&bw_upcalls_ch, CALLOUT_MPSAFE);
|
|
- callout_init(&bw_meter_ch, CALLOUT_MPSAFE);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
+ bzero((caddr_t)V_mfctable, sizeof(V_mfctable));
|
|
+ bzero((caddr_t)V_nexpire, sizeof(V_nexpire));
|
|
+ if (V_reg_vif_num != VIFI_INVALID)
|
|
+ IF_ADDR_LOCK_DESTROY(&V_multicast_register_if);
|
|
+ bzero(&V_multicast_register_if, sizeof(V_multicast_register_if));
|
|
+
|
|
+ V_reg_vif_num = VIFI_INVALID;
|
|
+ V_pim_assert = 0;
|
|
+ V_mrt_api_config = 0;
|
|
+
|
|
+ callout_init(&V_expire_upcalls_ch, CALLOUT_MPSAFE);
|
|
+
|
|
+ V_bw_upcalls_n = 0;
|
|
+ bzero((caddr_t)V_bw_meter_timers, sizeof(V_bw_meter_timers));
|
|
+ callout_init(&V_bw_upcalls_ch, CALLOUT_MPSAFE);
|
|
+ callout_init(&V_bw_meter_ch, CALLOUT_MPSAFE);
|
|
}
|
|
|
|
static void
|
|
if_detached_event(void *arg __unused, struct ifnet *ifp)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
vifi_t vifi;
|
|
int i;
|
|
struct mfc *mfc;
|
|
@@ -676,12 +723,12 @@
|
|
*/
|
|
VIF_LOCK();
|
|
MFC_LOCK();
|
|
- for (vifi = 0; vifi < numvifs; vifi++) {
|
|
- if (viftable[vifi].v_ifp != ifp)
|
|
+ for (vifi = 0; vifi < V_numvifs; vifi++) {
|
|
+ if (V_viftable[vifi].v_ifp != ifp)
|
|
continue;
|
|
for (i = 0; i < MFCTBLSIZ; i++) {
|
|
- ppmfc = &mfctable[i];
|
|
- for (mfc = mfctable[i]; mfc != NULL; ) {
|
|
+ ppmfc = &V_mfctable[i];
|
|
+ for (mfc = V_mfctable[i]; mfc != NULL; ) {
|
|
nmfc = mfc->mfc_next;
|
|
if (mfc->mfc_parent == vifi) {
|
|
for (pq = mfc->mfc_stall; pq != NULL; ) {
|
|
@@ -713,9 +760,10 @@
|
|
static int
|
|
ip_mrouter_init(struct socket *so, int version)
|
|
{
|
|
- INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_INET(so->so_vnet);
|
|
+ INIT_VNET_MROUTE(so->so_vnet);
|
|
|
|
- if (mrtdebug)
|
|
+ if (V_mrtdebug)
|
|
log(LOG_DEBUG, "ip_mrouter_init: so_type = %d, pr_protocol = %d\n",
|
|
so->so_type, so->so_proto->pr_protocol);
|
|
|
|
@@ -732,24 +780,25 @@
|
|
return EADDRINUSE;
|
|
}
|
|
|
|
- if_detach_event_tag = EVENTHANDLER_REGISTER(ifnet_departure_event,
|
|
+ V_if_detach_event_tag = EVENTHANDLER_REGISTER(ifnet_departure_event,
|
|
if_detached_event, NULL, EVENTHANDLER_PRI_ANY);
|
|
- if (if_detach_event_tag == NULL) {
|
|
+ if (V_if_detach_event_tag == NULL) {
|
|
MROUTER_UNLOCK();
|
|
return (ENOMEM);
|
|
}
|
|
|
|
- callout_reset(&expire_upcalls_ch, EXPIRE_TIMEOUT, expire_upcalls, NULL);
|
|
-
|
|
- callout_reset(&bw_upcalls_ch, BW_UPCALLS_PERIOD,
|
|
- expire_bw_upcalls_send, NULL);
|
|
- callout_reset(&bw_meter_ch, BW_METER_PERIOD, expire_bw_meter_process, NULL);
|
|
+ callout_reset(&V_expire_upcalls_ch, EXPIRE_TIMEOUT,
|
|
+ expire_upcalls, (void *)so->so_vnet);
|
|
+ callout_reset(&V_bw_upcalls_ch, BW_UPCALLS_PERIOD,
|
|
+ expire_bw_upcalls_send, (void *)so->so_vnet);
|
|
+ callout_reset(&V_bw_meter_ch, BW_METER_PERIOD,
|
|
+ expire_bw_meter_process, (void *)so->so_vnet);
|
|
|
|
V_ip_mrouter = so;
|
|
|
|
MROUTER_UNLOCK();
|
|
|
|
- if (mrtdebug)
|
|
+ if (V_mrtdebug)
|
|
log(LOG_DEBUG, "ip_mrouter_init\n");
|
|
|
|
return 0;
|
|
@@ -762,6 +811,7 @@
|
|
X_ip_mrouter_done(void)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
vifi_t vifi;
|
|
int i;
|
|
struct ifnet *ifp;
|
|
@@ -780,41 +830,41 @@
|
|
* Detach/disable hooks to the reset of the system.
|
|
*/
|
|
V_ip_mrouter = NULL;
|
|
- mrt_api_config = 0;
|
|
+ V_mrt_api_config = 0;
|
|
|
|
VIF_LOCK();
|
|
/*
|
|
* For each phyint in use, disable promiscuous reception of all IP
|
|
* multicasts.
|
|
*/
|
|
- for (vifi = 0; vifi < numvifs; vifi++) {
|
|
- if (viftable[vifi].v_lcl_addr.s_addr != 0 &&
|
|
- !(viftable[vifi].v_flags & (VIFF_TUNNEL | VIFF_REGISTER))) {
|
|
+ for (vifi = 0; vifi < V_numvifs; vifi++) {
|
|
+ if (V_viftable[vifi].v_lcl_addr.s_addr != 0 &&
|
|
+ !(V_viftable[vifi].v_flags & (VIFF_TUNNEL | VIFF_REGISTER))) {
|
|
struct sockaddr_in *so = (struct sockaddr_in *)&(ifr.ifr_addr);
|
|
|
|
so->sin_len = sizeof(struct sockaddr_in);
|
|
so->sin_family = AF_INET;
|
|
so->sin_addr.s_addr = INADDR_ANY;
|
|
- ifp = viftable[vifi].v_ifp;
|
|
+ ifp = V_viftable[vifi].v_ifp;
|
|
if_allmulti(ifp, 0);
|
|
}
|
|
}
|
|
- bzero((caddr_t)viftable, sizeof(viftable));
|
|
- numvifs = 0;
|
|
- pim_assert = 0;
|
|
+ bzero((caddr_t)V_viftable, sizeof(V_viftable));
|
|
+ V_numvifs = 0;
|
|
+ V_pim_assert = 0;
|
|
VIF_UNLOCK();
|
|
- EVENTHANDLER_DEREGISTER(ifnet_departure_event, if_detach_event_tag);
|
|
+ EVENTHANDLER_DEREGISTER(ifnet_departure_event, V_if_detach_event_tag);
|
|
|
|
/*
|
|
* Free all multicast forwarding cache entries.
|
|
*/
|
|
- callout_stop(&expire_upcalls_ch);
|
|
- callout_stop(&bw_upcalls_ch);
|
|
- callout_stop(&bw_meter_ch);
|
|
+ callout_stop(&V_expire_upcalls_ch);
|
|
+ callout_stop(&V_bw_upcalls_ch);
|
|
+ callout_stop(&V_bw_meter_ch);
|
|
|
|
MFC_LOCK();
|
|
for (i = 0; i < MFCTBLSIZ; i++) {
|
|
- for (rt = mfctable[i]; rt != NULL; ) {
|
|
+ for (rt = V_mfctable[i]; rt != NULL; ) {
|
|
struct mfc *nr = rt->mfc_next;
|
|
|
|
for (rte = rt->mfc_stall; rte != NULL; ) {
|
|
@@ -829,17 +879,19 @@
|
|
rt = nr;
|
|
}
|
|
}
|
|
- bzero((caddr_t)mfctable, sizeof(mfctable));
|
|
- bzero((caddr_t)nexpire, sizeof(nexpire));
|
|
- bw_upcalls_n = 0;
|
|
- bzero(bw_meter_timers, sizeof(bw_meter_timers));
|
|
+ bzero((caddr_t)V_mfctable, sizeof(V_mfctable));
|
|
+ bzero((caddr_t)V_nexpire, sizeof(V_nexpire));
|
|
+ V_bw_upcalls_n = 0;
|
|
+ bzero(V_bw_meter_timers, sizeof(V_bw_meter_timers));
|
|
MFC_UNLOCK();
|
|
|
|
- reg_vif_num = VIFI_INVALID;
|
|
+ if (V_reg_vif_num != VIFI_INVALID)
|
|
+ IF_ADDR_LOCK_DESTROY(&V_multicast_register_if);
|
|
+ V_reg_vif_num = VIFI_INVALID;
|
|
|
|
MROUTER_UNLOCK();
|
|
|
|
- if (mrtdebug)
|
|
+ if (V_mrtdebug)
|
|
log(LOG_DEBUG, "ip_mrouter_done\n");
|
|
|
|
return 0;
|
|
@@ -851,10 +903,11 @@
|
|
static int
|
|
set_assert(int i)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
if ((i != 1) && (i != 0))
|
|
return EINVAL;
|
|
|
|
- pim_assert = i;
|
|
+ V_pim_assert = i;
|
|
|
|
return 0;
|
|
}
|
|
@@ -865,6 +918,7 @@
|
|
int
|
|
set_api_config(uint32_t *apival)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int i;
|
|
|
|
/*
|
|
@@ -874,23 +928,23 @@
|
|
* - pim_assert is not enabled
|
|
* - the MFC table is empty
|
|
*/
|
|
- if (numvifs > 0) {
|
|
+ if (V_numvifs > 0) {
|
|
*apival = 0;
|
|
return EPERM;
|
|
}
|
|
- if (pim_assert) {
|
|
+ if (V_pim_assert) {
|
|
*apival = 0;
|
|
return EPERM;
|
|
}
|
|
for (i = 0; i < MFCTBLSIZ; i++) {
|
|
- if (mfctable[i] != NULL) {
|
|
+ if (V_mfctable[i] != NULL) {
|
|
*apival = 0;
|
|
return EPERM;
|
|
}
|
|
}
|
|
|
|
- mrt_api_config = *apival & mrt_api_support;
|
|
- *apival = mrt_api_config;
|
|
+ V_mrt_api_config = *apival & mrt_api_support;
|
|
+ *apival = V_mrt_api_config;
|
|
|
|
return 0;
|
|
}
|
|
@@ -901,7 +955,8 @@
|
|
static int
|
|
add_vif(struct vifctl *vifcp)
|
|
{
|
|
- struct vif *vifp = viftable + vifcp->vifc_vifi;
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
+ struct vif *vifp = V_viftable + vifcp->vifc_vifi;
|
|
struct sockaddr_in sin = {sizeof sin, AF_INET};
|
|
struct ifaddr *ifa;
|
|
struct ifnet *ifp;
|
|
@@ -950,14 +1005,19 @@
|
|
VIF_UNLOCK();
|
|
return EOPNOTSUPP;
|
|
} else if (vifcp->vifc_flags & VIFF_REGISTER) {
|
|
- ifp = &multicast_register_if;
|
|
- if (mrtdebug)
|
|
+ ifp = &V_multicast_register_if;
|
|
+ if (V_mrtdebug)
|
|
log(LOG_DEBUG, "Adding a register vif, ifp: %p\n",
|
|
- (void *)&multicast_register_if);
|
|
- if (reg_vif_num == VIFI_INVALID) {
|
|
- if_initname(&multicast_register_if, "register_vif", 0);
|
|
- multicast_register_if.if_flags = IFF_LOOPBACK;
|
|
- reg_vif_num = vifcp->vifc_vifi;
|
|
+ (void *)&V_multicast_register_if);
|
|
+ if (V_reg_vif_num == VIFI_INVALID) {
|
|
+ if_initname(&V_multicast_register_if, "register_vif", 0);
|
|
+ V_multicast_register_if.if_flags = IFF_LOOPBACK;
|
|
+ V_reg_vif_num = vifcp->vifc_vifi;
|
|
+ IF_ADDR_LOCK_INIT(&V_multicast_register_if);
|
|
+#ifdef VIMAGE
|
|
+ V_multicast_register_if.if_vnet = curvnet;
|
|
+ V_multicast_register_if.if_home_vnet = curvnet;
|
|
+#endif /* VIMAGE */
|
|
}
|
|
} else { /* Make sure the interface supports multicast */
|
|
if ((ifp->if_flags & IFF_MULTICAST) == 0) {
|
|
@@ -988,11 +1048,11 @@
|
|
bzero(&vifp->v_route, sizeof(vifp->v_route));
|
|
|
|
/* Adjust numvifs up if the vifi is higher than numvifs */
|
|
- if (numvifs <= vifcp->vifc_vifi) numvifs = vifcp->vifc_vifi + 1;
|
|
+ if (V_numvifs <= vifcp->vifc_vifi) V_numvifs = vifcp->vifc_vifi + 1;
|
|
|
|
VIF_UNLOCK();
|
|
|
|
- if (mrtdebug)
|
|
+ if (V_mrtdebug)
|
|
log(LOG_DEBUG, "add_vif #%d, lcladdr %lx, %s %lx, thresh %x\n",
|
|
vifcp->vifc_vifi,
|
|
(u_long)ntohl(vifcp->vifc_lcl_addr.s_addr),
|
|
@@ -1009,14 +1069,15 @@
|
|
static int
|
|
del_vif_locked(vifi_t vifi)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct vif *vifp;
|
|
|
|
VIF_LOCK_ASSERT();
|
|
|
|
- if (vifi >= numvifs) {
|
|
+ if (vifi >= V_numvifs) {
|
|
return EINVAL;
|
|
}
|
|
- vifp = &viftable[vifi];
|
|
+ vifp = &V_viftable[vifi];
|
|
if (vifp->v_lcl_addr.s_addr == INADDR_ANY) {
|
|
return EADDRNOTAVAIL;
|
|
}
|
|
@@ -1024,19 +1085,22 @@
|
|
if (!(vifp->v_flags & (VIFF_TUNNEL | VIFF_REGISTER)))
|
|
if_allmulti(vifp->v_ifp, 0);
|
|
|
|
- if (vifp->v_flags & VIFF_REGISTER)
|
|
- reg_vif_num = VIFI_INVALID;
|
|
+ if (vifp->v_flags & VIFF_REGISTER) {
|
|
+ if (V_reg_vif_num != VIFI_INVALID)
|
|
+ IF_ADDR_LOCK_DESTROY(&V_multicast_register_if);
|
|
+ V_reg_vif_num = VIFI_INVALID;
|
|
+ }
|
|
|
|
bzero((caddr_t)vifp, sizeof (*vifp));
|
|
|
|
- if (mrtdebug)
|
|
- log(LOG_DEBUG, "del_vif %d, numvifs %d\n", vifi, numvifs);
|
|
+ if (V_mrtdebug)
|
|
+ log(LOG_DEBUG, "del_vif %d, numvifs %d\n", vifi, V_numvifs);
|
|
|
|
/* Adjust numvifs down */
|
|
- for (vifi = numvifs; vifi > 0; vifi--)
|
|
- if (viftable[vifi-1].v_lcl_addr.s_addr != INADDR_ANY)
|
|
+ for (vifi = V_numvifs; vifi > 0; vifi--)
|
|
+ if (V_viftable[vifi-1].v_lcl_addr.s_addr != INADDR_ANY)
|
|
break;
|
|
- numvifs = vifi;
|
|
+ V_numvifs = vifi;
|
|
|
|
return 0;
|
|
}
|
|
@@ -1044,6 +1108,7 @@
|
|
static int
|
|
del_vif(vifi_t vifi)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int cc;
|
|
|
|
VIF_LOCK();
|
|
@@ -1059,16 +1124,17 @@
|
|
static void
|
|
update_mfc_params(struct mfc *rt, struct mfcctl2 *mfccp)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int i;
|
|
|
|
rt->mfc_parent = mfccp->mfcc_parent;
|
|
- for (i = 0; i < numvifs; i++) {
|
|
+ for (i = 0; i < V_numvifs; i++) {
|
|
rt->mfc_ttls[i] = mfccp->mfcc_ttls[i];
|
|
- rt->mfc_flags[i] = mfccp->mfcc_flags[i] & mrt_api_config &
|
|
+ rt->mfc_flags[i] = mfccp->mfcc_flags[i] & V_mrt_api_config &
|
|
MRT_MFC_FLAGS_ALL;
|
|
}
|
|
/* set the RP address */
|
|
- if (mrt_api_config & MRT_MFC_RP)
|
|
+ if (V_mrt_api_config & MRT_MFC_RP)
|
|
rt->mfc_rp = mfccp->mfcc_rp;
|
|
else
|
|
rt->mfc_rp.s_addr = INADDR_ANY;
|
|
@@ -1099,6 +1165,7 @@
|
|
static int
|
|
add_mfc(struct mfcctl2 *mfccp)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *rt;
|
|
u_long hash;
|
|
struct rtdetq *rte;
|
|
@@ -1111,7 +1178,7 @@
|
|
|
|
/* If an entry already exists, just update the fields */
|
|
if (rt) {
|
|
- if (mrtdebug & DEBUG_MFC)
|
|
+ if (V_mrtdebug & DEBUG_MFC)
|
|
log(LOG_DEBUG,"add_mfc update o %lx g %lx p %x\n",
|
|
(u_long)ntohl(mfccp->mfcc_origin.s_addr),
|
|
(u_long)ntohl(mfccp->mfcc_mcastgrp.s_addr),
|
|
@@ -1127,7 +1194,7 @@
|
|
* Find the entry for which the upcall was made and update
|
|
*/
|
|
hash = MFCHASH(mfccp->mfcc_origin.s_addr, mfccp->mfcc_mcastgrp.s_addr);
|
|
- for (rt = mfctable[hash], nstl = 0; rt; rt = rt->mfc_next) {
|
|
+ for (rt = V_mfctable[hash], nstl = 0; rt; rt = rt->mfc_next) {
|
|
|
|
if ((rt->mfc_origin.s_addr == mfccp->mfcc_origin.s_addr) &&
|
|
(rt->mfc_mcastgrp.s_addr == mfccp->mfcc_mcastgrp.s_addr) &&
|
|
@@ -1140,7 +1207,7 @@
|
|
(u_long)ntohl(mfccp->mfcc_mcastgrp.s_addr),
|
|
mfccp->mfcc_parent, (void *)rt->mfc_stall);
|
|
|
|
- if (mrtdebug & DEBUG_MFC)
|
|
+ if (V_mrtdebug & DEBUG_MFC)
|
|
log(LOG_DEBUG,"add_mfc o %lx g %lx p %x dbg %p\n",
|
|
(u_long)ntohl(mfccp->mfcc_origin.s_addr),
|
|
(u_long)ntohl(mfccp->mfcc_mcastgrp.s_addr),
|
|
@@ -1149,7 +1216,7 @@
|
|
init_mfc_params(rt, mfccp);
|
|
|
|
rt->mfc_expire = 0; /* Don't clean this guy up */
|
|
- nexpire[hash]--;
|
|
+ V_nexpire[hash]--;
|
|
|
|
/* free packets Qed at the end of this entry */
|
|
for (rte = rt->mfc_stall; rte != NULL; ) {
|
|
@@ -1168,18 +1235,18 @@
|
|
* It is possible that an entry is being inserted without an upcall
|
|
*/
|
|
if (nstl == 0) {
|
|
- if (mrtdebug & DEBUG_MFC)
|
|
+ if (V_mrtdebug & DEBUG_MFC)
|
|
log(LOG_DEBUG,"add_mfc no upcall h %lu o %lx g %lx p %x\n",
|
|
hash, (u_long)ntohl(mfccp->mfcc_origin.s_addr),
|
|
(u_long)ntohl(mfccp->mfcc_mcastgrp.s_addr),
|
|
mfccp->mfcc_parent);
|
|
|
|
- for (rt = mfctable[hash]; rt != NULL; rt = rt->mfc_next) {
|
|
+ for (rt = V_mfctable[hash]; rt != NULL; rt = rt->mfc_next) {
|
|
if ((rt->mfc_origin.s_addr == mfccp->mfcc_origin.s_addr) &&
|
|
(rt->mfc_mcastgrp.s_addr == mfccp->mfcc_mcastgrp.s_addr)) {
|
|
init_mfc_params(rt, mfccp);
|
|
if (rt->mfc_expire)
|
|
- nexpire[hash]--;
|
|
+ V_nexpire[hash]--;
|
|
rt->mfc_expire = 0;
|
|
break; /* XXX */
|
|
}
|
|
@@ -1198,8 +1265,8 @@
|
|
|
|
rt->mfc_bw_meter = NULL;
|
|
/* insert new entry at head of hash chain */
|
|
- rt->mfc_next = mfctable[hash];
|
|
- mfctable[hash] = rt;
|
|
+ rt->mfc_next = V_mfctable[hash];
|
|
+ V_mfctable[hash] = rt;
|
|
}
|
|
}
|
|
MFC_UNLOCK();
|
|
@@ -1213,6 +1280,7 @@
|
|
static int
|
|
del_mfc(struct mfcctl2 *mfccp)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct in_addr origin;
|
|
struct in_addr mcastgrp;
|
|
struct mfc *rt;
|
|
@@ -1223,14 +1291,14 @@
|
|
origin = mfccp->mfcc_origin;
|
|
mcastgrp = mfccp->mfcc_mcastgrp;
|
|
|
|
- if (mrtdebug & DEBUG_MFC)
|
|
+ if (V_mrtdebug & DEBUG_MFC)
|
|
log(LOG_DEBUG,"del_mfc orig %lx mcastgrp %lx\n",
|
|
(u_long)ntohl(origin.s_addr), (u_long)ntohl(mcastgrp.s_addr));
|
|
|
|
MFC_LOCK();
|
|
|
|
hash = MFCHASH(origin.s_addr, mcastgrp.s_addr);
|
|
- for (nptr = &mfctable[hash]; (rt = *nptr) != NULL; nptr = &rt->mfc_next)
|
|
+ for (nptr = &V_mfctable[hash]; (rt = *nptr) != NULL; nptr = &rt->mfc_next)
|
|
if (origin.s_addr == rt->mfc_origin.s_addr &&
|
|
mcastgrp.s_addr == rt->mfc_mcastgrp.s_addr &&
|
|
rt->mfc_stall == NULL)
|
|
@@ -1294,11 +1362,12 @@
|
|
struct ip_moptions *imo)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *rt;
|
|
int error;
|
|
vifi_t vifi;
|
|
|
|
- if (mrtdebug & DEBUG_FORWARD)
|
|
+ if (V_mrtdebug & DEBUG_FORWARD)
|
|
log(LOG_DEBUG, "ip_mforward: src %lx, dst %lx, ifp %p\n",
|
|
(u_long)ntohl(ip->ip_src.s_addr), (u_long)ntohl(ip->ip_dst.s_addr),
|
|
(void *)ifp);
|
|
@@ -1326,11 +1395,11 @@
|
|
|
|
VIF_LOCK();
|
|
MFC_LOCK();
|
|
- if (imo && ((vifi = imo->imo_multicast_vif) < numvifs)) {
|
|
+ if (imo && ((vifi = imo->imo_multicast_vif) < V_numvifs)) {
|
|
if (ip->ip_ttl < MAXTTL)
|
|
ip->ip_ttl++; /* compensate for -1 in *_send routines */
|
|
- if (rsvpdebug && ip->ip_p == IPPROTO_RSVP) {
|
|
- struct vif *vifp = viftable + vifi;
|
|
+ if (V_rsvpdebug && ip->ip_p == IPPROTO_RSVP) {
|
|
+ struct vif *vifp = V_viftable + vifi;
|
|
|
|
printf("Sending IPPROTO_RSVP from %lx to %lx on vif %d (%s%s)\n",
|
|
(long)ntohl(ip->ip_src.s_addr), (long)ntohl(ip->ip_dst.s_addr),
|
|
@@ -1343,7 +1412,7 @@
|
|
VIF_UNLOCK();
|
|
return error;
|
|
}
|
|
- if (rsvpdebug && ip->ip_p == IPPROTO_RSVP) {
|
|
+ if (V_rsvpdebug && ip->ip_p == IPPROTO_RSVP) {
|
|
printf("Warning: IPPROTO_RSVP from %lx to %lx without vif option\n",
|
|
(long)ntohl(ip->ip_src.s_addr), (long)ntohl(ip->ip_dst.s_addr));
|
|
if (!imo)
|
|
@@ -1363,7 +1432,7 @@
|
|
/*
|
|
* Determine forwarding vifs from the forwarding cache table
|
|
*/
|
|
- ++mrtstat.mrts_mfc_lookups;
|
|
+ ++V_mrtstat.mrts_mfc_lookups;
|
|
rt = mfc_find(ip->ip_src.s_addr, ip->ip_dst.s_addr);
|
|
|
|
/* Entry exists, so forward if necessary */
|
|
@@ -1383,10 +1452,10 @@
|
|
u_long hash;
|
|
int hlen = ip->ip_hl << 2;
|
|
|
|
- ++mrtstat.mrts_mfc_misses;
|
|
+ ++V_mrtstat.mrts_mfc_misses;
|
|
|
|
- mrtstat.mrts_no_route++;
|
|
- if (mrtdebug & (DEBUG_FORWARD | DEBUG_MFC))
|
|
+ V_mrtstat.mrts_no_route++;
|
|
+ if (V_mrtdebug & (DEBUG_FORWARD | DEBUG_MFC))
|
|
log(LOG_DEBUG, "ip_mforward: no rte s %lx g %lx\n",
|
|
(u_long)ntohl(ip->ip_src.s_addr),
|
|
(u_long)ntohl(ip->ip_dst.s_addr));
|
|
@@ -1414,7 +1483,7 @@
|
|
|
|
/* is there an upcall waiting for this flow ? */
|
|
hash = MFCHASH(ip->ip_src.s_addr, ip->ip_dst.s_addr);
|
|
- for (rt = mfctable[hash]; rt; rt = rt->mfc_next) {
|
|
+ for (rt = V_mfctable[hash]; rt; rt = rt->mfc_next) {
|
|
if ((ip->ip_src.s_addr == rt->mfc_origin.s_addr) &&
|
|
(ip->ip_dst.s_addr == rt->mfc_mcastgrp.s_addr) &&
|
|
(rt->mfc_stall != NULL))
|
|
@@ -1431,9 +1500,9 @@
|
|
* Locate the vifi for the incoming interface for this packet.
|
|
* If none found, drop packet.
|
|
*/
|
|
- for (vifi=0; vifi < numvifs && viftable[vifi].v_ifp != ifp; vifi++)
|
|
+ for (vifi=0; vifi < V_numvifs && V_viftable[vifi].v_ifp != ifp; vifi++)
|
|
;
|
|
- if (vifi >= numvifs) /* vif not found, drop packet */
|
|
+ if (vifi >= V_numvifs) /* vif not found, drop packet */
|
|
goto non_fatal;
|
|
|
|
/* no upcall, so make a new entry */
|
|
@@ -1455,12 +1524,12 @@
|
|
im->im_mbz = 0;
|
|
im->im_vif = vifi;
|
|
|
|
- mrtstat.mrts_upcalls++;
|
|
+ V_mrtstat.mrts_upcalls++;
|
|
|
|
k_igmpsrc.sin_addr = ip->ip_src;
|
|
if (socket_send(V_ip_mrouter, mm, &k_igmpsrc) < 0) {
|
|
log(LOG_WARNING, "ip_mforward: ip_mrouter socket queue full\n");
|
|
- ++mrtstat.mrts_upq_sockfull;
|
|
+ ++V_mrtstat.mrts_upq_sockfull;
|
|
fail1:
|
|
free(rt, M_MRTABLE);
|
|
fail:
|
|
@@ -1475,8 +1544,8 @@
|
|
rt->mfc_origin.s_addr = ip->ip_src.s_addr;
|
|
rt->mfc_mcastgrp.s_addr = ip->ip_dst.s_addr;
|
|
rt->mfc_expire = UPCALL_EXPIRE;
|
|
- nexpire[hash]++;
|
|
- for (i = 0; i < numvifs; i++) {
|
|
+ V_nexpire[hash]++;
|
|
+ for (i = 0; i < V_numvifs; i++) {
|
|
rt->mfc_ttls[i] = 0;
|
|
rt->mfc_flags[i] = 0;
|
|
}
|
|
@@ -1487,8 +1556,8 @@
|
|
rt->mfc_bw_meter = NULL;
|
|
|
|
/* link into table */
|
|
- rt->mfc_next = mfctable[hash];
|
|
- mfctable[hash] = rt;
|
|
+ rt->mfc_next = V_mfctable[hash];
|
|
+ V_mfctable[hash] = rt;
|
|
rt->mfc_stall = rte;
|
|
|
|
} else {
|
|
@@ -1505,7 +1574,7 @@
|
|
npkts++;
|
|
|
|
if (npkts > MAX_UPQ) {
|
|
- mrtstat.mrts_upq_ovflw++;
|
|
+ V_mrtstat.mrts_upq_ovflw++;
|
|
non_fatal:
|
|
free(rte, M_MRTABLE);
|
|
m_freem(mb0);
|
|
@@ -1535,15 +1604,16 @@
|
|
static void
|
|
expire_upcalls(void *unused)
|
|
{
|
|
+ INIT_VNET_MROUTE( ((struct vnet *)unused) );
|
|
struct rtdetq *rte;
|
|
struct mfc *mfc, **nptr;
|
|
int i;
|
|
|
|
MFC_LOCK();
|
|
for (i = 0; i < MFCTBLSIZ; i++) {
|
|
- if (nexpire[i] == 0)
|
|
+ if (V_nexpire[i] == 0)
|
|
continue;
|
|
- nptr = &mfctable[i];
|
|
+ nptr = &V_mfctable[i];
|
|
for (mfc = *nptr; mfc != NULL; mfc = *nptr) {
|
|
/*
|
|
* Skip real cache entries
|
|
@@ -1552,7 +1622,7 @@
|
|
*/
|
|
if (mfc->mfc_stall != NULL && mfc->mfc_expire != 0 &&
|
|
--mfc->mfc_expire == 0) {
|
|
- if (mrtdebug & DEBUG_EXPIRE)
|
|
+ if (V_mrtdebug & DEBUG_EXPIRE)
|
|
log(LOG_DEBUG, "expire_upcalls: expiring (%lx %lx)\n",
|
|
(u_long)ntohl(mfc->mfc_origin.s_addr),
|
|
(u_long)ntohl(mfc->mfc_mcastgrp.s_addr));
|
|
@@ -1567,8 +1637,8 @@
|
|
free(rte, M_MRTABLE);
|
|
rte = n;
|
|
}
|
|
- ++mrtstat.mrts_cache_cleanups;
|
|
- nexpire[i]--;
|
|
+ ++V_mrtstat.mrts_cache_cleanups;
|
|
+ V_nexpire[i]--;
|
|
|
|
/*
|
|
* free the bw_meter entries
|
|
@@ -1587,9 +1657,8 @@
|
|
}
|
|
}
|
|
}
|
|
+ callout_reset(&V_expire_upcalls_ch, EXPIRE_TIMEOUT, expire_upcalls, unused);
|
|
MFC_UNLOCK();
|
|
-
|
|
- callout_reset(&expire_upcalls_ch, EXPIRE_TIMEOUT, expire_upcalls, NULL);
|
|
}
|
|
|
|
/*
|
|
@@ -1599,6 +1668,7 @@
|
|
ip_mdq(struct mbuf *m, struct ifnet *ifp, struct mfc *rt, vifi_t xmt_vif)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct ip *ip = mtod(m, struct ip *);
|
|
vifi_t vifi;
|
|
int plen = ip->ip_len;
|
|
@@ -1610,11 +1680,11 @@
|
|
*
|
|
* (since vifi_t is u_short, -1 becomes MAXUSHORT, which > numvifs.)
|
|
*/
|
|
- if (xmt_vif < numvifs) {
|
|
- if (viftable[xmt_vif].v_flags & VIFF_REGISTER)
|
|
- pim_register_send(ip, viftable + xmt_vif, m, rt);
|
|
+ if (xmt_vif < V_numvifs) {
|
|
+ if (V_viftable[xmt_vif].v_flags & VIFF_REGISTER)
|
|
+ pim_register_send(ip, V_viftable + xmt_vif, m, rt);
|
|
else
|
|
- phyint_send(ip, viftable + xmt_vif, m);
|
|
+ phyint_send(ip, V_viftable + xmt_vif, m);
|
|
return 1;
|
|
}
|
|
|
|
@@ -1622,12 +1692,12 @@
|
|
* Don't forward if it didn't arrive from the parent vif for its origin.
|
|
*/
|
|
vifi = rt->mfc_parent;
|
|
- if ((vifi >= numvifs) || (viftable[vifi].v_ifp != ifp)) {
|
|
+ if ((vifi >= V_numvifs) || (V_viftable[vifi].v_ifp != ifp)) {
|
|
/* came in the wrong interface */
|
|
- if (mrtdebug & DEBUG_FORWARD)
|
|
+ if (V_mrtdebug & DEBUG_FORWARD)
|
|
log(LOG_DEBUG, "wrong if: ifp %p vifi %d vififp %p\n",
|
|
- (void *)ifp, vifi, (void *)viftable[vifi].v_ifp);
|
|
- ++mrtstat.mrts_wrong_if;
|
|
+ (void *)ifp, vifi, (void *)V_viftable[vifi].v_ifp);
|
|
+ ++V_mrtstat.mrts_wrong_if;
|
|
++rt->mfc_wrong_if;
|
|
/*
|
|
* If we are doing PIM assert processing, send a message
|
|
@@ -1637,17 +1707,18 @@
|
|
* can complete the SPT switch, regardless of the type
|
|
* of the iif (broadcast media, GRE tunnel, etc).
|
|
*/
|
|
- if (pim_assert && (vifi < numvifs) && viftable[vifi].v_ifp) {
|
|
+ if (V_pim_assert && (vifi < V_numvifs) && V_viftable[vifi].v_ifp) {
|
|
struct timeval now;
|
|
u_long delta;
|
|
|
|
- if (ifp == &multicast_register_if)
|
|
- pimstat.pims_rcv_registers_wrongiif++;
|
|
+ if (ifp == &V_multicast_register_if)
|
|
+ V_pimstat.pims_rcv_registers_wrongiif++;
|
|
|
|
/* Get vifi for the incoming packet */
|
|
- for (vifi=0; vifi < numvifs && viftable[vifi].v_ifp != ifp; vifi++)
|
|
+ for (vifi=0; vifi < V_numvifs && V_viftable[vifi].v_ifp != ifp;
|
|
+ vifi++)
|
|
;
|
|
- if (vifi >= numvifs)
|
|
+ if (vifi >= V_numvifs)
|
|
return 0; /* The iif is not found: ignore the packet. */
|
|
|
|
if (rt->mfc_flags[vifi] & MRT_MFC_FLAGS_DISABLE_WRONGVIF)
|
|
@@ -1675,13 +1746,13 @@
|
|
im->im_mbz = 0;
|
|
im->im_vif = vifi;
|
|
|
|
- mrtstat.mrts_upcalls++;
|
|
+ V_mrtstat.mrts_upcalls++;
|
|
|
|
k_igmpsrc.sin_addr = im->im_src;
|
|
if (socket_send(V_ip_mrouter, mm, &k_igmpsrc) < 0) {
|
|
log(LOG_WARNING,
|
|
"ip_mforward: ip_mrouter socket queue full\n");
|
|
- ++mrtstat.mrts_upq_sockfull;
|
|
+ ++V_mrtstat.mrts_upq_sockfull;
|
|
return ENOBUFS;
|
|
}
|
|
}
|
|
@@ -1690,12 +1761,12 @@
|
|
}
|
|
|
|
/* If I sourced this packet, it counts as output, else it was input. */
|
|
- if (ip->ip_src.s_addr == viftable[vifi].v_lcl_addr.s_addr) {
|
|
- viftable[vifi].v_pkt_out++;
|
|
- viftable[vifi].v_bytes_out += plen;
|
|
+ if (ip->ip_src.s_addr == V_viftable[vifi].v_lcl_addr.s_addr) {
|
|
+ V_viftable[vifi].v_pkt_out++;
|
|
+ V_viftable[vifi].v_bytes_out += plen;
|
|
} else {
|
|
- viftable[vifi].v_pkt_in++;
|
|
- viftable[vifi].v_bytes_in += plen;
|
|
+ V_viftable[vifi].v_pkt_in++;
|
|
+ V_viftable[vifi].v_bytes_in += plen;
|
|
}
|
|
rt->mfc_pkt_cnt++;
|
|
rt->mfc_byte_cnt += plen;
|
|
@@ -1706,14 +1777,14 @@
|
|
* - the ttl exceeds the vif's threshold
|
|
* - there are group members downstream on interface
|
|
*/
|
|
- for (vifi = 0; vifi < numvifs; vifi++)
|
|
+ for (vifi = 0; vifi < V_numvifs; vifi++)
|
|
if ((rt->mfc_ttls[vifi] > 0) && (ip->ip_ttl > rt->mfc_ttls[vifi])) {
|
|
- viftable[vifi].v_pkt_out++;
|
|
- viftable[vifi].v_bytes_out += plen;
|
|
- if (viftable[vifi].v_flags & VIFF_REGISTER)
|
|
- pim_register_send(ip, viftable + vifi, m, rt);
|
|
+ V_viftable[vifi].v_pkt_out++;
|
|
+ V_viftable[vifi].v_bytes_out += plen;
|
|
+ if (V_viftable[vifi].v_flags & VIFF_REGISTER)
|
|
+ pim_register_send(ip, V_viftable + vifi, m, rt);
|
|
else
|
|
- phyint_send(ip, viftable + vifi, m);
|
|
+ phyint_send(ip, V_viftable + vifi, m);
|
|
}
|
|
|
|
/*
|
|
@@ -1738,8 +1809,9 @@
|
|
static int
|
|
X_legal_vif_num(int vif)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
/* XXX unlocked, matter? */
|
|
- return (vif >= 0 && vif < numvifs);
|
|
+ return (vif >= 0 && vif < V_numvifs);
|
|
}
|
|
|
|
/*
|
|
@@ -1748,9 +1820,10 @@
|
|
static u_long
|
|
X_ip_mcast_src(int vifi)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
/* XXX unlocked, matter? */
|
|
- if (vifi >= 0 && vifi < numvifs)
|
|
- return viftable[vifi].v_lcl_addr.s_addr;
|
|
+ if (vifi >= 0 && vifi < V_numvifs)
|
|
+ return V_viftable[vifi].v_lcl_addr.s_addr;
|
|
else
|
|
return INADDR_ANY;
|
|
}
|
|
@@ -1780,6 +1853,7 @@
|
|
static void
|
|
send_packet(struct vif *vifp, struct mbuf *m)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct ip_moptions imo;
|
|
struct in_multi *imm[2];
|
|
int error;
|
|
@@ -1801,16 +1875,17 @@
|
|
* the loopback interface, thus preventing looping.
|
|
*/
|
|
error = ip_output(m, NULL, &vifp->v_route, IP_FORWARDING, &imo, NULL);
|
|
- if (mrtdebug & DEBUG_XMIT) {
|
|
+ if (V_mrtdebug & DEBUG_XMIT) {
|
|
log(LOG_DEBUG, "phyint_send on vif %td err %d\n",
|
|
- vifp - viftable, error);
|
|
+ vifp - V_viftable, error);
|
|
}
|
|
}
|
|
|
|
static int
|
|
X_ip_rsvp_vif(struct socket *so, struct sockopt *sopt)
|
|
{
|
|
- INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_INET(so->so_vnet);
|
|
+ INIT_VNET_MROUTE(so->so_vnet);
|
|
int error, vifi;
|
|
|
|
if (so->so_type != SOCK_RAW || so->so_proto->pr_protocol != IPPROTO_RSVP)
|
|
@@ -1822,39 +1897,39 @@
|
|
|
|
VIF_LOCK();
|
|
|
|
- if (vifi < 0 || vifi >= numvifs) { /* Error if vif is invalid */
|
|
+ if (vifi < 0 || vifi >= V_numvifs) { /* Error if vif is invalid */
|
|
VIF_UNLOCK();
|
|
return EADDRNOTAVAIL;
|
|
}
|
|
|
|
if (sopt->sopt_name == IP_RSVP_VIF_ON) {
|
|
/* Check if socket is available. */
|
|
- if (viftable[vifi].v_rsvpd != NULL) {
|
|
+ if (V_viftable[vifi].v_rsvpd != NULL) {
|
|
VIF_UNLOCK();
|
|
return EADDRINUSE;
|
|
}
|
|
|
|
- viftable[vifi].v_rsvpd = so;
|
|
+ V_viftable[vifi].v_rsvpd = so;
|
|
/* This may seem silly, but we need to be sure we don't over-increment
|
|
* the RSVP counter, in case something slips up.
|
|
*/
|
|
- if (!viftable[vifi].v_rsvp_on) {
|
|
- viftable[vifi].v_rsvp_on = 1;
|
|
+ if (!V_viftable[vifi].v_rsvp_on) {
|
|
+ V_viftable[vifi].v_rsvp_on = 1;
|
|
V_rsvp_on++;
|
|
}
|
|
} else { /* must be VIF_OFF */
|
|
/*
|
|
* XXX as an additional consistency check, one could make sure
|
|
- * that viftable[vifi].v_rsvpd == so, otherwise passing so as
|
|
+ * that V_viftable[vifi].v_rsvpd == so, otherwise passing so as
|
|
* first parameter is pretty useless.
|
|
*/
|
|
- viftable[vifi].v_rsvpd = NULL;
|
|
+ V_viftable[vifi].v_rsvpd = NULL;
|
|
/*
|
|
* This may seem silly, but we need to be sure we don't over-decrement
|
|
* the RSVP counter, in case something slips up.
|
|
*/
|
|
- if (viftable[vifi].v_rsvp_on) {
|
|
- viftable[vifi].v_rsvp_on = 0;
|
|
+ if (V_viftable[vifi].v_rsvp_on) {
|
|
+ V_viftable[vifi].v_rsvp_on = 0;
|
|
V_rsvp_on--;
|
|
}
|
|
}
|
|
@@ -1865,7 +1940,8 @@
|
|
static void
|
|
X_ip_rsvp_force_done(struct socket *so)
|
|
{
|
|
- INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_INET(so->so_vnet);
|
|
+ INIT_VNET_MROUTE(so->so_vnet);
|
|
int vifi;
|
|
|
|
/* Don't bother if it is not the right type of socket. */
|
|
@@ -1877,14 +1953,14 @@
|
|
/* The socket may be attached to more than one vif...this
|
|
* is perfectly legal.
|
|
*/
|
|
- for (vifi = 0; vifi < numvifs; vifi++) {
|
|
- if (viftable[vifi].v_rsvpd == so) {
|
|
- viftable[vifi].v_rsvpd = NULL;
|
|
+ for (vifi = 0; vifi < V_numvifs; vifi++) {
|
|
+ if (V_viftable[vifi].v_rsvpd == so) {
|
|
+ V_viftable[vifi].v_rsvpd = NULL;
|
|
/* This may seem silly, but we need to be sure we don't
|
|
* over-decrement the RSVP counter, in case something slips up.
|
|
*/
|
|
- if (viftable[vifi].v_rsvp_on) {
|
|
- viftable[vifi].v_rsvp_on = 0;
|
|
+ if (V_viftable[vifi].v_rsvp_on) {
|
|
+ V_viftable[vifi].v_rsvp_on = 0;
|
|
V_rsvp_on--;
|
|
}
|
|
}
|
|
@@ -1897,12 +1973,13 @@
|
|
X_rsvp_input(struct mbuf *m, int off)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int vifi;
|
|
struct ip *ip = mtod(m, struct ip *);
|
|
struct sockaddr_in rsvp_src = { sizeof rsvp_src, AF_INET };
|
|
struct ifnet *ifp;
|
|
|
|
- if (rsvpdebug)
|
|
+ if (V_rsvpdebug)
|
|
printf("rsvp_input: rsvp_on %d\n", V_rsvp_on);
|
|
|
|
/* Can still get packets with rsvp_on = 0 if there is a local member
|
|
@@ -1914,7 +1991,7 @@
|
|
return;
|
|
}
|
|
|
|
- if (rsvpdebug)
|
|
+ if (V_rsvpdebug)
|
|
printf("rsvp_input: check vifs\n");
|
|
|
|
#ifdef DIAGNOSTIC
|
|
@@ -1925,14 +2002,14 @@
|
|
|
|
VIF_LOCK();
|
|
/* Find which vif the packet arrived on. */
|
|
- for (vifi = 0; vifi < numvifs; vifi++)
|
|
- if (viftable[vifi].v_ifp == ifp)
|
|
+ for (vifi = 0; vifi < V_numvifs; vifi++)
|
|
+ if (V_viftable[vifi].v_ifp == ifp)
|
|
break;
|
|
|
|
- if (vifi == numvifs || viftable[vifi].v_rsvpd == NULL) {
|
|
+ if (vifi == V_numvifs || V_viftable[vifi].v_rsvpd == NULL) {
|
|
/*
|
|
* Drop the lock here to avoid holding it across rip_input.
|
|
- * This could make rsvpdebug printfs wrong. If you care,
|
|
+ * This could make V_rsvpdebug printfs wrong. If you care,
|
|
* record the state of stuff before dropping the lock.
|
|
*/
|
|
VIF_UNLOCK();
|
|
@@ -1942,13 +2019,13 @@
|
|
* is no specific socket for this vif.
|
|
*/
|
|
if (V_ip_rsvpd != NULL) {
|
|
- if (rsvpdebug)
|
|
+ if (V_rsvpdebug)
|
|
printf("rsvp_input: Sending packet up old-style socket\n");
|
|
rip_input(m, off); /* xxx */
|
|
} else {
|
|
- if (rsvpdebug && vifi == numvifs)
|
|
+ if (V_rsvpdebug && vifi == V_numvifs)
|
|
printf("rsvp_input: Can't find vif for packet.\n");
|
|
- else if (rsvpdebug && viftable[vifi].v_rsvpd == NULL)
|
|
+ else if (V_rsvpdebug && V_viftable[vifi].v_rsvpd == NULL)
|
|
printf("rsvp_input: No socket defined for vif %d\n",vifi);
|
|
m_freem(m);
|
|
}
|
|
@@ -1956,15 +2033,15 @@
|
|
}
|
|
rsvp_src.sin_addr = ip->ip_src;
|
|
|
|
- if (rsvpdebug && m)
|
|
+ if (V_rsvpdebug && m)
|
|
printf("rsvp_input: m->m_len = %d, sbspace() = %ld\n",
|
|
- m->m_len,sbspace(&(viftable[vifi].v_rsvpd->so_rcv)));
|
|
+ m->m_len,sbspace(&(V_viftable[vifi].v_rsvpd->so_rcv)));
|
|
|
|
- if (socket_send(viftable[vifi].v_rsvpd, m, &rsvp_src) < 0) {
|
|
- if (rsvpdebug)
|
|
+ if (socket_send(V_viftable[vifi].v_rsvpd, m, &rsvp_src) < 0) {
|
|
+ if (V_rsvpdebug)
|
|
printf("rsvp_input: Failed to append to socket\n");
|
|
} else {
|
|
- if (rsvpdebug)
|
|
+ if (V_rsvpdebug)
|
|
printf("rsvp_input: send packet up\n");
|
|
}
|
|
VIF_UNLOCK();
|
|
@@ -2004,6 +2081,7 @@
|
|
static int
|
|
add_bw_upcall(struct bw_upcall *req)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *mfc;
|
|
struct timeval delta = { BW_UPCALL_THRESHOLD_INTERVAL_MIN_SEC,
|
|
BW_UPCALL_THRESHOLD_INTERVAL_MIN_USEC };
|
|
@@ -2011,7 +2089,7 @@
|
|
struct bw_meter *x;
|
|
uint32_t flags;
|
|
|
|
- if (!(mrt_api_config & MRT_MFC_BW_UPCALL))
|
|
+ if (!(V_mrt_api_config & MRT_MFC_BW_UPCALL))
|
|
return EOPNOTSUPP;
|
|
|
|
/* Test if the flags are valid */
|
|
@@ -2096,10 +2174,11 @@
|
|
static int
|
|
del_bw_upcall(struct bw_upcall *req)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mfc *mfc;
|
|
struct bw_meter *x;
|
|
|
|
- if (!(mrt_api_config & MRT_MFC_BW_UPCALL))
|
|
+ if (!(V_mrt_api_config & MRT_MFC_BW_UPCALL))
|
|
return EOPNOTSUPP;
|
|
|
|
MFC_LOCK();
|
|
@@ -2252,6 +2331,7 @@
|
|
static void
|
|
bw_meter_prepare_upcall(struct bw_meter *x, struct timeval *nowp)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct timeval delta;
|
|
struct bw_upcall *u;
|
|
|
|
@@ -2266,13 +2346,13 @@
|
|
/*
|
|
* If there are too many pending upcalls, deliver them now
|
|
*/
|
|
- if (bw_upcalls_n >= BW_UPCALLS_MAX)
|
|
+ if (V_bw_upcalls_n >= BW_UPCALLS_MAX)
|
|
bw_upcalls_send();
|
|
|
|
/*
|
|
* Set the bw_upcall entry
|
|
*/
|
|
- u = &bw_upcalls[bw_upcalls_n++];
|
|
+ u = &V_bw_upcalls[V_bw_upcalls_n++];
|
|
u->bu_src = x->bm_mfc->mfc_origin;
|
|
u->bu_dst = x->bm_mfc->mfc_mcastgrp;
|
|
u->bu_threshold.b_time = x->bm_threshold.b_time;
|
|
@@ -2299,8 +2379,9 @@
|
|
bw_upcalls_send(void)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mbuf *m;
|
|
- int len = bw_upcalls_n * sizeof(bw_upcalls[0]);
|
|
+ int len = V_bw_upcalls_n * sizeof(V_bw_upcalls[0]);
|
|
struct sockaddr_in k_igmpsrc = { sizeof k_igmpsrc, AF_INET };
|
|
static struct igmpmsg igmpmsg = { 0, /* unused1 */
|
|
0, /* unused2 */
|
|
@@ -2313,10 +2394,10 @@
|
|
|
|
MFC_LOCK_ASSERT();
|
|
|
|
- if (bw_upcalls_n == 0)
|
|
+ if (V_bw_upcalls_n == 0)
|
|
return; /* No pending upcalls */
|
|
|
|
- bw_upcalls_n = 0;
|
|
+ V_bw_upcalls_n = 0;
|
|
|
|
/*
|
|
* Allocate a new mbuf, initialize it with the header and
|
|
@@ -2330,16 +2411,16 @@
|
|
|
|
m->m_len = m->m_pkthdr.len = 0;
|
|
m_copyback(m, 0, sizeof(struct igmpmsg), (caddr_t)&igmpmsg);
|
|
- m_copyback(m, sizeof(struct igmpmsg), len, (caddr_t)&bw_upcalls[0]);
|
|
+ m_copyback(m, sizeof(struct igmpmsg), len, (caddr_t)&V_bw_upcalls[0]);
|
|
|
|
/*
|
|
* Send the upcalls
|
|
* XXX do we need to set the address in k_igmpsrc ?
|
|
*/
|
|
- mrtstat.mrts_upcalls++;
|
|
+ V_mrtstat.mrts_upcalls++;
|
|
if (socket_send(V_ip_mrouter, m, &k_igmpsrc) < 0) {
|
|
log(LOG_WARNING, "bw_upcalls_send: ip_mrouter socket queue full\n");
|
|
- ++mrtstat.mrts_upq_sockfull;
|
|
+ ++V_mrtstat.mrts_upq_sockfull;
|
|
}
|
|
}
|
|
|
|
@@ -2364,6 +2445,7 @@
|
|
static void
|
|
schedule_bw_meter(struct bw_meter *x, struct timeval *nowp)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int time_hash;
|
|
|
|
MFC_LOCK_ASSERT();
|
|
@@ -2383,8 +2465,8 @@
|
|
* Compute the timeout hash value and insert the entry
|
|
*/
|
|
BW_METER_TIMEHASH(x, time_hash);
|
|
- x->bm_time_next = bw_meter_timers[time_hash];
|
|
- bw_meter_timers[time_hash] = x;
|
|
+ x->bm_time_next = V_bw_meter_timers[time_hash];
|
|
+ V_bw_meter_timers[time_hash] = x;
|
|
x->bm_time_hash = time_hash;
|
|
}
|
|
|
|
@@ -2395,6 +2477,7 @@
|
|
static void
|
|
unschedule_bw_meter(struct bw_meter *x)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
int time_hash;
|
|
struct bw_meter *prev, *tmp;
|
|
|
|
@@ -2410,7 +2493,7 @@
|
|
if (time_hash >= BW_METER_BUCKETS)
|
|
return; /* Entry was not scheduled */
|
|
|
|
- for (prev = NULL, tmp = bw_meter_timers[time_hash];
|
|
+ for (prev = NULL, tmp = V_bw_meter_timers[time_hash];
|
|
tmp != NULL; prev = tmp, tmp = tmp->bm_time_next)
|
|
if (tmp == x)
|
|
break;
|
|
@@ -2421,7 +2504,7 @@
|
|
if (prev != NULL)
|
|
prev->bm_time_next = x->bm_time_next;
|
|
else
|
|
- bw_meter_timers[time_hash] = x->bm_time_next;
|
|
+ V_bw_meter_timers[time_hash] = x->bm_time_next;
|
|
|
|
x->bm_time_next = NULL;
|
|
x->bm_time_hash = BW_METER_BUCKETS;
|
|
@@ -2438,8 +2521,9 @@
|
|
* looking at.
|
|
*/
|
|
static void
|
|
-bw_meter_process()
|
|
+bw_meter_process(struct vnet *vnet)
|
|
{
|
|
+ INIT_VNET_MROUTE(vnet);
|
|
static uint32_t last_tv_sec; /* last time we processed this */
|
|
|
|
uint32_t loops;
|
|
@@ -2456,6 +2540,7 @@
|
|
loops = BW_METER_BUCKETS;
|
|
|
|
MFC_LOCK();
|
|
+ CURVNET_SET(vnet);
|
|
/*
|
|
* Process all bins of bw_meter entries from the one after the last
|
|
* processed to the current one. On entry, i points to the last bucket
|
|
@@ -2468,8 +2553,8 @@
|
|
i = 0;
|
|
|
|
/* Disconnect the list of bw_meter entries from the bin */
|
|
- tmp_list = bw_meter_timers[i];
|
|
- bw_meter_timers[i] = NULL;
|
|
+ tmp_list = V_bw_meter_timers[i];
|
|
+ V_bw_meter_timers[i] = NULL;
|
|
|
|
/* Process the list of bw_meter entries */
|
|
while (tmp_list != NULL) {
|
|
@@ -2492,8 +2577,8 @@
|
|
if (++time_hash >= BW_METER_BUCKETS)
|
|
time_hash = 0;
|
|
}
|
|
- x->bm_time_next = bw_meter_timers[time_hash];
|
|
- bw_meter_timers[time_hash] = x;
|
|
+ x->bm_time_next = V_bw_meter_timers[time_hash];
|
|
+ V_bw_meter_timers[time_hash] = x;
|
|
x->bm_time_hash = time_hash;
|
|
|
|
continue;
|
|
@@ -2520,6 +2605,7 @@
|
|
/* Send all upcalls that are pending delivery */
|
|
bw_upcalls_send();
|
|
|
|
+ CURVNET_RESTORE();
|
|
MFC_UNLOCK();
|
|
}
|
|
|
|
@@ -2529,12 +2615,14 @@
|
|
static void
|
|
expire_bw_upcalls_send(void *unused)
|
|
{
|
|
+ INIT_VNET_MROUTE( (struct vnet *)unused );
|
|
MFC_LOCK();
|
|
+ CURVNET_SET( (struct vnet*)unused );
|
|
bw_upcalls_send();
|
|
+ callout_reset(&V_bw_upcalls_ch, BW_UPCALLS_PERIOD,
|
|
+ expire_bw_upcalls_send, unused);
|
|
+ CURVNET_RESTORE();
|
|
MFC_UNLOCK();
|
|
-
|
|
- callout_reset(&bw_upcalls_ch, BW_UPCALLS_PERIOD,
|
|
- expire_bw_upcalls_send, NULL);
|
|
}
|
|
|
|
/*
|
|
@@ -2544,10 +2632,12 @@
|
|
static void
|
|
expire_bw_meter_process(void *unused)
|
|
{
|
|
- if (mrt_api_config & MRT_MFC_BW_UPCALL)
|
|
- bw_meter_process();
|
|
+ INIT_VNET_MROUTE( (struct vnet *)unused );
|
|
+ if (V_mrt_api_config & MRT_MFC_BW_UPCALL)
|
|
+ bw_meter_process( (struct vnet *)unused );
|
|
|
|
- callout_reset(&bw_meter_ch, BW_METER_PERIOD, expire_bw_meter_process, NULL);
|
|
+ callout_reset(&V_bw_meter_ch, BW_METER_PERIOD,
|
|
+ expire_bw_meter_process, unused);
|
|
}
|
|
|
|
/*
|
|
@@ -2562,16 +2652,17 @@
|
|
pim_register_send(struct ip *ip, struct vif *vifp, struct mbuf *m,
|
|
struct mfc *rt)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mbuf *mb_copy, *mm;
|
|
|
|
- if (mrtdebug & DEBUG_PIM)
|
|
+ if (V_mrtdebug & DEBUG_PIM)
|
|
log(LOG_DEBUG, "pim_register_send: ");
|
|
|
|
/*
|
|
* Do not send IGMP_WHOLEPKT notifications to userland, if the
|
|
* rendezvous point was unspecified, and we were told not to.
|
|
*/
|
|
- if (pim_squelch_wholepkt != 0 && (mrt_api_config & MRT_MFC_RP) &&
|
|
+ if (pim_squelch_wholepkt != 0 && (V_mrt_api_config & MRT_MFC_RP) &&
|
|
(rt->mfc_rp.s_addr == INADDR_ANY))
|
|
return 0;
|
|
|
|
@@ -2589,7 +2680,7 @@
|
|
mm = m_pullup(mm, sizeof(struct ip));
|
|
if (mm != NULL) {
|
|
ip = mtod(mm, struct ip *);
|
|
- if ((mrt_api_config & MRT_MFC_RP) &&
|
|
+ if ((V_mrt_api_config & MRT_MFC_RP) &&
|
|
(rt->mfc_rp.s_addr != INADDR_ANY)) {
|
|
pim_register_send_rp(ip, vifp, mm, rt);
|
|
} else {
|
|
@@ -2660,6 +2751,7 @@
|
|
struct mbuf *mb_copy, struct mfc *rt)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mbuf *mb_first;
|
|
int len = ntohs(ip->ip_len);
|
|
struct igmpmsg *im;
|
|
@@ -2684,25 +2776,25 @@
|
|
im = mtod(mb_first, struct igmpmsg *);
|
|
im->im_msgtype = IGMPMSG_WHOLEPKT;
|
|
im->im_mbz = 0;
|
|
- im->im_vif = vifp - viftable;
|
|
+ im->im_vif = vifp - V_viftable;
|
|
im->im_src = ip->ip_src;
|
|
im->im_dst = ip->ip_dst;
|
|
|
|
k_igmpsrc.sin_addr = ip->ip_src;
|
|
|
|
- mrtstat.mrts_upcalls++;
|
|
+ V_mrtstat.mrts_upcalls++;
|
|
|
|
if (socket_send(V_ip_mrouter, mb_first, &k_igmpsrc) < 0) {
|
|
- if (mrtdebug & DEBUG_PIM)
|
|
+ if (V_mrtdebug & DEBUG_PIM)
|
|
log(LOG_WARNING,
|
|
"mcast: pim_register_send_upcall: ip_mrouter socket queue full");
|
|
- ++mrtstat.mrts_upq_sockfull;
|
|
+ ++V_mrtstat.mrts_upq_sockfull;
|
|
return ENOBUFS;
|
|
}
|
|
|
|
/* Keep statistics */
|
|
- pimstat.pims_snd_registers_msgs++;
|
|
- pimstat.pims_snd_registers_bytes += len;
|
|
+ V_pimstat.pims_snd_registers_msgs++;
|
|
+ V_pimstat.pims_snd_registers_bytes += len;
|
|
|
|
return 0;
|
|
}
|
|
@@ -2715,6 +2807,7 @@
|
|
struct mfc *rt)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct mbuf *mb_first;
|
|
struct ip *ip_outer;
|
|
struct pim_encap_pimhdr *pimhdr;
|
|
@@ -2723,7 +2816,7 @@
|
|
|
|
VIF_LOCK_ASSERT();
|
|
|
|
- if ((vifi >= numvifs) || (viftable[vifi].v_lcl_addr.s_addr == 0)) {
|
|
+ if ((vifi >= V_numvifs) || (V_viftable[vifi].v_lcl_addr.s_addr == 0)) {
|
|
m_freem(mb_copy);
|
|
return EADDRNOTAVAIL; /* The iif vif is invalid */
|
|
}
|
|
@@ -2749,7 +2842,7 @@
|
|
*ip_outer = pim_encap_iphdr;
|
|
ip_outer->ip_id = ip_newid();
|
|
ip_outer->ip_len = len + sizeof(pim_encap_iphdr) + sizeof(pim_encap_pimhdr);
|
|
- ip_outer->ip_src = viftable[vifi].v_lcl_addr;
|
|
+ ip_outer->ip_src = V_viftable[vifi].v_lcl_addr;
|
|
ip_outer->ip_dst = rt->mfc_rp;
|
|
/*
|
|
* Copy the inner header TOS to the outer header, and take care of the
|
|
@@ -2762,7 +2855,7 @@
|
|
+ sizeof(pim_encap_iphdr));
|
|
*pimhdr = pim_encap_pimhdr;
|
|
/* If the iif crosses a border, set the Border-bit */
|
|
- if (rt->mfc_flags[vifi] & MRT_MFC_FLAGS_BORDER_VIF & mrt_api_config)
|
|
+ if (rt->mfc_flags[vifi] & MRT_MFC_FLAGS_BORDER_VIF & V_mrt_api_config)
|
|
pimhdr->flags |= htonl(PIM_BORDER_REGISTER);
|
|
|
|
mb_first->m_data += sizeof(pim_encap_iphdr);
|
|
@@ -2772,8 +2865,8 @@
|
|
send_packet(vifp, mb_first);
|
|
|
|
/* Keep statistics */
|
|
- pimstat.pims_snd_registers_msgs++;
|
|
- pimstat.pims_snd_registers_bytes += len;
|
|
+ V_pimstat.pims_snd_registers_msgs++;
|
|
+ V_pimstat.pims_snd_registers_bytes += len;
|
|
|
|
return 0;
|
|
}
|
|
@@ -2807,6 +2900,7 @@
|
|
void
|
|
pim_input(struct mbuf *m, int off)
|
|
{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
struct ip *ip = mtod(m, struct ip *);
|
|
struct pim *pim;
|
|
int minlen;
|
|
@@ -2815,14 +2909,14 @@
|
|
int iphlen = off;
|
|
|
|
/* Keep statistics */
|
|
- pimstat.pims_rcv_total_msgs++;
|
|
- pimstat.pims_rcv_total_bytes += datalen;
|
|
+ V_pimstat.pims_rcv_total_msgs++;
|
|
+ V_pimstat.pims_rcv_total_bytes += datalen;
|
|
|
|
/*
|
|
* Validate lengths
|
|
*/
|
|
if (datalen < PIM_MINLEN) {
|
|
- pimstat.pims_rcv_tooshort++;
|
|
+ V_pimstat.pims_rcv_tooshort++;
|
|
log(LOG_ERR, "pim_input: packet size too small %d from %lx\n",
|
|
datalen, (u_long)ip->ip_src.s_addr);
|
|
m_freem(m);
|
|
@@ -2866,8 +2960,8 @@
|
|
if (PIM_VT_T(pim->pim_vt) == PIM_REGISTER && in_cksum(m, PIM_MINLEN) == 0) {
|
|
/* do nothing, checksum okay */
|
|
} else if (in_cksum(m, datalen)) {
|
|
- pimstat.pims_rcv_badsum++;
|
|
- if (mrtdebug & DEBUG_PIM)
|
|
+ V_pimstat.pims_rcv_badsum++;
|
|
+ if (V_mrtdebug & DEBUG_PIM)
|
|
log(LOG_DEBUG, "pim_input: invalid checksum");
|
|
m_freem(m);
|
|
return;
|
|
@@ -2875,7 +2969,7 @@
|
|
|
|
/* PIM version check */
|
|
if (PIM_VT_V(pim->pim_vt) < PIM_VERSION) {
|
|
- pimstat.pims_rcv_badversion++;
|
|
+ V_pimstat.pims_rcv_badversion++;
|
|
log(LOG_ERR, "pim_input: incorrect version %d, expecting %d\n",
|
|
PIM_VT_V(pim->pim_vt), PIM_VERSION);
|
|
m_freem(m);
|
|
@@ -2899,24 +2993,24 @@
|
|
struct ifnet *vifp;
|
|
|
|
VIF_LOCK();
|
|
- if ((reg_vif_num >= numvifs) || (reg_vif_num == VIFI_INVALID)) {
|
|
+ if ((V_reg_vif_num >= V_numvifs) || (V_reg_vif_num == VIFI_INVALID)) {
|
|
VIF_UNLOCK();
|
|
- if (mrtdebug & DEBUG_PIM)
|
|
+ if (V_mrtdebug & DEBUG_PIM)
|
|
log(LOG_DEBUG,
|
|
- "pim_input: register vif not set: %d\n", reg_vif_num);
|
|
+ "pim_input: register vif not set: %d\n", V_reg_vif_num);
|
|
m_freem(m);
|
|
return;
|
|
}
|
|
/* XXX need refcnt? */
|
|
- vifp = viftable[reg_vif_num].v_ifp;
|
|
+ vifp = V_viftable[V_reg_vif_num].v_ifp;
|
|
VIF_UNLOCK();
|
|
|
|
/*
|
|
* Validate length
|
|
*/
|
|
if (datalen < PIM_REG_MINLEN) {
|
|
- pimstat.pims_rcv_tooshort++;
|
|
- pimstat.pims_rcv_badregisters++;
|
|
+ V_pimstat.pims_rcv_tooshort++;
|
|
+ V_pimstat.pims_rcv_badregisters++;
|
|
log(LOG_ERR,
|
|
"pim_input: register packet size too small %d from %lx\n",
|
|
datalen, (u_long)ip->ip_src.s_addr);
|
|
@@ -2927,7 +3021,7 @@
|
|
reghdr = (u_int32_t *)(pim + 1);
|
|
encap_ip = (struct ip *)(reghdr + 1);
|
|
|
|
- if (mrtdebug & DEBUG_PIM) {
|
|
+ if (V_mrtdebug & DEBUG_PIM) {
|
|
log(LOG_DEBUG,
|
|
"pim_input[register], encap_ip: %lx -> %lx, encap_ip len %d\n",
|
|
(u_long)ntohl(encap_ip->ip_src.s_addr),
|
|
@@ -2937,8 +3031,8 @@
|
|
|
|
/* verify the version number of the inner packet */
|
|
if (encap_ip->ip_v != IPVERSION) {
|
|
- pimstat.pims_rcv_badregisters++;
|
|
- if (mrtdebug & DEBUG_PIM) {
|
|
+ V_pimstat.pims_rcv_badregisters++;
|
|
+ if (V_mrtdebug & DEBUG_PIM) {
|
|
log(LOG_DEBUG, "pim_input: invalid IP version (%d) "
|
|
"of the inner packet\n", encap_ip->ip_v);
|
|
}
|
|
@@ -2948,8 +3042,8 @@
|
|
|
|
/* verify the inner packet is destined to a mcast group */
|
|
if (!IN_MULTICAST(ntohl(encap_ip->ip_dst.s_addr))) {
|
|
- pimstat.pims_rcv_badregisters++;
|
|
- if (mrtdebug & DEBUG_PIM)
|
|
+ V_pimstat.pims_rcv_badregisters++;
|
|
+ if (V_mrtdebug & DEBUG_PIM)
|
|
log(LOG_DEBUG,
|
|
"pim_input: inner packet of register is not "
|
|
"multicast %lx\n",
|
|
@@ -3000,21 +3094,21 @@
|
|
|
|
/* Keep statistics */
|
|
/* XXX: registers_bytes include only the encap. mcast pkt */
|
|
- pimstat.pims_rcv_registers_msgs++;
|
|
- pimstat.pims_rcv_registers_bytes += ntohs(encap_ip->ip_len);
|
|
+ V_pimstat.pims_rcv_registers_msgs++;
|
|
+ V_pimstat.pims_rcv_registers_bytes += ntohs(encap_ip->ip_len);
|
|
|
|
/*
|
|
* forward the inner ip packet; point m_data at the inner ip.
|
|
*/
|
|
m_adj(m, iphlen + PIM_MINLEN);
|
|
|
|
- if (mrtdebug & DEBUG_PIM) {
|
|
+ if (V_mrtdebug & DEBUG_PIM) {
|
|
log(LOG_DEBUG,
|
|
"pim_input: forwarding decapsulated register: "
|
|
"src %lx, dst %lx, vif %d\n",
|
|
(u_long)ntohl(encap_ip->ip_src.s_addr),
|
|
(u_long)ntohl(encap_ip->ip_dst.s_addr),
|
|
- reg_vif_num);
|
|
+ V_reg_vif_num);
|
|
}
|
|
/* NB: vifp was collected above; can it change on us? */
|
|
if_simloop(vifp, m, dst.sin_family, 0);
|
|
@@ -3037,6 +3131,41 @@
|
|
return;
|
|
}
|
|
|
|
+#ifdef VIMAGE
|
|
+/* initialization for multicast routing state */
|
|
+static int
|
|
+vnet_mroute_iattach(unused)
|
|
+ const void *unused;
|
|
+{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
+
|
|
+ V_reg_vif_num = VIFI_INVALID;
|
|
+ MROUTER_LOCK_INIT();
|
|
+ MFC_LOCK_INIT();
|
|
+ VIF_LOCK_INIT();
|
|
+ ip_mrouter_reset();
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* de-initialization for multicast routing state */
|
|
+static int
|
|
+vnet_mroute_idetach(unused)
|
|
+ const void *unused;
|
|
+{
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
+
|
|
+ X_ip_mrouter_done();
|
|
+#ifdef INET6
|
|
+ X_ip6_mrouter_done();
|
|
+#endif
|
|
+
|
|
+ VIF_LOCK_DESTROY();
|
|
+ MFC_LOCK_DESTROY();
|
|
+ MROUTER_LOCK_DESTROY();
|
|
+ return 0;
|
|
+}
|
|
+#endif /* VIMAGE */
|
|
+
|
|
/*
|
|
* XXX: This is common code for dealing with initialization for both
|
|
* the IPv4 and IPv6 multicast forwarding paths. It could do with cleanup.
|
|
@@ -3045,12 +3174,15 @@
|
|
ip_mroute_modevent(module_t mod, int type, void *unused)
|
|
{
|
|
INIT_VNET_INET(curvnet);
|
|
+ INIT_VNET_INET6(curvnet);
|
|
+ INIT_VNET_MROUTE(curvnet);
|
|
switch (type) {
|
|
case MOD_LOAD:
|
|
- MROUTER_LOCK_INIT();
|
|
- MFC_LOCK_INIT();
|
|
- VIF_LOCK_INIT();
|
|
- ip_mrouter_reset();
|
|
+#ifdef VIMAGE
|
|
+ vnet_mod_register(&vnet_mroute_modinfo);
|
|
+#else
|
|
+ vnet_mroute_iattach(NULL);
|
|
+#endif
|
|
TUNABLE_ULONG_FETCH("net.inet.pim.squelch_wholepkt",
|
|
&pim_squelch_wholepkt);
|
|
|
|
@@ -3113,17 +3245,21 @@
|
|
*/
|
|
if (V_ip_mrouter
|
|
#ifdef INET6
|
|
- || ip6_mrouter
|
|
+ || V_ip6_mrouter
|
|
#endif
|
|
)
|
|
return EINVAL;
|
|
|
|
+#ifdef VIMAGE
|
|
+ vnet_mod_deregister(&vnet_mroute_modinfo);
|
|
+#else
|
|
+ vnet_mroute_idetach(NULL)
|
|
+#endif
|
|
#ifdef INET6
|
|
if (pim6_encap_cookie) {
|
|
encap_detach(pim6_encap_cookie);
|
|
pim6_encap_cookie = NULL;
|
|
}
|
|
- X_ip6_mrouter_done();
|
|
ip6_mforward = NULL;
|
|
ip6_mrouter_done = NULL;
|
|
ip6_mrouter_get = NULL;
|
|
@@ -3135,7 +3271,6 @@
|
|
encap_detach(pim_encap_cookie);
|
|
pim_encap_cookie = NULL;
|
|
}
|
|
- X_ip_mrouter_done();
|
|
ip_mcast_src = NULL;
|
|
ip_mforward = NULL;
|
|
ip_mrouter_done = NULL;
|
|
@@ -3148,10 +3283,6 @@
|
|
legal_vif_num = NULL;
|
|
mrt_ioctl = NULL;
|
|
rsvp_input_p = NULL;
|
|
-
|
|
- VIF_LOCK_DESTROY();
|
|
- MFC_LOCK_DESTROY();
|
|
- MROUTER_LOCK_DESTROY();
|
|
break;
|
|
|
|
default:
|
|
diff -ur sys.20081015/netinet/ip_mroute.h sys/netinet/ip_mroute.h
|
|
--- sys.20081015/netinet/ip_mroute.h 2008-08-16 16:29:19.000000000 -0700
|
|
+++ sys/netinet/ip_mroute.h 2008-11-05 13:21:08.000000000 -0800
|
|
@@ -52,6 +52,10 @@
|
|
* bandwidth metering and signaling.
|
|
*/
|
|
|
|
+#ifdef VIMAGE
|
|
+#include <netinet/pim_var.h> /* struct pimstat */
|
|
+#endif
|
|
+
|
|
|
|
/*
|
|
* Multicast Routing set/getsockopt commands.
|
|
@@ -80,6 +84,9 @@
|
|
typedef u_long vifbitmap_t;
|
|
typedef u_short vifi_t; /* type of a vif index */
|
|
#define ALL_VIFS (vifi_t)-1
|
|
+#ifdef VIMAGE
|
|
+#define VIFI_INVALID ((vifi_t) -1)
|
|
+#endif /* VIMAGE */
|
|
|
|
#define VIFM_SET(n, m) ((m) |= (1 << (n)))
|
|
#define VIFM_CLR(n, m) ((m) &= ~(1 << (n)))
|
|
@@ -205,6 +212,10 @@
|
|
#define BW_UPCALL_THRESHOLD_INTERVAL_MIN_SEC 3
|
|
#define BW_UPCALL_THRESHOLD_INTERVAL_MIN_USEC 0
|
|
|
|
+#ifdef VIMAGE
|
|
+#define BW_METER_BUCKETS 1024
|
|
+#endif /* VIMAGE */
|
|
+
|
|
/*
|
|
* The kernel's multicast routing statistics.
|
|
*/
|
|
@@ -361,6 +372,62 @@
|
|
extern int (*ip_mrouter_done)(void);
|
|
extern int (*mrt_ioctl)(int, caddr_t, int);
|
|
|
|
+#ifdef VIMAGE
|
|
+struct vnet_mroute {
|
|
+ /* from ip_mroute.c */
|
|
+ u_int _rsvpdebug;
|
|
+ u_int _mrtdebug;
|
|
+ struct mrtstat _mrtstat;
|
|
+ struct mfc *_mfctable[MFCTBLSIZ];
|
|
+ struct mtx _mrouter_mtx;
|
|
+ struct mtx _mfc_mtx;
|
|
+ struct vif _viftable[MAXVIFS];
|
|
+ struct mtx _vif_mtx;
|
|
+ u_char _nexpire[MFCTBLSIZ];
|
|
+ eventhandler_tag _if_detach_event_tag;
|
|
+ struct callout _expire_upcalls_ch;
|
|
+ struct bw_meter *_bw_meter_timers[BW_METER_BUCKETS];
|
|
+ struct callout _bw_meter_ch;
|
|
+ struct bw_upcall _bw_upcalls[BW_UPCALLS_MAX];
|
|
+ u_int _bw_upcalls_n;
|
|
+ struct callout _bw_upcalls_ch;
|
|
+ struct pimstat _pimstat;
|
|
+ struct ifnet _multicast_register_if;
|
|
+ vifi_t _reg_vif_num;
|
|
+ vifi_t _numvifs;
|
|
+ int _pim_assert;
|
|
+ uint32_t _mrt_api_config;
|
|
+};
|
|
+#endif /* VIMAGE */
|
|
+
|
|
+#define INIT_VNET_MROUTE(vnet) \
|
|
+ INIT_FROM_VNET(vnet, VNET_MOD_MROUTE, struct vnet_mroute, vnet_mroute)
|
|
+
|
|
+#define VNET_MROUTE(sym) VSYM(vnet_mroute, sym)
|
|
+
|
|
+#define V_rsvpdebug VNET_MROUTE(rsvpdebug)
|
|
+#define V_mrtdebug VNET_MROUTE(mrtdebug)
|
|
+#define V_mrtstat VNET_MROUTE(mrtstat)
|
|
+#define V_mfctable VNET_MROUTE(mfctable)
|
|
+#define V_mrouter_mtx VNET_MROUTE(mrouter_mtx)
|
|
+#define V_mfc_mtx VNET_MROUTE(mfc_mtx)
|
|
+#define V_viftable VNET_MROUTE(viftable)
|
|
+#define V_vif_mtx VNET_MROUTE(vif_mtx)
|
|
+#define V_nexpire VNET_MROUTE(nexpire)
|
|
+#define V_if_detach_event_tag VNET_MROUTE(if_detach_event_tag)
|
|
+#define V_expire_upcalls_ch VNET_MROUTE(expire_upcalls_ch)
|
|
+#define V_bw_meter_timers VNET_MROUTE(bw_meter_timers)
|
|
+#define V_bw_meter_ch VNET_MROUTE(bw_meter_ch)
|
|
+#define V_bw_upcalls VNET_MROUTE(bw_upcalls)
|
|
+#define V_bw_upcalls_n VNET_MROUTE(bw_upcalls_n)
|
|
+#define V_bw_upcalls_ch VNET_MROUTE(bw_upcalls_ch)
|
|
+#define V_pimstat VNET_MROUTE(pimstat)
|
|
+#define V_multicast_register_if VNET_MROUTE(multicast_register_if)
|
|
+#define V_reg_vif_num VNET_MROUTE(reg_vif_num)
|
|
+#define V_numvifs VNET_MROUTE(numvifs)
|
|
+#define V_pim_assert VNET_MROUTE(pim_assert)
|
|
+#define V_mrt_api_config VNET_MROUTE(mrt_api_config)
|
|
+
|
|
#endif /* _KERNEL */
|
|
|
|
#endif /* _NETINET_IP_MROUTE_H_ */
|
|
diff -ur sys.20081015/netinet/pim_var.h sys/netinet/pim_var.h
|
|
--- sys.20081015/netinet/pim_var.h 2007-11-19 06:49:11.000000000 -0800
|
|
+++ sys/netinet/pim_var.h 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -73,7 +73,9 @@
|
|
#ifdef _KERNEL
|
|
|
|
void pim_input(struct mbuf *, int);
|
|
+#ifdef SYSCTL_DECL
|
|
SYSCTL_DECL(_net_inet_pim);
|
|
#endif
|
|
+#endif
|
|
|
|
#endif /* _NETINET_PIM_VAR_H_ */
|
|
diff -ur sys.20081015/netinet/vinet.h sys/netinet/vinet.h
|
|
--- sys.20081015/netinet/vinet.h 2007-11-19 09:09:38.000000000 -0800
|
|
+++ sys/netinet/vinet.h 2008-11-03 16:04:36.000000000 -0800
|
|
@@ -53,6 +53,9 @@
|
|
#include <netinet/tcp_syncache.h>
|
|
#include <netinet/udp.h>
|
|
#include <netinet/udp_var.h>
|
|
+#include <netinet/ip_mroute.h>
|
|
+#include <netinet/pim.h>
|
|
+#include <netinet/pim_var.h>
|
|
|
|
struct vnet_inet {
|
|
struct in_ifaddrhashhead *_in_ifaddrhashtbl;
|
|
diff -ur sys.20081015/netinet6/ip6_input.c sys/netinet6/ip6_input.c
|
|
--- sys.20081015/netinet6/ip6_input.c 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/ip6_input.c 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -192,6 +192,20 @@
|
|
nd6_init();
|
|
frag6_init();
|
|
|
|
+ V_ip6_mrouter_ver = 0;
|
|
+ V_ip6_mrouter = NULL;
|
|
+ bzero(&V_mrt6stat, sizeof(V_mrt6stat));
|
|
+ bzero((caddr_t)V_mf6ctable, sizeof(V_mf6ctable));
|
|
+ bzero((caddr_t)V_n6expire, sizeof(V_n6expire));
|
|
+ bzero((caddr_t)V_mif6table, sizeof(V_mif6table));
|
|
+ V_mrt6debug = 0;
|
|
+ V_multicast_register_if6 = NULL;
|
|
+ V_nummifs = 0;
|
|
+ V_reg_mif_num = (mifi_t)-1;
|
|
+ bzero(&V_pim6stat, sizeof(V_pim6stat));
|
|
+ V_pim6 = 0;
|
|
+ bzero((caddr_t)V_upcall_data, sizeof(V_upcall_data));
|
|
+
|
|
#ifdef VIMAGE
|
|
/* Skip global initialization stuff for non-default instances. */
|
|
if (!IS_DEFAULT_VNET(curvnet))
|
|
@@ -507,7 +521,7 @@
|
|
IN6_LOOKUP_MULTI(ip6->ip6_dst, m->m_pkthdr.rcvif, in6m);
|
|
if (in6m)
|
|
ours = 1;
|
|
- else if (!ip6_mrouter) {
|
|
+ else if (!V_ip6_mrouter) {
|
|
V_ip6stat.ip6s_notmember++;
|
|
V_ip6stat.ip6s_cantforward++;
|
|
in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
|
|
@@ -768,7 +782,7 @@
|
|
* ip6_mforward() returns a non-zero value, the packet
|
|
* must be discarded, else it may be accepted below.
|
|
*/
|
|
- if (ip6_mrouter && ip6_mforward &&
|
|
+ if (V_ip6_mrouter && ip6_mforward &&
|
|
ip6_mforward(ip6, m->m_pkthdr.rcvif, m)) {
|
|
V_ip6stat.ip6s_cantforward++;
|
|
m_freem(m);
|
|
diff -ur sys.20081015/netinet6/ip6_mroute.c sys/netinet6/ip6_mroute.c
|
|
--- sys.20081015/netinet6/ip6_mroute.c 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/ip6_mroute.c 2008-11-05 14:34:10.000000000 -0800
|
|
@@ -160,14 +160,17 @@
|
|
SYSCTL_DECL(_net_inet6_ip6);
|
|
SYSCTL_NODE(_net_inet6, IPPROTO_PIM, pim, CTLFLAG_RW, 0, "PIM");
|
|
|
|
+#ifndef VIMAGE
|
|
static struct mrt6stat mrt6stat;
|
|
-SYSCTL_STRUCT(_net_inet6_ip6, OID_AUTO, mrt6stat, CTLFLAG_RW,
|
|
- &mrt6stat, mrt6stat,
|
|
+#endif /* !VIMAGE */
|
|
+SYSCTL_V_STRUCT(V_NET, vnet_inet6, _net_inet6_ip6, OID_AUTO, mrt6stat,
|
|
+ CTLFLAG_RW, mrt6stat, mrt6stat,
|
|
"Multicast Routing Statistics (struct mrt6stat, netinet6/ip6_mroute.h)");
|
|
|
|
#define NO_RTE_FOUND 0x1
|
|
#define RTE_FOUND 0x2
|
|
|
|
+#ifndef VIMAGE
|
|
static struct mf6c *mf6ctable[MF6CTBLSIZ];
|
|
SYSCTL_OPAQUE(_net_inet6_ip6, OID_AUTO, mf6ctable, CTLFLAG_RD,
|
|
&mf6ctable, sizeof(mf6ctable), "S,*mf6ctable[MF6CTBLSIZ]",
|
|
@@ -180,6 +183,7 @@
|
|
SYSCTL_OPAQUE(_net_inet6_ip6, OID_AUTO, mif6table, CTLFLAG_RD,
|
|
&mif6table, sizeof(mif6table), "S,vif[MAXMIFS]",
|
|
"Multicast Interfaces (struct mif[MAXMIFS], netinet6/ip6_mroute.h)");
|
|
+#endif /* !VIMAGE */
|
|
|
|
#ifdef MRT6DEBUG
|
|
#ifndef VIMAGE
|
|
@@ -199,7 +203,9 @@
|
|
|
|
#ifdef INET
|
|
#ifdef MROUTING
|
|
+#ifndef VIMAGE
|
|
extern struct socket *ip_mrouter;
|
|
+#endif /* !VIMAGE */
|
|
#endif
|
|
#endif
|
|
|
|
@@ -214,19 +220,23 @@
|
|
* only exist as a placeholder for multicast source
|
|
* verification.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static struct ifnet *multicast_register_if6;
|
|
+#endif /* !VIMAGE */
|
|
|
|
#define ENCAP_HOPS 64
|
|
|
|
/*
|
|
* Private variables.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
static mifi_t nummifs = 0;
|
|
static mifi_t reg_mif_num = (mifi_t)-1;
|
|
|
|
static struct pim6stat pim6stat;
|
|
-SYSCTL_STRUCT(_net_inet6_pim, PIM6CTL_STATS, stats, CTLFLAG_RD,
|
|
- &pim6stat, pim6stat,
|
|
+#endif /* !VIMAGE */
|
|
+SYSCTL_V_STRUCT(V_NET, vnet_inet6, _net_inet6_pim, PIM6CTL_STATS, stats,
|
|
+ CTLFLAG_RD, pim6stat, pim6stat,
|
|
"PIM Statistics (struct pim6stat, netinet6/pim_var.h)");
|
|
|
|
#ifndef VIMAGE
|
|
@@ -245,9 +255,9 @@
|
|
* Find a route for a given origin IPv6 address and Multicast group address.
|
|
*/
|
|
#define MF6CFIND(o, g, rt) do { \
|
|
- struct mf6c *_rt = mf6ctable[MF6CHASH(o,g)]; \
|
|
+ struct mf6c *_rt = V_mf6ctable[MF6CHASH(o,g)]; \
|
|
rt = NULL; \
|
|
- mrt6stat.mrt6s_mfc_lookups++; \
|
|
+ V_mrt6stat.mrt6s_mfc_lookups++; \
|
|
while (_rt) { \
|
|
if (IN6_ARE_ADDR_EQUAL(&_rt->mf6c_origin.sin6_addr, &(o)) && \
|
|
IN6_ARE_ADDR_EQUAL(&_rt->mf6c_mcastgrp.sin6_addr, &(g)) && \
|
|
@@ -258,7 +268,7 @@
|
|
_rt = _rt->mf6c_next; \
|
|
} \
|
|
if (rt == NULL) { \
|
|
- mrt6stat.mrt6s_mfc_misses++; \
|
|
+ V_mrt6stat.mrt6s_mfc_misses++; \
|
|
} \
|
|
} while (/*CONSTCOND*/ 0)
|
|
|
|
@@ -291,7 +301,9 @@
|
|
|
|
#ifdef UPCALL_TIMING
|
|
#define UPCALL_MAX 50
|
|
+#ifndef VIMAGE
|
|
static u_long upcall_data[UPCALL_MAX + 1];
|
|
+#endif /* !VIMAGE */
|
|
static void collate();
|
|
#endif /* UPCALL_TIMING */
|
|
|
|
@@ -303,7 +315,9 @@
|
|
static int add_m6fc(struct mf6cctl *);
|
|
static int del_m6fc(struct mf6cctl *);
|
|
|
|
-static struct callout expire_upcalls_ch;
|
|
+#ifndef VIMAGE
|
|
+static struct callout expire_upcalls_ch6;
|
|
+#endif /* !VIMAGE */
|
|
|
|
int X_ip6_mforward(struct ip6_hdr *ip6, struct ifnet *ifp, struct mbuf *m);
|
|
int X_ip6_mrouter_done(void);
|
|
@@ -311,19 +325,21 @@
|
|
int X_ip6_mrouter_get(struct socket *so, struct sockopt *sopt);
|
|
int X_mrt6_ioctl(int cmd, caddr_t data);
|
|
|
|
+
|
|
/*
|
|
* Handle MRT setsockopt commands to modify the multicast routing tables.
|
|
*/
|
|
int
|
|
X_ip6_mrouter_set(struct socket *so, struct sockopt *sopt)
|
|
{
|
|
+ INIT_VNET_INET6(so->so_vnet);
|
|
int error = 0;
|
|
int optval;
|
|
struct mif6ctl mifc;
|
|
struct mf6cctl mfcc;
|
|
mifi_t mifi;
|
|
|
|
- if (so != ip6_mrouter && sopt->sopt_name != MRT6_INIT)
|
|
+ if (so != V_ip6_mrouter && sopt->sopt_name != MRT6_INIT)
|
|
return (EACCES);
|
|
|
|
switch (sopt->sopt_name) {
|
|
@@ -385,10 +401,10 @@
|
|
int
|
|
X_ip6_mrouter_get(struct socket *so, struct sockopt *sopt)
|
|
{
|
|
- INIT_VNET_INET6(curvnet);
|
|
+ INIT_VNET_INET6(so->so_vnet);
|
|
int error = 0;
|
|
|
|
- if (so != ip6_mrouter)
|
|
+ if (so != V_ip6_mrouter)
|
|
return (EACCES);
|
|
|
|
switch (sopt->sopt_name) {
|
|
@@ -421,6 +437,7 @@
|
|
static int
|
|
get_sg_cnt(struct sioc_sg_req6 *req)
|
|
{
|
|
+ INIT_VNET_INET6(curvnet);
|
|
struct mf6c *rt;
|
|
int s;
|
|
|
|
@@ -446,15 +463,16 @@
|
|
static int
|
|
get_mif6_cnt(struct sioc_mif_req6 *req)
|
|
{
|
|
+ INIT_VNET_INET6(curvnet);
|
|
mifi_t mifi = req->mifi;
|
|
|
|
- if (mifi >= nummifs)
|
|
+ if (mifi >= V_nummifs)
|
|
return (EINVAL);
|
|
|
|
- req->icount = mif6table[mifi].m6_pkt_in;
|
|
- req->ocount = mif6table[mifi].m6_pkt_out;
|
|
- req->ibytes = mif6table[mifi].m6_bytes_in;
|
|
- req->obytes = mif6table[mifi].m6_bytes_out;
|
|
+ req->icount = V_mif6table[mifi].m6_pkt_in;
|
|
+ req->ocount = V_mif6table[mifi].m6_pkt_out;
|
|
+ req->ibytes = V_mif6table[mifi].m6_bytes_in;
|
|
+ req->obytes = V_mif6table[mifi].m6_bytes_out;
|
|
|
|
return (0);
|
|
}
|
|
@@ -477,9 +495,11 @@
|
|
static int
|
|
ip6_mrouter_init(struct socket *so, int v, int cmd)
|
|
{
|
|
- INIT_VNET_INET6(curvnet);
|
|
+ INIT_VNET_INET6(so->so_vnet);
|
|
|
|
V_ip6_mrouter_ver = 0;
|
|
+ V_nummifs = 0;
|
|
+ V_reg_mif_num = (mifi_t)-1;
|
|
|
|
#ifdef MRT6DEBUG
|
|
V_mrt6debug = 0;
|
|
@@ -497,20 +517,20 @@
|
|
if (v != 1)
|
|
return (ENOPROTOOPT);
|
|
|
|
- if (ip6_mrouter != NULL)
|
|
+ if (V_ip6_mrouter != NULL)
|
|
return (EADDRINUSE);
|
|
|
|
- ip6_mrouter = so;
|
|
+ V_ip6_mrouter = so;
|
|
V_ip6_mrouter_ver = cmd;
|
|
|
|
- bzero((caddr_t)mf6ctable, sizeof(mf6ctable));
|
|
- bzero((caddr_t)n6expire, sizeof(n6expire));
|
|
+ bzero((caddr_t)V_mf6ctable, sizeof(V_mf6ctable));
|
|
+ bzero((caddr_t)V_n6expire, sizeof(V_n6expire));
|
|
|
|
V_pim6 = 0;/* used for stubbing out/in pim stuff */
|
|
|
|
- callout_init(&expire_upcalls_ch, 0);
|
|
- callout_reset(&expire_upcalls_ch, EXPIRE_TIMEOUT,
|
|
- expire_upcalls, NULL);
|
|
+ callout_init(&V_expire_upcalls_ch6, 0);
|
|
+ callout_reset(&V_expire_upcalls_ch6, EXPIRE_TIMEOUT,
|
|
+ expire_upcalls, (void *)so->so_vnet);
|
|
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug)
|
|
@@ -547,29 +567,29 @@
|
|
* XXX: there may be an interface in which the IPv4 multicast
|
|
* daemon is not interested...
|
|
*/
|
|
- if (!ip_mrouter)
|
|
+ if (!V_ip_mrouter)
|
|
#endif
|
|
#endif
|
|
{
|
|
- for (mifi = 0; mifi < nummifs; mifi++) {
|
|
- if (mif6table[mifi].m6_ifp &&
|
|
- !(mif6table[mifi].m6_flags & MIFF_REGISTER)) {
|
|
- if_allmulti(mif6table[mifi].m6_ifp, 0);
|
|
+ for (mifi = 0; mifi < V_nummifs; mifi++) {
|
|
+ if (V_mif6table[mifi].m6_ifp &&
|
|
+ !(V_mif6table[mifi].m6_flags & MIFF_REGISTER)) {
|
|
+ if_allmulti(V_mif6table[mifi].m6_ifp, 0);
|
|
}
|
|
}
|
|
}
|
|
- bzero((caddr_t)mif6table, sizeof(mif6table));
|
|
- nummifs = 0;
|
|
+ bzero((caddr_t)V_mif6table, sizeof(V_mif6table));
|
|
+ V_nummifs = 0;
|
|
|
|
V_pim6 = 0; /* used to stub out/in pim specific code */
|
|
|
|
- callout_stop(&expire_upcalls_ch);
|
|
+ callout_stop(&V_expire_upcalls_ch6);
|
|
|
|
/*
|
|
* Free all multicast forwarding cache entries.
|
|
*/
|
|
for (i = 0; i < MF6CTBLSIZ; i++) {
|
|
- rt = mf6ctable[i];
|
|
+ rt = V_mf6ctable[i];
|
|
while (rt) {
|
|
struct mf6c *frt;
|
|
|
|
@@ -586,19 +606,19 @@
|
|
}
|
|
}
|
|
|
|
- bzero((caddr_t)mf6ctable, sizeof(mf6ctable));
|
|
+ bzero((caddr_t)V_mf6ctable, sizeof(V_mf6ctable));
|
|
|
|
/*
|
|
* Reset register interface
|
|
*/
|
|
- if (reg_mif_num != (mifi_t)-1 && multicast_register_if6 != NULL) {
|
|
- if_detach(multicast_register_if6);
|
|
- if_free(multicast_register_if6);
|
|
- reg_mif_num = (mifi_t)-1;
|
|
- multicast_register_if6 = NULL;
|
|
+ if (V_reg_mif_num != (mifi_t)-1 && V_multicast_register_if6 != NULL) {
|
|
+ if_detach(V_multicast_register_if6);
|
|
+ if_free(V_multicast_register_if6);
|
|
+ V_reg_mif_num = (mifi_t)-1;
|
|
+ V_multicast_register_if6 = NULL;
|
|
}
|
|
|
|
- ip6_mrouter = NULL;
|
|
+ V_ip6_mrouter = NULL;
|
|
V_ip6_mrouter_ver = 0;
|
|
|
|
splx(s);
|
|
@@ -620,13 +640,14 @@
|
|
add_m6if(struct mif6ctl *mifcp)
|
|
{
|
|
INIT_VNET_NET(curvnet);
|
|
+ INIT_VNET_INET6(curvnet);
|
|
struct mif6 *mifp;
|
|
struct ifnet *ifp;
|
|
int error, s;
|
|
|
|
if (mifcp->mif6c_mifi >= MAXMIFS)
|
|
return (EINVAL);
|
|
- mifp = mif6table + mifcp->mif6c_mifi;
|
|
+ mifp = V_mif6table + mifcp->mif6c_mifi;
|
|
if (mifp->m6_ifp)
|
|
return (EADDRINUSE); /* XXX: is it appropriate? */
|
|
if (mifcp->mif6c_pifi == 0 || mifcp->mif6c_pifi > V_if_index)
|
|
@@ -634,14 +655,14 @@
|
|
ifp = ifnet_byindex(mifcp->mif6c_pifi);
|
|
|
|
if (mifcp->mif6c_flags & MIFF_REGISTER) {
|
|
- if (reg_mif_num == (mifi_t)-1) {
|
|
+ if (V_reg_mif_num == (mifi_t)-1) {
|
|
ifp = if_alloc(IFT_OTHER);
|
|
|
|
if_initname(ifp, "register_mif", 0);
|
|
ifp->if_flags |= IFF_LOOPBACK;
|
|
if_attach(ifp);
|
|
- multicast_register_if6 = ifp;
|
|
- reg_mif_num = mifcp->mif6c_mifi;
|
|
+ V_multicast_register_if6 = ifp;
|
|
+ V_reg_mif_num = mifcp->mif6c_mifi;
|
|
/*
|
|
* it is impossible to guess the ifindex of the
|
|
* register interface. So mif6c_pifi is automatically
|
|
@@ -649,7 +670,7 @@
|
|
*/
|
|
mifcp->mif6c_pifi = ifp->if_index;
|
|
} else {
|
|
- ifp = multicast_register_if6;
|
|
+ ifp = V_multicast_register_if6;
|
|
}
|
|
|
|
} /* if REGISTER */
|
|
@@ -676,9 +697,9 @@
|
|
mifp->m6_bytes_out = 0;
|
|
splx(s);
|
|
|
|
- /* Adjust nummifs up if the mifi is higher than nummifs */
|
|
- if (nummifs <= mifcp->mif6c_mifi)
|
|
- nummifs = mifcp->mif6c_mifi + 1;
|
|
+ /* Adjust V_nummifs up if the mifi is higher than V_nummifs */
|
|
+ if (V_nummifs <= mifcp->mif6c_mifi)
|
|
+ V_nummifs = mifcp->mif6c_mifi + 1;
|
|
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug)
|
|
@@ -697,12 +718,13 @@
|
|
static int
|
|
del_m6if(mifi_t *mifip)
|
|
{
|
|
- struct mif6 *mifp = mif6table + *mifip;
|
|
+ INIT_VNET_INET6(curvnet);
|
|
+ struct mif6 *mifp = V_mif6table + *mifip;
|
|
mifi_t mifi;
|
|
struct ifnet *ifp;
|
|
int s;
|
|
|
|
- if (*mifip >= nummifs)
|
|
+ if (*mifip >= V_nummifs)
|
|
return (EINVAL);
|
|
if (mifp->m6_ifp == NULL)
|
|
return (EINVAL);
|
|
@@ -718,28 +740,28 @@
|
|
|
|
if_allmulti(ifp, 0);
|
|
} else {
|
|
- if (reg_mif_num != (mifi_t)-1 &&
|
|
- multicast_register_if6 != NULL) {
|
|
- if_detach(multicast_register_if6);
|
|
- if_free(multicast_register_if6);
|
|
- reg_mif_num = (mifi_t)-1;
|
|
- multicast_register_if6 = NULL;
|
|
+ if (V_reg_mif_num != (mifi_t)-1 &&
|
|
+ V_multicast_register_if6 != NULL) {
|
|
+ if_detach(V_multicast_register_if6);
|
|
+ if_free(V_multicast_register_if6);
|
|
+ V_reg_mif_num = (mifi_t)-1;
|
|
+ V_multicast_register_if6 = NULL;
|
|
}
|
|
}
|
|
|
|
bzero((caddr_t)mifp, sizeof(*mifp));
|
|
|
|
- /* Adjust nummifs down */
|
|
- for (mifi = nummifs; mifi > 0; mifi--)
|
|
- if (mif6table[mifi - 1].m6_ifp)
|
|
+ /* Adjust V_nummifs down */
|
|
+ for (mifi = V_nummifs; mifi > 0; mifi--)
|
|
+ if (V_mif6table[mifi - 1].m6_ifp)
|
|
break;
|
|
- nummifs = mifi;
|
|
+ V_nummifs = mifi;
|
|
|
|
splx(s);
|
|
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug)
|
|
- log(LOG_DEBUG, "del_m6if %d, nummifs %d\n", *mifip, nummifs);
|
|
+ log(LOG_DEBUG, "del_m6if %d, nummifs %d\n", *mifip, V_nummifs);
|
|
#endif
|
|
|
|
return (0);
|
|
@@ -787,7 +809,7 @@
|
|
s = splnet();
|
|
hash = MF6CHASH(mfccp->mf6cc_origin.sin6_addr,
|
|
mfccp->mf6cc_mcastgrp.sin6_addr);
|
|
- for (rt = mf6ctable[hash], nstl = 0; rt; rt = rt->mf6c_next) {
|
|
+ for (rt = V_mf6ctable[hash], nstl = 0; rt; rt = rt->mf6c_next) {
|
|
if (IN6_ARE_ADDR_EQUAL(&rt->mf6c_origin.sin6_addr,
|
|
&mfccp->mf6cc_origin.sin6_addr) &&
|
|
IN6_ARE_ADDR_EQUAL(&rt->mf6c_mcastgrp.sin6_addr,
|
|
@@ -825,7 +847,7 @@
|
|
rt->mf6c_wrong_if = 0;
|
|
|
|
rt->mf6c_expire = 0; /* Don't clean this guy up */
|
|
- n6expire[hash]--;
|
|
+ V_n6expire[hash]--;
|
|
|
|
/* free packets Qed at the end of this entry */
|
|
for (rte = rt->mf6c_stall; rte != NULL; ) {
|
|
@@ -856,7 +878,7 @@
|
|
mfccp->mf6cc_parent);
|
|
#endif
|
|
|
|
- for (rt = mf6ctable[hash]; rt; rt = rt->mf6c_next) {
|
|
+ for (rt = V_mf6ctable[hash]; rt; rt = rt->mf6c_next) {
|
|
|
|
if (IN6_ARE_ADDR_EQUAL(&rt->mf6c_origin.sin6_addr,
|
|
&mfccp->mf6cc_origin.sin6_addr)&&
|
|
@@ -873,7 +895,7 @@
|
|
rt->mf6c_wrong_if = 0;
|
|
|
|
if (rt->mf6c_expire)
|
|
- n6expire[hash]--;
|
|
+ V_n6expire[hash]--;
|
|
rt->mf6c_expire = 0;
|
|
}
|
|
}
|
|
@@ -899,8 +921,8 @@
|
|
rt->mf6c_stall = NULL;
|
|
|
|
/* link into table */
|
|
- rt->mf6c_next = mf6ctable[hash];
|
|
- mf6ctable[hash] = rt;
|
|
+ rt->mf6c_next = V_mf6ctable[hash];
|
|
+ V_mf6ctable[hash] = rt;
|
|
}
|
|
}
|
|
splx(s);
|
|
@@ -914,6 +936,7 @@
|
|
static void
|
|
collate(struct timeval *t)
|
|
{
|
|
+ INIT_VNET_INET6(curvnet);
|
|
u_long d;
|
|
struct timeval tp;
|
|
u_long delta;
|
|
@@ -928,7 +951,7 @@
|
|
if (d > UPCALL_MAX)
|
|
d = UPCALL_MAX;
|
|
|
|
- ++upcall_data[d];
|
|
+ ++V_upcall_data[d];
|
|
}
|
|
}
|
|
#endif /* UPCALL_TIMING */
|
|
@@ -962,7 +985,7 @@
|
|
|
|
s = splnet();
|
|
|
|
- nptr = &mf6ctable[hash];
|
|
+ nptr = &V_mf6ctable[hash];
|
|
while ((rt = *nptr) != NULL) {
|
|
if (IN6_ARE_ADDR_EQUAL(&origin.sin6_addr,
|
|
&rt->mf6c_origin.sin6_addr) &&
|
|
@@ -1097,7 +1120,7 @@
|
|
GET_TIME(tp);
|
|
#endif /* UPCALL_TIMING */
|
|
|
|
- mrt6stat.mrt6s_no_route++;
|
|
+ V_mrt6stat.mrt6s_no_route++;
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & (DEBUG_FORWARD | DEBUG_MFC))
|
|
log(LOG_DEBUG, "ip6_mforward: no rte s %s g %s\n",
|
|
@@ -1131,7 +1154,7 @@
|
|
|
|
/* is there an upcall waiting for this packet? */
|
|
hash = MF6CHASH(ip6->ip6_src, ip6->ip6_dst);
|
|
- for (rt = mf6ctable[hash]; rt; rt = rt->mf6c_next) {
|
|
+ for (rt = V_mf6ctable[hash]; rt; rt = rt->mf6c_next) {
|
|
if (IN6_ARE_ADDR_EQUAL(&ip6->ip6_src,
|
|
&rt->mf6c_origin.sin6_addr) &&
|
|
IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst,
|
|
@@ -1205,8 +1228,8 @@
|
|
"getting the iif info in the kernel\n");
|
|
#endif
|
|
|
|
- for (mifp = mif6table, mifi = 0;
|
|
- mifi < nummifs && mifp->m6_ifp != ifp;
|
|
+ for (mifp = V_mif6table, mifi = 0;
|
|
+ mifi < V_nummifs && mifp->m6_ifp != ifp;
|
|
mifp++, mifi++)
|
|
;
|
|
|
|
@@ -1221,10 +1244,10 @@
|
|
break;
|
|
}
|
|
|
|
- if (socket_send(ip6_mrouter, mm, &sin6) < 0) {
|
|
+ if (socket_send(V_ip6_mrouter, mm, &sin6) < 0) {
|
|
log(LOG_WARNING, "ip6_mforward: ip6_mrouter "
|
|
"socket queue full\n");
|
|
- mrt6stat.mrt6s_upq_sockfull++;
|
|
+ V_mrt6stat.mrt6s_upq_sockfull++;
|
|
free(rte, M_MRTABLE6);
|
|
m_freem(mb0);
|
|
free(rt, M_MRTABLE6);
|
|
@@ -1232,7 +1255,7 @@
|
|
return (ENOBUFS);
|
|
}
|
|
|
|
- mrt6stat.mrt6s_upcalls++;
|
|
+ V_mrt6stat.mrt6s_upcalls++;
|
|
|
|
/* insert new entry at head of hash chain */
|
|
bzero(rt, sizeof(*rt));
|
|
@@ -1243,12 +1266,12 @@
|
|
rt->mf6c_mcastgrp.sin6_len = sizeof(struct sockaddr_in6);
|
|
rt->mf6c_mcastgrp.sin6_addr = ip6->ip6_dst;
|
|
rt->mf6c_expire = UPCALL_EXPIRE;
|
|
- n6expire[hash]++;
|
|
+ V_n6expire[hash]++;
|
|
rt->mf6c_parent = MF6C_INCOMPLETE_PARENT;
|
|
|
|
/* link into table */
|
|
- rt->mf6c_next = mf6ctable[hash];
|
|
- mf6ctable[hash] = rt;
|
|
+ rt->mf6c_next = V_mf6ctable[hash];
|
|
+ V_mf6ctable[hash] = rt;
|
|
/* Add this entry to the end of the queue */
|
|
rt->mf6c_stall = rte;
|
|
} else {
|
|
@@ -1258,7 +1281,7 @@
|
|
|
|
for (p = &rt->mf6c_stall; *p != NULL; p = &(*p)->next)
|
|
if (++npkts > MAX_UPQ6) {
|
|
- mrt6stat.mrt6s_upq_ovflw++;
|
|
+ V_mrt6stat.mrt6s_upq_ovflw++;
|
|
free(rte, M_MRTABLE6);
|
|
m_freem(mb0);
|
|
splx(s);
|
|
@@ -1289,7 +1312,7 @@
|
|
static void
|
|
expire_upcalls(void *unused)
|
|
{
|
|
- INIT_VNET_INET6(curvnet);
|
|
+ INIT_VNET_INET6( (struct vnet*)unused );
|
|
struct rtdetq *rte;
|
|
struct mf6c *mfc, **nptr;
|
|
int i;
|
|
@@ -1297,9 +1320,9 @@
|
|
|
|
s = splnet();
|
|
for (i = 0; i < MF6CTBLSIZ; i++) {
|
|
- if (n6expire[i] == 0)
|
|
+ if (V_n6expire[i] == 0)
|
|
continue;
|
|
- nptr = &mf6ctable[i];
|
|
+ nptr = &V_mf6ctable[i];
|
|
while ((mfc = *nptr) != NULL) {
|
|
rte = mfc->mf6c_stall;
|
|
/*
|
|
@@ -1329,8 +1352,8 @@
|
|
free(rte, M_MRTABLE6);
|
|
rte = n;
|
|
} while (rte != NULL);
|
|
- mrt6stat.mrt6s_cache_cleanups++;
|
|
- n6expire[i]--;
|
|
+ V_mrt6stat.mrt6s_cache_cleanups++;
|
|
+ V_n6expire[i]--;
|
|
|
|
*nptr = mfc->mf6c_next;
|
|
free(mfc, M_MRTABLE6);
|
|
@@ -1339,9 +1362,9 @@
|
|
}
|
|
}
|
|
}
|
|
+ callout_reset(&V_expire_upcalls_ch6, EXPIRE_TIMEOUT,
|
|
+ expire_upcalls, unused);
|
|
splx(s);
|
|
- callout_reset(&expire_upcalls_ch, EXPIRE_TIMEOUT,
|
|
- expire_upcalls, NULL);
|
|
}
|
|
|
|
/*
|
|
@@ -1377,16 +1400,16 @@
|
|
* for its origin.
|
|
*/
|
|
mifi = rt->mf6c_parent;
|
|
- if ((mifi >= nummifs) || (mif6table[mifi].m6_ifp != ifp)) {
|
|
+ if ((mifi >= V_nummifs) || (V_mif6table[mifi].m6_ifp != ifp)) {
|
|
/* came in the wrong interface */
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_FORWARD)
|
|
log(LOG_DEBUG,
|
|
"wrong if: ifid %d mifi %d mififid %x\n",
|
|
ifp->if_index, mifi,
|
|
- mif6table[mifi].m6_ifp->if_index);
|
|
+ V_mif6table[mifi].m6_ifp->if_index);
|
|
#endif
|
|
- mrt6stat.mrt6s_wrong_if++;
|
|
+ V_mrt6stat.mrt6s_wrong_if++;
|
|
rt->mf6c_wrong_if++;
|
|
/*
|
|
* If we are doing PIM processing, and we are forwarding
|
|
@@ -1394,7 +1417,7 @@
|
|
* routing daemon.
|
|
*/
|
|
/* have to make sure this is a valid mif */
|
|
- if (mifi < nummifs && mif6table[mifi].m6_ifp)
|
|
+ if (mifi < V_nummifs && V_mif6table[mifi].m6_ifp)
|
|
if (V_pim6 && (m->m_flags & M_LOOP) == 0) {
|
|
/*
|
|
* Check the M_LOOP flag to avoid an
|
|
@@ -1440,8 +1463,8 @@
|
|
return (EINVAL);
|
|
}
|
|
|
|
- for (mifp = mif6table, iif = 0;
|
|
- iif < nummifs && mifp &&
|
|
+ for (mifp = V_mif6table, iif = 0;
|
|
+ iif < V_nummifs && mifp &&
|
|
mifp->m6_ifp != ifp;
|
|
mifp++, iif++)
|
|
;
|
|
@@ -1459,14 +1482,14 @@
|
|
break;
|
|
}
|
|
|
|
- mrt6stat.mrt6s_upcalls++;
|
|
+ V_mrt6stat.mrt6s_upcalls++;
|
|
|
|
- if (socket_send(ip6_mrouter, mm, &sin6) < 0) {
|
|
+ if (socket_send(V_ip6_mrouter, mm, &sin6) < 0) {
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug)
|
|
log(LOG_WARNING, "mdq, ip6_mrouter socket queue full\n");
|
|
#endif
|
|
- ++mrt6stat.mrt6s_upq_sockfull;
|
|
+ ++V_mrt6stat.mrt6s_upq_sockfull;
|
|
return (ENOBUFS);
|
|
} /* if socket Q full */
|
|
} /* if PIM */
|
|
@@ -1476,11 +1499,11 @@
|
|
/* If I sourced this packet, it counts as output, else it was input. */
|
|
if (m->m_pkthdr.rcvif == NULL) {
|
|
/* XXX: is rcvif really NULL when output?? */
|
|
- mif6table[mifi].m6_pkt_out++;
|
|
- mif6table[mifi].m6_bytes_out += plen;
|
|
+ V_mif6table[mifi].m6_pkt_out++;
|
|
+ V_mif6table[mifi].m6_bytes_out += plen;
|
|
} else {
|
|
- mif6table[mifi].m6_pkt_in++;
|
|
- mif6table[mifi].m6_bytes_in += plen;
|
|
+ V_mif6table[mifi].m6_pkt_in++;
|
|
+ V_mif6table[mifi].m6_bytes_in += plen;
|
|
}
|
|
rt->mf6c_pkt_cnt++;
|
|
rt->mf6c_byte_cnt += plen;
|
|
@@ -1496,7 +1519,7 @@
|
|
V_ip6stat.ip6s_badscope++;
|
|
return (error);
|
|
}
|
|
- for (mifp = mif6table, mifi = 0; mifi < nummifs; mifp++, mifi++) {
|
|
+ for (mifp = V_mif6table, mifi = 0; mifi < V_nummifs; mifp++, mifi++) {
|
|
if (IF_ISSET(mifi, &rt->mf6c_ifset)) {
|
|
/*
|
|
* check if the outgoing packet is going to break
|
|
@@ -1504,12 +1527,12 @@
|
|
* XXX For packets through PIM register tunnel
|
|
* interface, we believe a routing daemon.
|
|
*/
|
|
- if (!(mif6table[rt->mf6c_parent].m6_flags &
|
|
+ if (!(V_mif6table[rt->mf6c_parent].m6_flags &
|
|
MIFF_REGISTER) &&
|
|
- !(mif6table[mifi].m6_flags & MIFF_REGISTER)) {
|
|
- if (in6_setscope(&src0, mif6table[mifi].m6_ifp,
|
|
+ !(V_mif6table[mifi].m6_flags & MIFF_REGISTER)) {
|
|
+ if (in6_setscope(&src0, V_mif6table[mifi].m6_ifp,
|
|
&oszone) ||
|
|
- in6_setscope(&dst0, mif6table[mifi].m6_ifp,
|
|
+ in6_setscope(&dst0, V_mif6table[mifi].m6_ifp,
|
|
&odzone) ||
|
|
iszone != oszone ||
|
|
idzone != odzone) {
|
|
@@ -1575,7 +1598,7 @@
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_XMIT)
|
|
log(LOG_DEBUG, "phyint_send on mif %d err %d\n",
|
|
- mifp - mif6table, error);
|
|
+ mifp - V_mif6table, error);
|
|
#endif
|
|
splx(s);
|
|
return;
|
|
@@ -1611,7 +1634,7 @@
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_XMIT)
|
|
log(LOG_DEBUG, "phyint_send on mif %d err %d\n",
|
|
- mifp - mif6table, error);
|
|
+ mifp - V_mif6table, error);
|
|
#endif
|
|
} else {
|
|
/*
|
|
@@ -1659,7 +1682,7 @@
|
|
ip6_sprintf(ip6bufd, &ip6->ip6_dst));
|
|
}
|
|
#endif
|
|
- ++pim6stat.pim6s_snd_registers;
|
|
+ ++V_pim6stat.pim6s_snd_registers;
|
|
|
|
/* Make a copy of the packet to send to the user level process */
|
|
MGETHDR(mm, M_DONTWAIT, MT_HEADER);
|
|
@@ -1691,18 +1714,18 @@
|
|
im6->im6_msgtype = MRT6MSG_WHOLEPKT;
|
|
im6->im6_mbz = 0;
|
|
|
|
- im6->im6_mif = mif - mif6table;
|
|
+ im6->im6_mif = mif - V_mif6table;
|
|
|
|
/* iif info is not given for reg. encap.n */
|
|
- mrt6stat.mrt6s_upcalls++;
|
|
+ V_mrt6stat.mrt6s_upcalls++;
|
|
|
|
- if (socket_send(ip6_mrouter, mm, &sin6) < 0) {
|
|
+ if (socket_send(V_ip6_mrouter, mm, &sin6) < 0) {
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug)
|
|
log(LOG_WARNING,
|
|
"register_send: ip6_mrouter socket queue full\n");
|
|
#endif
|
|
- ++mrt6stat.mrt6s_upq_sockfull;
|
|
+ ++V_mrt6stat.mrt6s_upq_sockfull;
|
|
return (ENOBUFS);
|
|
}
|
|
return (0);
|
|
@@ -1726,7 +1749,7 @@
|
|
int minlen;
|
|
int off = *offp;
|
|
|
|
- ++pim6stat.pim6s_rcv_total;
|
|
+ ++V_pim6stat.pim6s_rcv_total;
|
|
|
|
ip6 = mtod(m, struct ip6_hdr *);
|
|
pimlen = m->m_pkthdr.len - *offp;
|
|
@@ -1735,7 +1758,7 @@
|
|
* Validate lengths
|
|
*/
|
|
if (pimlen < PIM_MINLEN) {
|
|
- ++pim6stat.pim6s_rcv_tooshort;
|
|
+ ++V_pim6stat.pim6s_rcv_tooshort;
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_PIM)
|
|
log(LOG_DEBUG,"pim6_input: PIM packet too short\n");
|
|
@@ -1768,7 +1791,7 @@
|
|
#else
|
|
IP6_EXTHDR_GET(pim, struct pim *, m, off, minlen);
|
|
if (pim == NULL) {
|
|
- pim6stat.pim6s_rcv_tooshort++;
|
|
+ V_pim6stat.pim6s_rcv_tooshort++;
|
|
return (IPPROTO_DONE);
|
|
}
|
|
#endif
|
|
@@ -1788,7 +1811,7 @@
|
|
cksumlen = pimlen;
|
|
|
|
if (in6_cksum(m, IPPROTO_PIM, off, cksumlen)) {
|
|
- ++pim6stat.pim6s_rcv_badsum;
|
|
+ ++V_pim6stat.pim6s_rcv_badsum;
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_PIM)
|
|
log(LOG_DEBUG,
|
|
@@ -1802,7 +1825,7 @@
|
|
|
|
/* PIM version check */
|
|
if (pim->pim_ver != PIM_VERSION) {
|
|
- ++pim6stat.pim6s_rcv_badversion;
|
|
+ ++V_pim6stat.pim6s_rcv_badversion;
|
|
#ifdef MRT6DEBUG
|
|
log(LOG_ERR,
|
|
"pim6_input: incorrect version %d, expecting %d\n",
|
|
@@ -1828,14 +1851,14 @@
|
|
char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
|
|
#endif
|
|
|
|
- ++pim6stat.pim6s_rcv_registers;
|
|
+ ++V_pim6stat.pim6s_rcv_registers;
|
|
|
|
- if ((reg_mif_num >= nummifs) || (reg_mif_num == (mifi_t) -1)) {
|
|
+ if ((V_reg_mif_num >= V_nummifs) || (V_reg_mif_num == (mifi_t) -1)) {
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_PIM)
|
|
log(LOG_DEBUG,
|
|
"pim6_input: register mif not set: %d\n",
|
|
- reg_mif_num);
|
|
+ V_reg_mif_num);
|
|
#endif
|
|
m_freem(m);
|
|
return (IPPROTO_DONE);
|
|
@@ -1850,8 +1873,8 @@
|
|
* Validate length
|
|
*/
|
|
if (pimlen < PIM6_REG_MINLEN) {
|
|
- ++pim6stat.pim6s_rcv_tooshort;
|
|
- ++pim6stat.pim6s_rcv_badregisters;
|
|
+ ++V_pim6stat.pim6s_rcv_tooshort;
|
|
+ ++V_pim6stat.pim6s_rcv_badregisters;
|
|
#ifdef MRT6DEBUG
|
|
log(LOG_ERR,
|
|
"pim6_input: register packet size too "
|
|
@@ -1875,7 +1898,7 @@
|
|
|
|
/* verify the version number of the inner packet */
|
|
if ((eip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
|
|
- ++pim6stat.pim6s_rcv_badregisters;
|
|
+ ++V_pim6stat.pim6s_rcv_badregisters;
|
|
#ifdef MRT6DEBUG
|
|
log(LOG_DEBUG, "pim6_input: invalid IP version (%d) "
|
|
"of the inner packet\n",
|
|
@@ -1887,7 +1910,7 @@
|
|
|
|
/* verify the inner packet is destined to a mcast group */
|
|
if (!IN6_IS_ADDR_MULTICAST(&eip6->ip6_dst)) {
|
|
- ++pim6stat.pim6s_rcv_badregisters;
|
|
+ ++V_pim6stat.pim6s_rcv_badregisters;
|
|
#ifdef MRT6DEBUG
|
|
if (V_mrt6debug & DEBUG_PIM)
|
|
log(LOG_DEBUG,
|
|
@@ -1924,11 +1947,11 @@
|
|
"src %s, dst %s, mif %d\n",
|
|
ip6_sprintf(ip6bufs, &eip6->ip6_src),
|
|
ip6_sprintf(ip6bufd, &eip6->ip6_dst),
|
|
- reg_mif_num);
|
|
+ V_reg_mif_num);
|
|
}
|
|
#endif
|
|
|
|
- rc = if_simloop(mif6table[reg_mif_num].m6_ifp, m,
|
|
+ rc = if_simloop(V_mif6table[V_reg_mif_num].m6_ifp, m,
|
|
dst.sin6_family, 0);
|
|
|
|
/* prepare the register head to send to the mrouting daemon */
|
|
diff -ur sys.20081015/netinet6/ip6_mroute.h sys/netinet6/ip6_mroute.h
|
|
--- sys.20081015/netinet6/ip6_mroute.h 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/ip6_mroute.h 2008-11-05 13:21:56.000000000 -0800
|
|
@@ -266,6 +266,7 @@
|
|
extern int (*ip6_mrouter_get)(struct socket *so, struct sockopt *sopt);
|
|
extern int (*ip6_mrouter_done)(void);
|
|
extern int (*mrt6_ioctl)(int, caddr_t);
|
|
+
|
|
#endif /* _KERNEL */
|
|
|
|
#endif /* !_NETINET6_IP6_MROUTE_H_ */
|
|
diff -ur sys.20081015/netinet6/ip6_output.c sys/netinet6/ip6_output.c
|
|
--- sys.20081015/netinet6/ip6_output.c 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/ip6_output.c 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -744,7 +744,7 @@
|
|
* above, will be forwarded by the ip6_input() routine,
|
|
* if necessary.
|
|
*/
|
|
- if (ip6_mrouter && (flags & IPV6_FORWARDING) == 0) {
|
|
+ if (V_ip6_mrouter && (flags & IPV6_FORWARDING) == 0) {
|
|
/*
|
|
* XXX: ip6_mforward expects that rcvif is NULL
|
|
* when it is called from the originating path.
|
|
diff -ur sys.20081015/netinet6/ip6_var.h sys/netinet6/ip6_var.h
|
|
--- sys.20081015/netinet6/ip6_var.h 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/ip6_var.h 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -292,8 +292,8 @@
|
|
extern int ip6_v6only;
|
|
#endif
|
|
|
|
-extern struct socket *ip6_mrouter; /* multicast routing daemon */
|
|
#ifndef VIMAGE
|
|
+extern struct socket *ip6_mrouter; /* multicast routing daemon */
|
|
extern int ip6_sendredirects; /* send IP redirects when forwarding? */
|
|
extern int ip6_maxfragpackets; /* Maximum packets in reassembly queue */
|
|
extern int ip6_maxfrags; /* Maximum fragments in reassembly queue */
|
|
diff -ur sys.20081015/netinet6/mld6.c sys/netinet6/mld6.c
|
|
--- sys.20081015/netinet6/mld6.c 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/mld6.c 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -518,7 +518,7 @@
|
|
* Request loopback of the report if we are acting as a multicast
|
|
* router, so that the process-level routing daemon can hear it.
|
|
*/
|
|
- im6o.im6o_multicast_loop = (ip6_mrouter != NULL);
|
|
+ im6o.im6o_multicast_loop = (V_ip6_mrouter != NULL);
|
|
|
|
/* increment output statictics */
|
|
V_icmp6stat.icp6s_outhist[type]++;
|
|
diff -ur sys.20081015/netinet6/raw_ip6.c sys/netinet6/raw_ip6.c
|
|
--- sys.20081015/netinet6/raw_ip6.c 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/raw_ip6.c 2008-10-28 20:01:22.000000000 -0700
|
|
@@ -129,7 +129,9 @@
|
|
/*
|
|
* Hooks for multicast forwarding.
|
|
*/
|
|
+#ifndef VIMAGE
|
|
struct socket *ip6_mrouter = NULL;
|
|
+#endif
|
|
int (*ip6_mrouter_set)(struct socket *, struct sockopt *);
|
|
int (*ip6_mrouter_get)(struct socket *, struct sockopt *);
|
|
int (*ip6_mrouter_done)(void);
|
|
@@ -599,12 +601,13 @@
|
|
rip6_detach(struct socket *so)
|
|
{
|
|
INIT_VNET_INET(so->so_vnet);
|
|
+ INIT_VNET_INET6(so->so_vnet);
|
|
struct inpcb *inp;
|
|
|
|
inp = sotoinpcb(so);
|
|
KASSERT(inp != NULL, ("rip6_detach: inp == NULL"));
|
|
|
|
- if (so == ip6_mrouter && ip6_mrouter_done)
|
|
+ if (so == V_ip6_mrouter && ip6_mrouter_done)
|
|
ip6_mrouter_done();
|
|
/* xxx: RSVP */
|
|
INP_INFO_WLOCK(&V_ripcbinfo);
|
|
diff -ur sys.20081015/netinet6/vinet6.h sys/netinet6/vinet6.h
|
|
--- sys.20081015/netinet6/vinet6.h 2008-10-15 08:25:28.000000000 -0700
|
|
+++ sys/netinet6/vinet6.h 2008-10-29 12:58:52.000000000 -0700
|
|
@@ -43,6 +43,8 @@
|
|
#include <netinet6/scope6_var.h>
|
|
#include <netinet6/in6_ifattach.h>
|
|
#include <netinet6/nd6.h>
|
|
+#include <netinet6/ip6_mroute.h>
|
|
+#include <netinet6/pim6_var.h> /* struct pim6stat */
|
|
|
|
#define INIT_VNET_INET6(vnet) \
|
|
INIT_FROM_VNET(vnet, VNET_MOD_INET6, \
|
|
@@ -95,6 +97,7 @@
|
|
//int _icmp6_nodeinfo;
|
|
|
|
int _ip6_forwarding;
|
|
+ struct socket * _ip6_mrouter;
|
|
int _ip6_sendredirects;
|
|
int _ip6_defhlim;
|
|
int _ip6_defmcasthlim;
|
|
@@ -149,14 +152,25 @@
|
|
u_int32_t _ip6_temp_preferred_lifetime;
|
|
u_int32_t _ip6_temp_valid_lifetime;
|
|
|
|
- int _ip6_mrouter_ver;
|
|
- int _pim6;
|
|
- u_int _mrt6debug;
|
|
-
|
|
int _ip6_temp_regen_advance;
|
|
int _ip6_use_defzone;
|
|
|
|
struct ip6_pktopts _ip6_opts;
|
|
+
|
|
+ /* from ip6_mroute.c */
|
|
+ int _ip6_mrouter_ver; /* = 0; */
|
|
+ struct mrt6stat _mrt6stat;
|
|
+ struct mf6c * _mf6ctable[MF6CTBLSIZ];
|
|
+ u_char _n6expire[MF6CTBLSIZ];
|
|
+ struct mif6 _mif6table[MAXMIFS];
|
|
+ u_int _mrt6debug;
|
|
+ struct ifnet * _multicast_register_if6;
|
|
+ mifi_t _nummifs; /* = 0; */
|
|
+ mifi_t _reg_mif_num; /* = (mifi_t)-1; */
|
|
+ struct pim6stat _pim6stat;
|
|
+ int _pim6;
|
|
+ u_long _upcall_data[51];
|
|
+ struct callout _expire_upcalls_ch6;
|
|
};
|
|
#endif
|
|
|
|
@@ -206,6 +220,7 @@
|
|
//#define V_icmp6_nodeinfo VNET_INET6(icmp6_nodeinfo)
|
|
|
|
#define V_ip6_forwarding VNET_INET6(ip6_forwarding)
|
|
+#define V_ip6_mrouter VNET_INET6(ip6_mrouter)
|
|
#define V_ip6_sendredirects VNET_INET6(ip6_sendredirects)
|
|
#define V_ip6_defhlim VNET_INET6(ip6_defhlim)
|
|
#define V_ip6_defmcasthlim VNET_INET6(ip6_defmcasthlim)
|
|
@@ -260,13 +275,24 @@
|
|
#define V_ip6_temp_preferred_lifetime VNET_INET6(ip6_temp_preferred_lifetime)
|
|
#define V_ip6_temp_valid_lifetime VNET_INET6(ip6_temp_valid_lifetime)
|
|
|
|
-#define V_ip6_mrouter_ver VNET_INET6(ip6_mrouter_ver)
|
|
-#define V_pim6 VNET_INET6(pim6)
|
|
-#define V_mrt6debug VNET_INET6(mrt6debug)
|
|
#define V_ip6_temp_regen_advance VNET_INET6(ip6_temp_regen_advance)
|
|
|
|
#define V_ip6_use_defzone VNET_INET6(ip6_use_defzone)
|
|
|
|
#define V_ip6_opts VNET_INET6(ip6_opts)
|
|
|
|
+#define V_ip6_mrouter_ver VNET_INET6(ip6_mrouter_ver)
|
|
+#define V_mrt6stat VNET_INET6(mrt6stat)
|
|
+#define V_mf6ctable VNET_INET6(mf6ctable)
|
|
+#define V_n6expire VNET_INET6(n6expire)
|
|
+#define V_mif6table VNET_INET6(mif6table)
|
|
+#define V_mrt6debug VNET_INET6(mrt6debug)
|
|
+#define V_multicast_register_if6 VNET_INET6(multicast_register_if6)
|
|
+#define V_nummifs VNET_INET6(nummifs)
|
|
+#define V_reg_mif_num VNET_INET6(reg_mif_num)
|
|
+#define V_pim6stat VNET_INET6(pim6stat)
|
|
+#define V_pim6 VNET_INET6(pim6)
|
|
+#define V_upcall_data VNET_INET6(upcall_data)
|
|
+#define V_expire_upcalls_ch6 VNET_INET6(expire_upcalls_ch6)
|
|
+
|
|
#endif /* !_NETINET6_VINET6_H_ */
|
|
diff -ur sys.20081015/netipsec/keysock.c sys/netipsec/keysock.c
|
|
--- sys.20081015/netipsec/keysock.c 2008-10-15 08:25:29.000000000 -0700
|
|
+++ sys/netipsec/keysock.c 2008-10-29 07:57:18.000000000 -0700
|
|
@@ -429,8 +429,8 @@
|
|
kp->kp_promisc = kp->kp_registered = 0;
|
|
|
|
if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */
|
|
- key_cb.key_count++;
|
|
- key_cb.any_count++;
|
|
+ V_key_cb.key_count++;
|
|
+ V_key_cb.any_count++;
|
|
soisconnected(so);
|
|
so->so_options |= SO_USELOOPBACK;
|
|
|
|
diff -ur sys.20081015/sys/vimage.h sys/sys/vimage.h
|
|
--- sys.20081015/sys/vimage.h 2008-10-15 08:25:30.000000000 -0700
|
|
+++ sys/sys/vimage.h 2008-11-04 13:56:18.000000000 -0800
|
|
@@ -77,6 +77,7 @@
|
|
#define VNET_MOD_IPX 9
|
|
#define VNET_MOD_ATALK 10
|
|
#define VNET_MOD_DIVERT 11
|
|
+#define VNET_MOD_MROUTE 12
|
|
/* stateless modules */
|
|
#define VNET_MOD_NG_WORMHOLE 19
|
|
#define VNET_MOD_NG_ETHER 20
|
|
@@ -103,6 +104,7 @@
|
|
#define V_MOD_vnet_pf VNET_MOD_PF
|
|
#define V_MOD_vnet_gif VNET_MOD_GIF
|
|
#define V_MOD_vnet_ipsec VNET_MOD_IPSEC
|
|
+#define V_MOD_vnet_mroute VNET_MOD_MROUTE
|
|
|
|
#define V_MOD_vprocg 0
|
|
#define V_MOD_vcpu 0
|