Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
NETISR(9)		    Kernel Developer's Manual		       NETISR(9)

NAME
     netisr -- Kernel network dispatch service

SYNOPSIS
     #include <net/netisr.h>

     void
     netisr_register(const struct netisr_handler *nhp);

     void
     netisr_unregister(const struct netisr_handler *nhp);

     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);

     void
     netisr_clearqdrops(const struct netisr_handler *nhp);

     void
     netisr_getqdrops(const struct netisr_handler *nhp, uint64_t *qdropsp);

     void
     netisr_getqlimit(const struct netisr_handler *nhp, u_int *qlimitp);

     int
     netisr_setqlimit(const struct netisr_handler *nhp, u_int qlimit);

     u_int
     netisr_default_flow2cpu(u_int flowid);

     u_int
     netisr_get_cpucount(void);

     u_int
     netisr_get_cpuid(u_int cpunumber);

     With optional virtual network stack support enabled via the following
     kernel compile option:

	   options VIMAGE

     void
     netisr_register_vnet(const struct netisr_handler *nhp);

     void
     netisr_unregister_vnet(const struct netisr_handler *nhp);

DESCRIPTION
     The  netisr  kernel interface suite allows device drivers (and other packet
     sources) to direct packets to protocols for directly dispatched or deferred
     processing.  Protocol registration and work stream statistics may be  moni-
     tored using netstat(1).

   Protocol registration
     Protocols	register  and  unregister  handlers  using netisr_register() and
     netisr_unregister(), and may also manage queue limits and statistics  using
     the   netisr_clearqdrops(),   netisr_getqdrops(),	netisr_getqlimit(),  and
     netisr_setqlimit().

     In case of VIMAGE kernels each virtual network stack (vnet),  that  is  not
     the  default  base  system  network stack, calls netisr_register_vnet() and
     netisr_unregister_vnet() to enable or  disable  packet  processing  by  the
     netisr for each protocol.	Disabling will also purge any outstanding packet
     from the protocol queue.

     netisr supports multi-processor execution of handlers, and relies on a com-
     bination  of source ordering and protocol-specific ordering and work-place-
     ment policies to decide how to distribute work across one	or  more  worker
     threads.  Registering protocols will declare one of three policies:

     NETISR_POLICY_SOURCE  netisr should maintain source ordering without advice
			   from  the  protocol.  netisr will ignore any flow IDs
			   present on mbuf headers  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  im-
			   plements nh_m2flow, then netisr will query the proto-
			   col	in  the  event that the mbuf doesn't have a flow
			   ID, falling back on source ordering.

     NETISR_POLICY_CPU	   netisr will entirely delegate all work placement  de-
			   cisions to the protocol, querying nh_m2cpuid for each
			   packet.

     Registration  is declared using struct netisr_handler, whose fields are de-
     fined as follows:

     const char * nh_name	  Unique character string name of the  protocol,
				  which  may be included in sysctl(3) MIB names,
				  so should not contain whitespace.

     netisr_handler_t nh_handler  Protocol handler function that will be invoked
				  on each packet received for the protocol.

     netisr_m2flow_t nh_m2flow	  Optional protocol function to generate a  flow
				  ID  and  set a valid hashtype for packets that
				  enter the netisr with M_HASHTYPE_GET(m)  equal
				  to  M_HASHTYPE_NONE.	 Will  be used only with
				  NETISR_POLICY_FLOW.

     netisr_m2cpuid_t nh_m2cpuid  Protocol function  to  determine  what  CPU  a
				  packet  should  be processed on.  Will be used
				  only with NETISR_POLICY_CPU.

     netisr_drainedcpu_t nh_drainedcpu
				  Optional callback function that  will  be  in-
				  voked  when  a  per-CPU queue was drained.  It
				  will never fire for directly dispatched  pack-
				  ets.	 Unless  fully understood, this special-
				  purpose function should not be used.

     u_int nh_proto		  Protocol number  used  by  both  protocols  to
				  identify  themselves	to netisr, and by packet
				  sources to select what handler will be used to
				  process packets.  A table of supported  proto-
				  col numbers appears below.  For implementation
				  reasons,  protocol  numbers  great than 15 are
				  currently unsupported.

     u_int nh_qlimit		  The maximum per-CPU queue depth for the proto-
				  col; due to internal	implementation	details,
				  the  effective  queue  depth may be as much as
				  twice this number.

     u_int nh_policy		  The ordering and work placement policy for the
				  protocol, as described earlier.

   Packet source interface
     Packet sources, such as network interfaces, may request protocol processing
     using the netisr_dispatch() and netisr_queue() interfaces.  Both  accept  a
     protocol number and mbuf argument, but while netisr_queue() will always ex-
     ecute   the   protocol   handler  asynchronously  in  a  deferred	context,
     netisr_dispatch() will optionally direct dispatch if  permitted  by  global
     and per-protocol policy.

     In  order to provide additional load balancing and flow information, packet
     sources may also specify an opaque source	identifier,  which  in	practice
     might   be  a  network  interface	number	or  socket  pointer,  using  the
     netisr_dispatch_src() and netisr_queue_src() variants.

   Protocol number constants
     The follow protocol numbers are currently defined:

     NETISR_IP	   IPv4

     NETISR_IGMP   IGMPv3 loopback

     NETISR_ROUTE  Routing socket loopback

     NETISR_ARP    ARP

     NETISR_IPV6   IPv6

AUTHORS
     This manual page and the netisr implementation were written by Robert N. M.
     Watson.

FreeBSD ports 15.quarterly	 April 12, 2023 		       NETISR(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=netisr&sektion=9&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help