svn commit: r192310 - in projects/pnet/sys: net netatalk netinet
netinet6 netipx netnatm
Robert Watson
rwatson at FreeBSD.org
Mon May 18 17:10:28 UTC 2009
Author: rwatson
Date: Mon May 18 17:10:26 2009
New Revision: 192310
URL: http://svn.freebsd.org/changeset/base/192310
Log:
Update netisr2 consumers for new netisr2 interfaces -- queue limits,
stats, and struct netisr_handler registration.
Modified:
projects/pnet/sys/net/rtsock.c
projects/pnet/sys/netatalk/ddp_usrreq.c
projects/pnet/sys/netinet/if_ether.c
projects/pnet/sys/netinet/igmp.c
projects/pnet/sys/netinet/ip_divert.c
projects/pnet/sys/netinet/ip_input.c
projects/pnet/sys/netinet6/ip6_input.c
projects/pnet/sys/netipx/ipx_input.c
projects/pnet/sys/netnatm/natm_proto.c
Modified: projects/pnet/sys/net/rtsock.c
==============================================================================
--- projects/pnet/sys/net/rtsock.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/net/rtsock.c Mon May 18 17:10:26 2009 (r192310)
@@ -92,11 +92,13 @@ MTX_SYSINIT(rtsock, &rtsock_mtx, "rtsock
#define RTSOCK_UNLOCK() mtx_unlock(&rtsock_mtx)
#define RTSOCK_LOCK_ASSERT() mtx_assert(&rtsock_mtx, MA_OWNED)
-static struct ifqueue rtsintrq;
-
SYSCTL_NODE(_net, OID_AUTO, route, CTLFLAG_RD, 0, "");
+
+#ifndef NETISR2
+static struct ifqueue rtsintrq;
SYSCTL_INT(_net_route, OID_AUTO, netisr_maxqlen, CTLFLAG_RW,
&rtsintrq.ifq_maxlen, 0, "maximum routing socket dispatch queue length");
+#endif
struct walkarg {
int w_tmemsize;
@@ -121,19 +123,47 @@ static void rt_getmetrics(const struct r
struct rt_metrics *out);
static void rt_dispatch(struct mbuf *, const struct sockaddr *);
+#ifdef NETISR2
+static struct netisr_handler rtsock_nh = {
+ .nh_name = "rtsock",
+ .nh_handler = rts_input,
+ .nh_proto = NETISR_ROUTE,
+ .nh_qlimit = 256,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+
+static int
+sysctl_route_netisr_maxqlen(SYSCTL_HANDLER_ARGS)
+{
+ int error, qlimit;
+
+ netisr2_getqlimit(&rtsock_nh, &qlimit);
+ error = sysctl_handle_int(oidp, &qlimit, 0, req);
+ if (error || !req->newptr)
+ return (error);
+ if (qlimit < 1)
+ return (EINVAL);
+ return (netisr2_setqlimit(&rtsock_nh, qlimit));
+}
+SYSCTL_PROC(_net_route, OID_AUTO, netisr_maxqlen, CTLTYPE_INT|CTLFLAG_RW,
+ 0, 0, sysctl_route_netisr_maxqlen, "I",
+ "maximum routing socket dispatch queue length");
+#endif
+
static void
rts_init(void)
{
int tmp;
+#ifdef NETISR2
+ if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp))
+ rtsock_nh.nh_qlimit = tmp;
+ netisr2_register(&rtsock_nh);
+#else
+ mtx_init(&rtsintrq.ifq_mtx, "rts_inq", NULL, MTX_DEF);
rtsintrq.ifq_maxlen = 256;
if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp))
rtsintrq.ifq_maxlen = tmp;
- mtx_init(&rtsintrq.ifq_mtx, "rts_inq", NULL, MTX_DEF);
-#ifdef NETISR2
- netisr2_register(NETISR_ROUTE, "route", rts_input, NULL, NULL,
- rtsintrq.ifq_maxlen);
-#else
netisr_register(NETISR_ROUTE, rts_input, &rtsintrq, 0);
#endif
}
@@ -1231,11 +1261,7 @@ rt_dispatch(struct mbuf *m, const struct
*(unsigned short *)(tag + 1) = sa->sa_family;
m_tag_prepend(m, tag);
}
-#ifdef NETISR2
- netisr2_queue(NETISR_ROUTE, 0, m); /* mbuf is free'd on failure. */
-#else
netisr_queue(NETISR_ROUTE, m); /* mbuf is free'd on failure. */
-#endif
}
/*
Modified: projects/pnet/sys/netatalk/ddp_usrreq.c
==============================================================================
--- projects/pnet/sys/netatalk/ddp_usrreq.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netatalk/ddp_usrreq.c Mon May 18 17:10:26 2009 (r192310)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2004-2005 Robert N. M. Watson
+ * Copyright (c) 2004-2009 Robert N. M. Watson
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -73,7 +73,34 @@
static u_long ddp_sendspace = DDP_MAXSZ; /* Max ddp size + 1 (ddp_type) */
static u_long ddp_recvspace = 10 * (587 + sizeof(struct sockaddr_at));
+#ifdef NETISR2
+static const struct netisr_handler atalk1_nh = {
+ .nh_name = "atalk1",
+ .nh_handler = at1intr,
+ .nh_proto = NETISR_ATALK1,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+
+static const struct netisr_handler atalk2_nh = {
+ .nh_name = "atalk2",
+ .nh_handler = at2intr,
+ .nh_proto = NETISR_ATALK2,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+
+static const struct netisr_handler aarp_nh = {
+ .nh_name = "aarp",
+ .nh_handler = aarpintr,
+ .nh_proto = NETISR_AARP,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+#else
static struct ifqueue atintrq1, atintrq2, aarpintrq;
+#endif
+
static int
ddp_attach(struct socket *so, int proto, struct thread *td)
@@ -259,21 +286,18 @@ void
ddp_init(void)
{
+ DDP_LIST_LOCK_INIT();
+#ifdef NETISR2
+ netisr2_register(&atalk1_nh);
+ netisr2_register(&atalk2_nh);
+ netisr2_register(&aarp_nh);
+#else
atintrq1.ifq_maxlen = IFQ_MAXLEN;
atintrq2.ifq_maxlen = IFQ_MAXLEN;
aarpintrq.ifq_maxlen = IFQ_MAXLEN;
mtx_init(&atintrq1.ifq_mtx, "at1_inq", NULL, MTX_DEF);
mtx_init(&atintrq2.ifq_mtx, "at2_inq", NULL, MTX_DEF);
mtx_init(&aarpintrq.ifq_mtx, "aarp_inq", NULL, MTX_DEF);
- DDP_LIST_LOCK_INIT();
-#ifdef NETISR2
- netisr2_register(NETISR_ATALK1, "atalk1", at1intr, NULL, NULL,
- IFQ_MAXLEN);
- netisr2_register(NETISR_ATALK2, "atalk2", at2intr, NULL, NULL,
- IFQ_MAXLEN);
- netisr2_register(NETISR_AARP, "aarp", aarpintr, NULL, NULL,
- IFQ_MAXLEN);
-#else
netisr_register(NETISR_ATALK1, at1intr, &atintrq1, 0);
netisr_register(NETISR_ATALK2, at2intr, &atintrq2, 0);
netisr_register(NETISR_AARP, aarpintr, &aarpintrq, 0);
Modified: projects/pnet/sys/netinet/if_ether.c
==============================================================================
--- projects/pnet/sys/netinet/if_ether.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netinet/if_ether.c Mon May 18 17:10:26 2009 (r192310)
@@ -98,8 +98,6 @@ static int arp_proxyall;
SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, max_age,
CTLFLAG_RW, arpt_keep, 0, "ARP entry lifetime in seconds");
-static struct ifqueue arpintrq;
-
SYSCTL_V_INT(V_NET, vnet_inet, _net_link_ether_inet, OID_AUTO, maxtries,
CTLFLAG_RW, arp_maxtries, 0,
"ARP resolution attempts before returning error");
@@ -120,6 +118,18 @@ static void arptimer(void *);
static void in_arpinput(struct mbuf *);
#endif
+#ifdef NETISR2
+static const struct netisr_handler arp_nh = {
+ .nh_name = "arp",
+ .nh_handler = arpintr,
+ .nh_proto = NETISR_ARP,
+ .nh_qlimit = 50,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+#else
+static struct ifqueue arpintrq;
+#endif
+
#ifndef VIMAGE_GLOBALS
static const vnet_modinfo_t vnet_arp_modinfo = {
.vmi_id = VNET_MOD_ARP,
@@ -823,11 +833,11 @@ arp_init(void)
arp_iattach(NULL);
#endif
- arpintrq.ifq_maxlen = 50;
- mtx_init(&arpintrq.ifq_mtx, "arp_inq", NULL, MTX_DEF);
#ifdef NETISR2
- netisr2_register(NETISR_ARP, "arp", arpintr, NULL, NULL, 50);
+ netisr2_register(&arp_nh);
#else
+ arpintrq.ifq_maxlen = 50;
+ mtx_init(&arpintrq.ifq_mtx, "arp_inq", NULL, MTX_DEF);
netisr_register(NETISR_ARP, arpintr, &arpintrq, 0);
#endif
}
Modified: projects/pnet/sys/netinet/igmp.c
==============================================================================
--- projects/pnet/sys/netinet/igmp.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netinet/igmp.c Mon May 18 17:10:26 2009 (r192310)
@@ -151,6 +151,21 @@ static int vnet_igmp_iattach(const void
static int vnet_igmp_idetach(const void *);
#endif /* VIMAGE */
+#ifdef NETISR2
+static const struct netisr_handler igmp_nh = {
+ .nh_name = "igmp",
+ .nh_handler = igmp_intr,
+ .nh_proto = NETISR_IGMP,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+#else
+/*
+ * Global netisr output queue.
+ */
+struct ifqueue igmpoq;
+#endif
+
/*
* System-wide globals.
*
@@ -197,11 +212,6 @@ struct mbuf *m_raopt; /* Router Alert
MALLOC_DEFINE(M_IGMP, "igmp", "igmp state");
/*
- * Global netisr output queue.
- */
-struct ifqueue igmpoq;
-
-/*
* VIMAGE-wide globals.
*
* The IGMPv3 timers themselves need to run per-image, however,
@@ -3545,15 +3555,13 @@ igmp_sysinit(void)
IGMP_LOCK_INIT();
- mtx_init(&igmpoq.ifq_mtx, "igmpoq_mtx", NULL, MTX_DEF);
- IFQ_SET_MAXLEN(&igmpoq, IFQ_MAXLEN);
-
m_raopt = igmp_ra_alloc();
#ifdef NETISR2
- netisr2_register(NETISR_IGMP, "igmp", igmp_intr, NULL, NULL,
- IFQ_MAXLEN);
+ netisr2_register(&igmp_nh);
#else
+ mtx_init(&igmpoq.ifq_mtx, "igmpoq_mtx", NULL, MTX_DEF);
+ IFQ_SET_MAXLEN(&igmpoq, IFQ_MAXLEN);
netisr_register(NETISR_IGMP, igmp_intr, &igmpoq, 0);
#endif
}
@@ -3565,11 +3573,11 @@ igmp_sysuninit(void)
CTR1(KTR_IGMPV3, "%s: tearing down", __func__);
#ifdef NETISR2
- netisr2_unregister(NETISR_IGMP);
+ netisr2_unregister(&igmp_nh);
#else
netisr_unregister(NETISR_IGMP);
-#endif
mtx_destroy(&igmpoq.ifq_mtx);
+#endif
m_free(m_raopt);
m_raopt = NULL;
Modified: projects/pnet/sys/netinet/ip_divert.c
==============================================================================
--- projects/pnet/sys/netinet/ip_divert.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netinet/ip_divert.c Mon May 18 17:10:26 2009 (r192310)
@@ -471,7 +471,7 @@ div_output(struct socket *so, struct mbu
#endif
/* Send packet to input processing via netisr */
#ifdef NETISR2
- netisr2_queue(NETISR_IP, (uintptr_t)so, m);
+ netisr2_queue_src(NETISR_IP, (uintptr_t)so, m);
#else
netisr_queue(NETISR_IP, m);
#endif
Modified: projects/pnet/sys/netinet/ip_input.c
==============================================================================
--- projects/pnet/sys/netinet/ip_input.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netinet/ip_input.c Mon May 18 17:10:26 2009 (r192310)
@@ -166,18 +166,29 @@ SYSCTL_V_INT(V_NET, vnet_inet, _net_inet
struct pfil_head inet_pfil_hook; /* Packet filter hooks */
+#ifdef NETISR2
+static struct netisr_handler ip_nh = {
+ .nh_name = "ip",
+ .nh_handler = ip_input,
+ .nh_proto = NETISR_IP,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_FLOW,
+};
+#else
static struct ifqueue ipintrq;
static int ipqmaxlen = IFQ_MAXLEN;
-extern struct domain inetdomain;
-extern struct protosw inetsw[];
-u_char ip_protox[IPPROTO_MAX];
-
SYSCTL_INT(_net_inet_ip, IPCTL_INTRQMAXLEN, intr_queue_maxlen, CTLFLAG_RW,
&ipintrq.ifq_maxlen, 0, "Maximum size of the IP input queue");
SYSCTL_INT(_net_inet_ip, IPCTL_INTRQDROPS, intr_queue_drops, CTLFLAG_RD,
&ipintrq.ifq_drops, 0,
"Number of packets dropped from the IP input queue");
+#endif
+
+extern struct domain inetdomain;
+extern struct protosw inetsw[];
+u_char ip_protox[IPPROTO_MAX];
+
SYSCTL_V_STRUCT(V_NET, vnet_inet, _net_inet_ip, IPCTL_STATS, stats, CTLFLAG_RW,
ipstat, ipstat, "IP statistics (struct ipstat, netinet/ip_var.h)");
@@ -250,6 +261,46 @@ static void vnet_inet_register()
SYSINIT(inet, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, vnet_inet_register, 0);
#endif
+#ifdef NETISR2
+static int
+sysctl_netinet_intr_queue_maxlen(SYSCTL_HANDLER_ARGS)
+{
+ int error, qlimit;
+
+ netisr2_getqlimit(&ip_nh, &qlimit);
+ error = sysctl_handle_int(oidp, &qlimit, 0, req);
+ if (error || !req->newptr)
+ return (error);
+ if (qlimit < 1)
+ return (EINVAL);
+ return (netisr2_setqlimit(&ip_nh, qlimit));
+}
+SYSCTL_PROC(_net_inet_ip, IPCTL_INTRQMAXLEN, intr_queue_maxlen,
+ CTLTYPE_INT|CTLFLAG_RW, 0, 0, sysctl_netinet_intr_queue_maxlen, "I",
+ "Maximum size of the IP input queue");
+
+static int
+sysctl_netinet_intr_queue_drops(SYSCTL_HANDLER_ARGS)
+{
+ u_int64_t qdrops_long;
+ int error, qdrops;
+
+ netisr2_getqdrops(&ip_nh, &qdrops_long);
+ qdrops = qdrops_long;
+ error = sysctl_handle_int(oidp, &qdrops, 0, req);
+ if (error || !req->newptr)
+ return (error);
+ if (qdrops != 0)
+ return (EINVAL);
+ netisr2_clearqdrops(&ip_nh);
+ return (0);
+
+}
+SYSCTL_PROC(_net_inet_ip, IPCTL_INTRQDROPS, intr_queue_drops,
+ CTLTYPE_INT|CTLFLAG_RD, 0, 0, sysctl_netinet_intr_queue_drops, "I",
+ "Number of packets dropped from the IP input queue");
+#endif
+
/*
* IP initialization: fill in IP protocol switch table.
* All protocols not implemented in kernel go to raw IP protocol handler.
@@ -348,14 +399,13 @@ ip_init(void)
/* Initialize various other remaining things. */
IPQ_LOCK_INIT();
- ipintrq.ifq_maxlen = ipqmaxlen;
- mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF);
#ifdef NETISR2
- netisr2_register(NETISR_IP, "ipv4", ip_input, NULL, NULL, ipqmaxlen);
+ netisr2_register(&ip_nh);
#else
+ ipintrq.ifq_maxlen = ipqmaxlen;
+ mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF);
netisr_register(NETISR_IP, ip_input, &ipintrq, 0);
#endif
-
ip_ft = flowtable_alloc(ip_output_flowtable_size, FL_PCPU);
}
Modified: projects/pnet/sys/netinet6/ip6_input.c
==============================================================================
--- projects/pnet/sys/netinet6/ip6_input.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netinet6/ip6_input.c Mon May 18 17:10:26 2009 (r192310)
@@ -122,7 +122,18 @@ __FBSDID("$FreeBSD$");
extern struct domain inet6domain;
u_char ip6_protox[IPPROTO_MAX];
+
+#ifdef NETISR2
+static struct netisr_handler ip6_nh = {
+ .nh_name = "ip6",
+ .nh_handler = ip6_input,
+ .nh_proto = NETISR_IPV6,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_FLOW,
+};
+#else
static struct ifqueue ip6intrq;
+#endif
#ifndef VIMAGE
#ifndef VIMAGE_GLOBALS
@@ -297,12 +308,12 @@ ip6_init(void)
printf("%s: WARNING: unable to register pfil hook, "
"error %d\n", __func__, i);
- ip6intrq.ifq_maxlen = V_ip6qmaxlen; /* XXX */
- mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF);
#ifdef NETISR2
- netisr2_register(NETISR_IPV6, "ipv4", ip6_input, NULL, NULL,
- V_ip6qmaxlen);
+ ip6_nh.nh_qlimit = V_ip6qmaxlen;
+ netisr2_register(&ip6_nh);
#else
+ ip6intrq.ifq_maxlen = V_ip6qmaxlen; /* XXX */
+ mtx_init(&ip6intrq.ifq_mtx, "ip6_inq", NULL, MTX_DEF);
netisr_register(NETISR_IPV6, ip6_input, &ip6intrq, 0);
#endif
}
Modified: projects/pnet/sys/netipx/ipx_input.c
==============================================================================
--- projects/pnet/sys/netipx/ipx_input.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netipx/ipx_input.c Mon May 18 17:10:26 2009 (r192310)
@@ -122,8 +122,18 @@ struct mtx ipxpcb_list_mtx;
struct ipxpcbhead ipxpcb_list;
struct ipxpcbhead ipxrawpcb_list;
+#ifdef NETISR2
+static const struct netisr_handler ipx_nh = {
+ .nh_name = "ipx",
+ .nh_handler = ipxintr,
+ .nh_proto = NETISR_IPX,
+ .nh_qlimit = IFQ_MAXLEN,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+#else
static int ipxqmaxlen = IFQ_MAXLEN;
static struct ifqueue ipxintrq;
+#endif
long ipx_pexseq; /* Locked with ipxpcb_list_mtx. */
@@ -154,11 +164,12 @@ ipx_init(void)
ipx_hostmask.sipx_addr.x_net = ipx_broadnet;
ipx_hostmask.sipx_addr.x_host = ipx_broadhost;
- ipxintrq.ifq_maxlen = ipxqmaxlen;
- mtx_init(&ipxintrq.ifq_mtx, "ipx_inq", NULL, MTX_DEF);
#ifdef NETISR2
- netisr2_register(NETISR_IPX, "ipx", ipxintr, NULL, NULL, ipxqmaxlen);
+ ipx_nh.nh_qlimit = ipxqmaxlen;
+ netisr2_register(&ipx_nh);
#else
+ ipxintrq.ifq_maxlen = ipxqmaxlen;
+ mtx_init(&ipxintrq.ifq_mtx, "ipx_inq", NULL, MTX_DEF);
netisr_register(NETISR_IPX, ipxintr, &ipxintrq, 0);
#endif
}
Modified: projects/pnet/sys/netnatm/natm_proto.c
==============================================================================
--- projects/pnet/sys/netnatm/natm_proto.c Mon May 18 17:08:57 2009 (r192309)
+++ projects/pnet/sys/netnatm/natm_proto.c Mon May 18 17:10:26 2009 (r192310)
@@ -91,8 +91,19 @@ static struct domain natmdomain = {
.dom_protoswNPROTOSW = &natmsw[sizeof(natmsw)/sizeof(natmsw[0])],
};
+#ifdef NETISR2
+static struct netisr_handler natm_nh = {
+ .nh_name = "natm",
+ .nh_handler = natmintr,
+ .nh_proto = NETISR_NATM,
+ .nh_qlimit = 1000 /* IFQ_MAXLEN */,
+ .nh_policy = NETISR_POLICY_SOURCE,
+};
+#else
static int natmqmaxlen = 1000 /* IFQ_MAXLEN */; /* max # of packets on queue */
static struct ifqueue natmintrq;
+#endif
+
#ifdef NATM_STAT
u_int natm_sodropcnt; /* # mbufs dropped due to full sb */
u_int natm_sodropbytes; /* # of bytes dropped */
@@ -104,14 +115,13 @@ static void
natm_init(void)
{
LIST_INIT(&natm_pcbs);
- bzero(&natmintrq, sizeof(natmintrq));
- natmintrq.ifq_maxlen = natmqmaxlen;
NATM_LOCK_INIT();
- mtx_init(&natmintrq.ifq_mtx, "natm_inq", NULL, MTX_DEF);
#ifdef NETISR2
- netisr2_register(NETISR_NATM, "natm", natmintr, NULL, NULL,
- natmqmaxlen);
+ netisr2_register(&natm_nh);
#else
+ bzero(&natmintrq, sizeof(natmintrq));
+ natmintrq.ifq_maxlen = natmqmaxlen;
+ mtx_init(&natmintrq.ifq_mtx, "natm_inq", NULL, MTX_DEF);
netisr_register(NETISR_NATM, natmintr, &natmintrq, 0);
#endif
}
More information about the svn-src-projects
mailing list