aboutsummaryrefslogtreecommitdiff
path: root/sys/net/netisr.h
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2009-06-01 10:41:38 +0000
committerRobert Watson <rwatson@FreeBSD.org>2009-06-01 10:41:38 +0000
commitd4b5cae49bff736c08586be8199e09a511ca711b (patch)
tree786f045f4da789d697041f2eeca0ba057458f558 /sys/net/netisr.h
parent79d6b3f34ac0df84d792748389c2bd32a2fb33f2 (diff)
downloadsrc-d4b5cae49bff736c08586be8199e09a511ca711b.tar.gz
src-d4b5cae49bff736c08586be8199e09a511ca711b.zip
Notes
Diffstat (limited to 'sys/net/netisr.h')
-rw-r--r--sys/net/netisr.h138
1 files changed, 102 insertions, 36 deletions
diff --git a/sys/net/netisr.h b/sys/net/netisr.h
index 79293027e544..f299b2e84a5c 100644
--- a/sys/net/netisr.h
+++ b/sys/net/netisr.h
@@ -1,6 +1,6 @@
/*-
- * Copyright (c) 1980, 1986, 1989, 1993
- * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 2007-2009 Robert N. M. Watson
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -10,14 +10,11 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -26,20 +23,18 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)netisr.h 8.1 (Berkeley) 6/10/93
* $FreeBSD$
*/
#ifndef _NET_NETISR_H_
#define _NET_NETISR_H_
+#ifdef _KERNEL
/*
* The netisr (network interrupt service routine) provides a deferred
* execution evironment in which (generally inbound) network processing can
- * take place. Protocols register handlers and, optionally, packet queues;
- * when packets are delivered to the queue, the protocol handler will be
- * executed directly, or via deferred dispatch depending on the
- * circumstances.
+ * take place. Protocols register handlers which will be executed directly,
+ * or via deferred dispatch, depending on the circumstances.
*
* Historically, this was implemented by the BSD software ISR facility; it is
* now implemented via a software ithread (SWI).
@@ -53,37 +48,108 @@
#define NETISR_ATALK1 17 /* Appletalk phase 1 */
#define NETISR_ARP 18 /* same as AF_LINK */
#define NETISR_IPX 23 /* same as AF_IPX */
+#define NETISR_ETHER 24 /* ethernet input */
#define NETISR_IPV6 27
#define NETISR_NATM 28
#define NETISR_POLLMORE 31 /* polling callback, must be last */
-#ifndef LOCORE
-#ifdef _KERNEL
+/*-
+ * Protocols express ordering constraints and affinity preferences by
+ * implementing one or neither of nh_m2flow and nh_m2cpuid, which are used by
+ * netisr to determine which per-CPU workstream to assign mbufs to.
+ *
+ * The following policies may be used by protocols:
+ *
+ * NETISR_POLICY_SOURCE - netisr should maintain source ordering without
+ * advice from the protocol. netisr will ignore any
+ * flow IDs present on the mbuf for the purposes of
+ * work placement.
+ *
+ * NETISR_POLICY_FLOW - netisr should maintain flow ordering as defined by
+ * the mbuf header flow ID field. If the protocol
+ * implements nh_m2flow, then netisr will query the
+ * protocol in the event that the mbuf doesn't have a
+ * flow ID, falling back on source ordering.
+ *
+ * NETISR_POLICY_CPU - netisr will delegate all work placement decisions to
+ * the protocol, querying nh_m2cpuid for each packet.
+ *
+ * Protocols might make decisions about work placement based on an existing
+ * calculated flow ID on the mbuf, such as one provided in hardware, the
+ * receive interface pointed to by the mbuf (if any), the optional source
+ * identifier passed at some dispatch points, or even parse packet headers to
+ * calculate a flow. Both protocol handlers may return a new mbuf pointer
+ * for the chain, or NULL if the packet proves invalid or m_pullup() fails.
+ *
+ * XXXRW: If we eventually support dynamic reconfiguration, there should be
+ * protocol handlers to notify them of CPU configuration changes so that they
+ * can rebalance work.
+ */
+struct mbuf;
+typedef void netisr_handler_t (struct mbuf *m);
+typedef struct mbuf *netisr_m2cpuid_t(struct mbuf *m, uintptr_t source,
+ u_int *cpuid);
+typedef struct mbuf *netisr_m2flow_t(struct mbuf *m, uintptr_t source);
+
+#define NETISR_POLICY_SOURCE 1 /* Maintain source ordering. */
+#define NETISR_POLICY_FLOW 2 /* Maintain flow ordering. */
+#define NETISR_POLICY_CPU 3 /* Protocol determines CPU placement. */
+
+/*
+ * Data structure describing a protocol handler.
+ */
+struct netisr_handler {
+ const char *nh_name; /* Character string protocol name. */
+ netisr_handler_t *nh_handler; /* Protocol handler. */
+ netisr_m2flow_t *nh_m2flow; /* Query flow for untagged packet. */
+ netisr_m2cpuid_t *nh_m2cpuid; /* Query CPU to process mbuf on. */
+ u_int nh_proto; /* Integer protocol ID. */
+ u_int nh_qlimit; /* Maximum per-CPU queue depth. */
+ u_int nh_policy; /* Work placement policy. */
+ u_int nh_ispare[5]; /* For future use. */
+ void *nh_pspare[4]; /* For future use. */
+};
-void legacy_setsoftnet(void);
+/*
+ * Register, unregister, and other netisr handler management functions.
+ */
+void netisr_clearqdrops(const struct netisr_handler *nhp);
+void netisr_getqdrops(const struct netisr_handler *nhp,
+ u_int64_t *qdropsp);
+void netisr_getqlimit(const struct netisr_handler *nhp, u_int *qlimitp);
+void netisr_register(const struct netisr_handler *nhp);
+int netisr_setqlimit(const struct netisr_handler *nhp, u_int qlimit);
+void netisr_unregister(const struct netisr_handler *nhp);
-extern volatile unsigned int netisr; /* scheduling bits for network */
-#define schednetisr(anisr) do { \
- atomic_set_rel_int(&netisr, 1 << (anisr)); \
- legacy_setsoftnet(); \
-} while (0)
-/* used to atomically schedule multiple netisrs */
-#define schednetisrbits(isrbits) do { \
- atomic_set_rel_int(&netisr, isrbits); \
- legacy_setsoftnet(); \
-} while (0)
+/*
+ * Process a packet destined for a protocol, and attempt direct dispatch.
+ * Supplemental source ordering information can be passed using the _src
+ * variant.
+ */
+int netisr_dispatch(u_int proto, struct mbuf *m);
+int netisr_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m);
+int netisr_queue(u_int proto, struct mbuf *m);
+int netisr_queue_src(u_int proto, uintptr_t source, struct mbuf *m);
-struct ifqueue;
-struct mbuf;
+/*
+ * Provide a default implementation of "map an ID to a CPU ID".
+ */
+u_int netisr_default_flow2cpu(u_int flowid);
-typedef void netisr_t (struct mbuf *);
-
-void netisr_dispatch(int, struct mbuf *);
-int netisr_queue(int, struct mbuf *);
-void netisr_register(int, netisr_t *, struct ifqueue *, int);
-void netisr_unregister(int);
+/*
+ * Utility routines to return the number of CPUs participting in netisr, and
+ * to return a mapping from a number to a CPU ID that can be used with the
+ * scheduler.
+ */
+u_int netisr_get_cpucount(void);
+u_int netisr_get_cpuid(u_int cpunumber);
-#endif
-#endif
+/*
+ * Interfaces between DEVICE_POLLING and netisr.
+ */
+void netisr_sched_poll(void);
+void netisr_poll(void);
+void netisr_pollmore(void);
-#endif
+#endif /* !_KERNEL */
+#endif /* !_NET_NETISR_H_ */