svn commit: r256909 - user/andre/mbuf_staging/net

Andre Oppermann andre at FreeBSD.org
Tue Oct 22 15:06:25 UTC 2013


Author: andre
Date: Tue Oct 22 15:06:24 2013
New Revision: 256909
URL: http://svnweb.freebsd.org/changeset/base/256909

Log:
  Make struct ifnet comprehensible by grouping related fields
  and variables together.
  
  Quantify the structure size and how bloated it has become.
  
  This is only a mechanical change.
  
  Obvious first candidates for slimming by externalizing are:
   - char if_xname[IFNAMSIZ]
   - struct ifaltq if_snd
   - struct if_data if_data
   - void *if_afdata[AF_MAX]
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  user/andre/mbuf_staging/net/if_var.h

Modified: user/andre/mbuf_staging/net/if_var.h
==============================================================================
--- user/andre/mbuf_staging/net/if_var.h	Tue Oct 22 14:55:04 2013	(r256908)
+++ user/andre/mbuf_staging/net/if_var.h	Tue Oct 22 15:06:24 2013	(r256909)
@@ -120,18 +120,41 @@ struct	ifqueue {
 /*
  * Structure defining a network interface.
  *
- * (Would like to call this struct ``if'', but C isn't PL/1.)
+ * Size ILP32:  592 (approx)
+ *	 LP64: 1048 (approx)
  */
-
 struct ifnet {
+	/* General book keeping of interface lists. */
+	TAILQ_ENTRY(ifnet) if_link; 	/* all struct ifnets are chained */
+	LIST_ENTRY(ifnet) if_clones;	/* interfaces of a cloner */
+	TAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if */
+					/* protected by if_addr_lock */
+	u_char	if_alloctype;		/* if_type at time of allocation */
+
+	/* Driver and protocol specific information that remains stable. */
 	void	*if_softc;		/* pointer to driver state */
+	void	*if_llsoftc;		/* link layer softc */
 	void	*if_l2com;		/* pointer to protocol bits */
-	struct vnet *if_vnet;		/* pointer to network stack instance */
-	TAILQ_ENTRY(ifnet) if_link; 	/* all struct ifnets are chained */
-	char	if_xname[IFNAMSIZ];	/* external name (name + unit) */
 	const char *if_dname;		/* driver name */
 	int	if_dunit;		/* unit or IF_DUNIT_NONE */
+	u_short	if_index;		/* numeric abbreviation for this if  */
+	short	if_index_reserved;	/* spare space to grow if_index */
+	char	if_xname[IFNAMSIZ];	/* external name (name + unit) */
+	char	*if_description;	/* interface description */
+
+	/* Variable fields that are touched by the drivers. */
+	int	if_flags;		/* up/down, broadcast, etc. */
+	int	if_capabilities;	/* interface features & capabilities */
+	int	if_capenable;		/* enabled features & capabilities */
+	void	*if_linkmib;		/* link-type-specific MIB data */
+	size_t	if_linkmiblen;		/* length of above data */
+	int	if_drv_flags;		/* driver-managed status flags */
 	u_int	if_refcount;		/* reference count */
+	struct  ifaltq if_snd;		/* output queue (includes altq) */
+	struct	if_data if_data;
+	struct	task if_linktask;	/* task for link change events */
+
+	/* Addresses of different protocol families assigned to this if. */
 	struct	ifaddrhead if_addrhead;	/* linked list of addresses per if */
 		/*
 		 * if_addrhead is the list of all addresses associated to
@@ -143,21 +166,29 @@ struct ifnet {
 		 * However, access to the AF_LINK address through this
 		 * field is deprecated. Use if_addr or ifaddr_byindex() instead.
 		 */
+	struct	ifmultihead if_multiaddrs; /* multicast addresses configured */
+	int	if_amcount;		/* number of all-multicast requests */
+	struct	ifaddr	*if_addr;	/* pointer to link-level address */
+	const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */
+	struct	rwlock if_addr_lock;	/* lock to protect address lists */
+	void	*if_afdata[AF_MAX];
+	int	if_afdata_initialized;
+	struct	rwlock if_afdata_lock;
+
+	/* Additional interface features. */
+	struct	bpf_if *if_bpf;		/* packet filter structure */
 	int	if_pcount;		/* number of promiscuous listeners */
+	void	*if_bridge;		/* bridge glue */
+	void	*if_lagg;		/* lagg glue */
+	void	*if_pf_kif;		/* pf glue */
 	struct	carp_if *if_carp;	/* carp interface structure */
-	struct	bpf_if *if_bpf;		/* packet filter structure */
-	u_short	if_index;		/* numeric abbreviation for this if  */
-	short	if_index_reserved;	/* spare space to grow if_index */
 	struct  ifvlantrunk *if_vlantrunk; /* pointer to 802.1q data */
-	int	if_flags;		/* up/down, broadcast, etc. */
-	int	if_capabilities;	/* interface features & capabilities */
-	int	if_capenable;		/* enabled features & capabilities */
-	void	*if_linkmib;		/* link-type-specific MIB data */
-	size_t	if_linkmiblen;		/* length of above data */
-	struct	if_data if_data;
-	struct	ifmultihead if_multiaddrs; /* multicast addresses configured */
-	int	if_amcount;		/* number of all-multicast requests */
-/* procedure handles */
+	struct	vnet *if_vnet;		/* pointer to network stack instance */
+	struct	vnet *if_home_vnet;	/* where this ifnet originates from */
+	u_int	if_fib;			/* interface FIB */
+	struct	label *if_label;	/* interface MAC label */
+
+	/* Various procedures of the layer2 encapsulation and drivers. */
 	int	(*if_output)		/* output routine (enqueue) */
 		(struct ifnet *, struct mbuf *, const struct sockaddr *,
 		     struct route *);
@@ -177,39 +208,12 @@ struct ifnet {
 		(struct ifnet *, struct mbuf *);
 	void	(*if_reassign)		/* reassign to vnet routine */
 		(struct ifnet *, struct vnet *, char *);
-	struct	vnet *if_home_vnet;	/* where this ifnet originates from */
-	struct	ifaddr	*if_addr;	/* pointer to link-level address */
-	void	*if_llsoftc;		/* link layer softc */
-	int	if_drv_flags;		/* driver-managed status flags */
-	struct  ifaltq if_snd;		/* output queue (includes altq) */
-	const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */
-
-	void	*if_bridge;		/* bridge glue */
-
-	struct	label *if_label;	/* interface MAC label */
-
-	/* these are only used by IPv6 */
-	void	*if_unused[2];
-	void	*if_afdata[AF_MAX];
-	int	if_afdata_initialized;
-	struct	rwlock if_afdata_lock;
-	struct	task if_linktask;	/* task for link change events */
-	struct	rwlock if_addr_lock;	/* lock to protect address lists */
-
-	LIST_ENTRY(ifnet) if_clones;	/* interfaces of a cloner */
-	TAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if */
-					/* protected by if_addr_lock */
-	void	*if_pf_kif;
-	void	*if_lagg;		/* lagg glue */
-	char	*if_description;	/* interface description */
-	u_int	if_fib;			/* interface FIB */
-	u_char	if_alloctype;		/* if_type at time of allocation */
 
+	/* Stuff that's only temporary and doesn't belong here. */
 	u_int	if_hw_tsomax;		/* tso burst length limit, the minimum
 					 * is (IP_MAXPACKET / 8).
 					 * XXXAO: Have to find a better place
 					 * for it eventually. */
-
 	/*
 	 * Spare fields are added so that we can modify sensitive data
 	 * structures without changing the kernel binary interface, and must
@@ -217,6 +221,7 @@ struct ifnet {
 	 */
 	char	if_cspare[3];
 	int	if_ispare[4];
+	void	*if_unused[2];
 	void	*if_pspare[8];		/* 1 netmap, 7 TDB */
 };
 


More information about the svn-src-user mailing list