xref: /freebsd/sys/net/if_private.h (revision 2c2b37ad251d25fb81d6254e29130684fed774ab)
1*2c2b37adSJustin Hibbits /*-
2*2c2b37adSJustin Hibbits  * SPDX-License-Identifier: BSD-3-Clause
3*2c2b37adSJustin Hibbits  *
4*2c2b37adSJustin Hibbits  * Copyright (c) 1982, 1986, 1989, 1993
5*2c2b37adSJustin Hibbits  *	The Regents of the University of California.  All rights reserved.
6*2c2b37adSJustin Hibbits  *
7*2c2b37adSJustin Hibbits  * Redistribution and use in source and binary forms, with or without
8*2c2b37adSJustin Hibbits  * modification, are permitted provided that the following conditions
9*2c2b37adSJustin Hibbits  * are met:
10*2c2b37adSJustin Hibbits  * 1. Redistributions of source code must retain the above copyright
11*2c2b37adSJustin Hibbits  *    notice, this list of conditions and the following disclaimer.
12*2c2b37adSJustin Hibbits  * 2. Redistributions in binary form must reproduce the above copyright
13*2c2b37adSJustin Hibbits  *    notice, this list of conditions and the following disclaimer in the
14*2c2b37adSJustin Hibbits  *    documentation and/or other materials provided with the distribution.
15*2c2b37adSJustin Hibbits  * 3. Neither the name of the University nor the names of its contributors
16*2c2b37adSJustin Hibbits  *    may be used to endorse or promote products derived from this software
17*2c2b37adSJustin Hibbits  *    without specific prior written permission.
18*2c2b37adSJustin Hibbits  *
19*2c2b37adSJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*2c2b37adSJustin Hibbits  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*2c2b37adSJustin Hibbits  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*2c2b37adSJustin Hibbits  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*2c2b37adSJustin Hibbits  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*2c2b37adSJustin Hibbits  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*2c2b37adSJustin Hibbits  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*2c2b37adSJustin Hibbits  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*2c2b37adSJustin Hibbits  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*2c2b37adSJustin Hibbits  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*2c2b37adSJustin Hibbits  * SUCH DAMAGE.
30*2c2b37adSJustin Hibbits  *
31*2c2b37adSJustin Hibbits  *	From: @(#)if.h	8.1 (Berkeley) 6/10/93
32*2c2b37adSJustin Hibbits  */
33*2c2b37adSJustin Hibbits 
34*2c2b37adSJustin Hibbits #ifndef	_NET_IF_PRIVATE_H_
35*2c2b37adSJustin Hibbits #define	_NET_IF_PRIVATE_H_
36*2c2b37adSJustin Hibbits 
37*2c2b37adSJustin Hibbits #ifdef	_KERNEL
38*2c2b37adSJustin Hibbits /*
39*2c2b37adSJustin Hibbits  * Structure defining a network interface.
40*2c2b37adSJustin Hibbits  */
41*2c2b37adSJustin Hibbits struct ifnet {
42*2c2b37adSJustin Hibbits 	/* General book keeping of interface lists. */
43*2c2b37adSJustin Hibbits 	CK_STAILQ_ENTRY(ifnet) if_link; 	/* all struct ifnets are chained (CK_) */
44*2c2b37adSJustin Hibbits 	LIST_ENTRY(ifnet) if_clones;	/* interfaces of a cloner */
45*2c2b37adSJustin Hibbits 	CK_STAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if (CK_) */
46*2c2b37adSJustin Hibbits 					/* protected by if_addr_lock */
47*2c2b37adSJustin Hibbits 	u_char	if_alloctype;		/* if_type at time of allocation */
48*2c2b37adSJustin Hibbits 	uint8_t	if_numa_domain;		/* NUMA domain of device */
49*2c2b37adSJustin Hibbits 	/* Driver and protocol specific information that remains stable. */
50*2c2b37adSJustin Hibbits 	void	*if_softc;		/* pointer to driver state */
51*2c2b37adSJustin Hibbits 	void	*if_llsoftc;		/* link layer softc */
52*2c2b37adSJustin Hibbits 	void	*if_l2com;		/* pointer to protocol bits */
53*2c2b37adSJustin Hibbits 	const char *if_dname;		/* driver name */
54*2c2b37adSJustin Hibbits 	int	if_dunit;		/* unit or IF_DUNIT_NONE */
55*2c2b37adSJustin Hibbits 	u_short	if_index;		/* numeric abbreviation for this if  */
56*2c2b37adSJustin Hibbits 	u_short	if_idxgen;		/* ... and its generation count */
57*2c2b37adSJustin Hibbits 	char	if_xname[IFNAMSIZ];	/* external name (name + unit) */
58*2c2b37adSJustin Hibbits 	char	*if_description;	/* interface description */
59*2c2b37adSJustin Hibbits 
60*2c2b37adSJustin Hibbits 	/* Variable fields that are touched by the stack and drivers. */
61*2c2b37adSJustin Hibbits 	int	if_flags;		/* up/down, broadcast, etc. */
62*2c2b37adSJustin Hibbits 	int	if_drv_flags;		/* driver-managed status flags */
63*2c2b37adSJustin Hibbits 	int	if_capabilities;	/* interface features & capabilities */
64*2c2b37adSJustin Hibbits 	int	if_capabilities2;	/* part 2 */
65*2c2b37adSJustin Hibbits 	int	if_capenable;		/* enabled features & capabilities */
66*2c2b37adSJustin Hibbits 	int	if_capenable2;		/* part 2 */
67*2c2b37adSJustin Hibbits 	void	*if_linkmib;		/* link-type-specific MIB data */
68*2c2b37adSJustin Hibbits 	size_t	if_linkmiblen;		/* length of above data */
69*2c2b37adSJustin Hibbits 	u_int	if_refcount;		/* reference count */
70*2c2b37adSJustin Hibbits 
71*2c2b37adSJustin Hibbits 	/* These fields are shared with struct if_data. */
72*2c2b37adSJustin Hibbits 	uint8_t		if_type;	/* ethernet, tokenring, etc */
73*2c2b37adSJustin Hibbits 	uint8_t		if_addrlen;	/* media address length */
74*2c2b37adSJustin Hibbits 	uint8_t		if_hdrlen;	/* media header length */
75*2c2b37adSJustin Hibbits 	uint8_t		if_link_state;	/* current link state */
76*2c2b37adSJustin Hibbits 	uint32_t	if_mtu;		/* maximum transmission unit */
77*2c2b37adSJustin Hibbits 	uint32_t	if_metric;	/* routing metric (external only) */
78*2c2b37adSJustin Hibbits 	uint64_t	if_baudrate;	/* linespeed */
79*2c2b37adSJustin Hibbits 	uint64_t	if_hwassist;	/* HW offload capabilities, see IFCAP */
80*2c2b37adSJustin Hibbits 	time_t		if_epoch;	/* uptime at attach or stat reset */
81*2c2b37adSJustin Hibbits 	struct timeval	if_lastchange;	/* time of last administrative change */
82*2c2b37adSJustin Hibbits 
83*2c2b37adSJustin Hibbits 	struct  ifaltq if_snd;		/* output queue (includes altq) */
84*2c2b37adSJustin Hibbits 	struct	task if_linktask;	/* task for link change events */
85*2c2b37adSJustin Hibbits 	struct	task if_addmultitask;	/* task for SIOCADDMULTI */
86*2c2b37adSJustin Hibbits 
87*2c2b37adSJustin Hibbits 	/* Addresses of different protocol families assigned to this if. */
88*2c2b37adSJustin Hibbits 	struct mtx if_addr_lock;	/* lock to protect address lists */
89*2c2b37adSJustin Hibbits 		/*
90*2c2b37adSJustin Hibbits 		 * if_addrhead is the list of all addresses associated to
91*2c2b37adSJustin Hibbits 		 * an interface.
92*2c2b37adSJustin Hibbits 		 * Some code in the kernel assumes that first element
93*2c2b37adSJustin Hibbits 		 * of the list has type AF_LINK, and contains sockaddr_dl
94*2c2b37adSJustin Hibbits 		 * addresses which store the link-level address and the name
95*2c2b37adSJustin Hibbits 		 * of the interface.
96*2c2b37adSJustin Hibbits 		 * However, access to the AF_LINK address through this
97*2c2b37adSJustin Hibbits 		 * field is deprecated. Use if_addr instead.
98*2c2b37adSJustin Hibbits 		 */
99*2c2b37adSJustin Hibbits 	struct	ifaddrhead if_addrhead;	/* linked list of addresses per if */
100*2c2b37adSJustin Hibbits 	struct	ifmultihead if_multiaddrs; /* multicast addresses configured */
101*2c2b37adSJustin Hibbits 	int	if_amcount;		/* number of all-multicast requests */
102*2c2b37adSJustin Hibbits 	struct	ifaddr	*if_addr;	/* pointer to link-level address */
103*2c2b37adSJustin Hibbits 	void	*if_hw_addr;		/* hardware link-level address */
104*2c2b37adSJustin Hibbits 	const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */
105*2c2b37adSJustin Hibbits 	struct	mtx if_afdata_lock;
106*2c2b37adSJustin Hibbits 	void	*if_afdata[AF_MAX];
107*2c2b37adSJustin Hibbits 	int	if_afdata_initialized;
108*2c2b37adSJustin Hibbits 
109*2c2b37adSJustin Hibbits 	/* Additional features hung off the interface. */
110*2c2b37adSJustin Hibbits 	u_int	if_fib;			/* interface FIB */
111*2c2b37adSJustin Hibbits 	struct	vnet *if_vnet;		/* pointer to network stack instance */
112*2c2b37adSJustin Hibbits 	struct	vnet *if_home_vnet;	/* where this ifnet originates from */
113*2c2b37adSJustin Hibbits 	struct  ifvlantrunk *if_vlantrunk; /* pointer to 802.1q data */
114*2c2b37adSJustin Hibbits 	struct	bpf_if *if_bpf;		/* packet filter structure */
115*2c2b37adSJustin Hibbits 	int	if_pcount;		/* number of promiscuous listeners */
116*2c2b37adSJustin Hibbits 	void	*if_bridge;		/* bridge glue */
117*2c2b37adSJustin Hibbits 	void	*if_lagg;		/* lagg glue */
118*2c2b37adSJustin Hibbits 	void	*if_pf_kif;		/* pf glue */
119*2c2b37adSJustin Hibbits 	struct	carp_if *if_carp;	/* carp interface structure */
120*2c2b37adSJustin Hibbits 	struct	label *if_label;	/* interface MAC label */
121*2c2b37adSJustin Hibbits 	struct	netmap_adapter *if_netmap; /* netmap(4) softc */
122*2c2b37adSJustin Hibbits 
123*2c2b37adSJustin Hibbits 	/* Various procedures of the layer2 encapsulation and drivers. */
124*2c2b37adSJustin Hibbits 	if_output_fn_t if_output;	/* output routine (enqueue) */
125*2c2b37adSJustin Hibbits 	if_input_fn_t if_input;		/* input routine (from h/w driver) */
126*2c2b37adSJustin Hibbits 	struct mbuf *(*if_bridge_input)(struct ifnet *, struct mbuf *);
127*2c2b37adSJustin Hibbits 	int	(*if_bridge_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
128*2c2b37adSJustin Hibbits 		    struct rtentry *);
129*2c2b37adSJustin Hibbits 	void (*if_bridge_linkstate)(struct ifnet *ifp);
130*2c2b37adSJustin Hibbits 	if_start_fn_t	if_start;	/* initiate output routine */
131*2c2b37adSJustin Hibbits 	if_ioctl_fn_t	if_ioctl;	/* ioctl routine */
132*2c2b37adSJustin Hibbits 	if_init_fn_t	if_init;	/* Init routine */
133*2c2b37adSJustin Hibbits 	int	(*if_resolvemulti)	/* validate/resolve multicast */
134*2c2b37adSJustin Hibbits 		(struct ifnet *, struct sockaddr **, struct sockaddr *);
135*2c2b37adSJustin Hibbits 	if_qflush_fn_t	if_qflush;	/* flush any queue */
136*2c2b37adSJustin Hibbits 	if_transmit_fn_t if_transmit;   /* initiate output routine */
137*2c2b37adSJustin Hibbits 
138*2c2b37adSJustin Hibbits 	void	(*if_reassign)		/* reassign to vnet routine */
139*2c2b37adSJustin Hibbits 		(struct ifnet *, struct vnet *, char *);
140*2c2b37adSJustin Hibbits 	if_get_counter_t if_get_counter; /* get counter values */
141*2c2b37adSJustin Hibbits 	int	(*if_requestencap)	/* make link header from request */
142*2c2b37adSJustin Hibbits 		(struct ifnet *, struct if_encap_req *);
143*2c2b37adSJustin Hibbits 
144*2c2b37adSJustin Hibbits 	/* Statistics. */
145*2c2b37adSJustin Hibbits 	counter_u64_t	if_counters[IFCOUNTERS];
146*2c2b37adSJustin Hibbits 
147*2c2b37adSJustin Hibbits 	/* Stuff that's only temporary and doesn't belong here. */
148*2c2b37adSJustin Hibbits 
149*2c2b37adSJustin Hibbits 	/*
150*2c2b37adSJustin Hibbits 	 * Network adapter TSO limits:
151*2c2b37adSJustin Hibbits 	 * ===========================
152*2c2b37adSJustin Hibbits 	 *
153*2c2b37adSJustin Hibbits 	 * If the "if_hw_tsomax" field is zero the maximum segment
154*2c2b37adSJustin Hibbits 	 * length limit does not apply. If the "if_hw_tsomaxsegcount"
155*2c2b37adSJustin Hibbits 	 * or the "if_hw_tsomaxsegsize" field is zero the TSO segment
156*2c2b37adSJustin Hibbits 	 * count limit does not apply. If all three fields are zero,
157*2c2b37adSJustin Hibbits 	 * there is no TSO limit.
158*2c2b37adSJustin Hibbits 	 *
159*2c2b37adSJustin Hibbits 	 * NOTE: The TSO limits should reflect the values used in the
160*2c2b37adSJustin Hibbits 	 * BUSDMA tag a network adapter is using to load a mbuf chain
161*2c2b37adSJustin Hibbits 	 * for transmission. The TCP/IP network stack will subtract
162*2c2b37adSJustin Hibbits 	 * space for all linklevel and protocol level headers and
163*2c2b37adSJustin Hibbits 	 * ensure that the full mbuf chain passed to the network
164*2c2b37adSJustin Hibbits 	 * adapter fits within the given limits.
165*2c2b37adSJustin Hibbits 	 */
166*2c2b37adSJustin Hibbits 	u_int	if_hw_tsomax;		/* TSO maximum size in bytes */
167*2c2b37adSJustin Hibbits 	u_int	if_hw_tsomaxsegcount;	/* TSO maximum segment count */
168*2c2b37adSJustin Hibbits 	u_int	if_hw_tsomaxsegsize;	/* TSO maximum segment size in bytes */
169*2c2b37adSJustin Hibbits 
170*2c2b37adSJustin Hibbits 	/*
171*2c2b37adSJustin Hibbits 	 * Network adapter send tag support:
172*2c2b37adSJustin Hibbits 	 */
173*2c2b37adSJustin Hibbits 	if_snd_tag_alloc_t *if_snd_tag_alloc;
174*2c2b37adSJustin Hibbits 
175*2c2b37adSJustin Hibbits 	/* Ratelimit (packet pacing) */
176*2c2b37adSJustin Hibbits 	if_ratelimit_query_t *if_ratelimit_query;
177*2c2b37adSJustin Hibbits 	if_ratelimit_setup_t *if_ratelimit_setup;
178*2c2b37adSJustin Hibbits 
179*2c2b37adSJustin Hibbits 	/* Ethernet PCP */
180*2c2b37adSJustin Hibbits 	uint8_t if_pcp;
181*2c2b37adSJustin Hibbits 
182*2c2b37adSJustin Hibbits 	/*
183*2c2b37adSJustin Hibbits 	 * Debugnet (Netdump) hooks to be called while in db/panic.
184*2c2b37adSJustin Hibbits 	 */
185*2c2b37adSJustin Hibbits 	struct debugnet_methods *if_debugnet_methods;
186*2c2b37adSJustin Hibbits 	struct epoch_context	if_epoch_ctx;
187*2c2b37adSJustin Hibbits 
188*2c2b37adSJustin Hibbits 	/*
189*2c2b37adSJustin Hibbits 	 * Spare fields to be added before branching a stable branch, so
190*2c2b37adSJustin Hibbits 	 * that structure can be enhanced without changing the kernel
191*2c2b37adSJustin Hibbits 	 * binary interface.
192*2c2b37adSJustin Hibbits 	 */
193*2c2b37adSJustin Hibbits 	int	if_ispare[4];		/* general use */
194*2c2b37adSJustin Hibbits };
195*2c2b37adSJustin Hibbits 
196*2c2b37adSJustin Hibbits #endif	/* _KERNEL */
197*2c2b37adSJustin Hibbits 
198*2c2b37adSJustin Hibbits #endif	/* _NET_IF_PRIVATE_H_ */
199