File:  [DragonFly] / src / sys / net / netisr.h
Revision 1.10: download - view: text, annotated - select for diffs
Sun Mar 14 07:57:26 2004 UTC (10 years, 1 month ago) by hsu
Branches: MAIN
CVS tags: HEAD
Make tcp_drain() per-cpu.

    1: /*
    2:  * Copyright (c) 1980, 1986, 1989, 1993
    3:  *	The Regents of the University of California.  All rights reserved.
    4:  *
    5:  * Redistribution and use in source and binary forms, with or without
    6:  * modification, are permitted provided that the following conditions
    7:  * are met:
    8:  * 1. Redistributions of source code must retain the above copyright
    9:  *    notice, this list of conditions and the following disclaimer.
   10:  * 2. Redistributions in binary form must reproduce the above copyright
   11:  *    notice, this list of conditions and the following disclaimer in the
   12:  *    documentation and/or other materials provided with the distribution.
   13:  * 3. All advertising materials mentioning features or use of this software
   14:  *    must display the following acknowledgement:
   15:  *	This product includes software developed by the University of
   16:  *	California, Berkeley and its contributors.
   17:  * 4. Neither the name of the University nor the names of its contributors
   18:  *    may be used to endorse or promote products derived from this software
   19:  *    without specific prior written permission.
   20:  *
   21:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31:  * SUCH DAMAGE.
   32:  *
   33:  *	@(#)netisr.h	8.1 (Berkeley) 6/10/93
   34:  * $FreeBSD: src/sys/net/netisr.h,v 1.21.2.5 2002/02/09 23:02:39 luigi Exp $
   35:  * $DragonFly: src/sys/net/netisr.h,v 1.10 2004/03/14 07:57:26 hsu Exp $
   36:  */
   37: 
   38: #ifndef _NET_NETISR_H_
   39: #define _NET_NETISR_H_
   40: 
   41: #include <sys/msgport.h>
   42: 
   43: /*
   44:  * The networking code runs off software interrupts.
   45:  *
   46:  * You can switch into the network by doing splnet() and return by splx().
   47:  * The software interrupt level for the network is higher than the software
   48:  * level for the clock (so you can enter the network in routines called
   49:  * at timeout time).
   50:  */
   51: 
   52: /*
   53:  * Each ``pup-level-1'' input queue has a bit in a ``netisr'' status
   54:  * word which is used to de-multiplex a single software
   55:  * interrupt used for scheduling the network code to calls
   56:  * on the lowest level routine of each protocol.
   57:  */
   58: #define NETISR_RESERVED0 0		/* cannot be used */
   59: #define	NETISR_POLL	1		/* polling callback */
   60: #define	NETISR_IP	2		/* same as AF_INET */
   61: #define	NETISR_NS	6		/* same as AF_NS */
   62: #define	NETISR_AARP	15		/* Appletalk ARP */
   63: #define	NETISR_ATALK2	16		/* Appletalk phase 2 */
   64: #define	NETISR_ATALK1	17		/* Appletalk phase 1 */
   65: #define	NETISR_ARP	18		/* same as AF_LINK */
   66: #define	NETISR_IPX	23		/* same as AF_IPX */
   67: #define	NETISR_USB	25		/* USB soft interrupt */
   68: #define	NETISR_PPP	27		/* PPP soft interrupt */
   69: #define	NETISR_IPV6	28		/* same as AF_INET6 */
   70: #define	NETISR_NATM	29		/* same as AF_NATM */
   71: #define	NETISR_NETGRAPH	30		/* same as AF_NETGRAPH */
   72: #define	NETISR_POLLMORE	31		/* check if we need more polling */
   73: 
   74: #define	NETISR_MAX	32
   75: 
   76: #ifdef _KERNEL
   77: 
   78: #include <sys/protosw.h>
   79: 
   80: struct netmsg;
   81: 
   82: typedef int (*netisr_fn_t)(struct netmsg *);
   83: 
   84: /*
   85:  * Base class.  All net messages must start with the same fields.
   86:  */
   87: struct netmsg {
   88:     struct lwkt_msg	nm_lmsg;
   89:     netisr_fn_t		nm_handler;
   90: };
   91: 
   92: struct netmsg_packet {
   93:     struct lwkt_msg	nm_lmsg;
   94:     netisr_fn_t		nm_handler;
   95:     struct mbuf		*nm_packet;
   96: };
   97: 
   98: struct netmsg_pr_ctloutput {
   99:     struct lwkt_msg	nm_lmsg;
  100:     netisr_fn_t		nm_handler;
  101:     int			(*nm_prfn) (struct socket *, struct sockopt *);
  102:     struct socket	*nm_so;
  103:     struct sockopt	*nm_sopt;
  104: };
  105: 
  106: struct netmsg_pr_timeout {
  107:     struct lwkt_msg	nm_lmsg;
  108:     netisr_fn_t		nm_handler;
  109:     void		(*nm_prfn) (void);
  110: };
  111: 
  112: /*
  113:  * for dispatching pr_ functions,
  114:  * until they can be converted to message-passing
  115:  */
  116: int netmsg_pr_dispatcher(struct netmsg *);
  117: 
  118: #define CMD_NETMSG_NEWPKT		(MSG_CMD_NETMSG | 0x0001)
  119: #define CMD_NETMSG_POLL			(MSG_CMD_NETMSG | 0x0002)
  120: 
  121: #define CMD_NETMSG_PRU_ABORT		(MSG_CMD_NETMSG | 0x0003)
  122: #define CMD_NETMSG_PRU_ACCEPT		(MSG_CMD_NETMSG | 0x0004)
  123: #define CMD_NETMSG_PRU_ATTACH		(MSG_CMD_NETMSG | 0x0005)
  124: #define CMD_NETMSG_PRU_BIND		(MSG_CMD_NETMSG | 0x0006)
  125: #define CMD_NETMSG_PRU_CONNECT		(MSG_CMD_NETMSG | 0x0007)
  126: #define CMD_NETMSG_PRU_CONNECT2		(MSG_CMD_NETMSG | 0x0008)
  127: #define CMD_NETMSG_PRU_CONTROL		(MSG_CMD_NETMSG | 0x0009)
  128: #define CMD_NETMSG_PRU_DETACH		(MSG_CMD_NETMSG | 0x000a)
  129: #define CMD_NETMSG_PRU_DISCONNECT	(MSG_CMD_NETMSG | 0x000b)
  130: #define CMD_NETMSG_PRU_LISTEN		(MSG_CMD_NETMSG | 0x000c)
  131: #define CMD_NETMSG_PRU_PEERADDR		(MSG_CMD_NETMSG | 0x000d)
  132: #define CMD_NETMSG_PRU_RCVD		(MSG_CMD_NETMSG | 0x000e)
  133: #define CMD_NETMSG_PRU_RCVOOB		(MSG_CMD_NETMSG | 0x000f)
  134: #define CMD_NETMSG_PRU_SEND		(MSG_CMD_NETMSG | 0x0010)
  135: #define CMD_NETMSG_PRU_SENSE		(MSG_CMD_NETMSG | 0x0011)
  136: #define CMD_NETMSG_PRU_SHUTDOWN		(MSG_CMD_NETMSG | 0x0012)
  137: #define CMD_NETMSG_PRU_SOCKADDR		(MSG_CMD_NETMSG | 0x0013)
  138: #define CMD_NETMSG_PRU_SOSEND		(MSG_CMD_NETMSG | 0x0014)
  139: #define CMD_NETMSG_PRU_SORECEIVE	(MSG_CMD_NETMSG | 0x0015)
  140: #define CMD_NETMSG_PRU_SOPOLL		(MSG_CMD_NETMSG | 0x0016)
  141: 
  142: #define CMD_NETMSG_PR_CTLOUTPUT		(MSG_CMD_NETMSG | 0x0017)
  143: #define CMD_NETMSG_PR_TIMEOUT		(MSG_CMD_NETMSG | 0x0018)
  144: 
  145: typedef lwkt_port_t (*lwkt_portfn_t)(struct mbuf *);
  146: 
  147: struct netisr {
  148: 	lwkt_port	ni_port;		/* must be first */
  149: 	lwkt_portfn_t	ni_mport;
  150: 	netisr_fn_t	ni_handler;
  151: };
  152: 
  153: extern lwkt_port netisr_afree_rport;
  154: 
  155: lwkt_port_t	cpu0_portfn(struct mbuf *m);
  156: void		netisr_dispatch(int, struct mbuf *);
  157: int		netisr_queue(int, struct mbuf *);
  158: void		netisr_register(int, lwkt_portfn_t, netisr_fn_t);
  159: int		netisr_unregister(int);
  160: void		netmsg_service_loop(void *arg);
  161: void		schednetisr(int);
  162: 
  163: #endif	/* KERNEL */
  164: 
  165: #endif	/* _NET_NETISR_H_ */