Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef	_MAC_FLOW_H
     28 #define	_MAC_FLOW_H
     29 
     30 /*
     31  * Main structure describing a flow of packets, for classification use
     32  */
     33 
     34 #ifdef	__cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 #include <sys/types.h>
     39 #include <netinet/in.h>		/* for IPPROTO_* constants */
     40 #include <sys/ethernet.h>
     41 
     42 /*
     43  * MAXFLOWNAMELEN defines the longest possible permitted flow name,
     44  * including the terminating NUL.
     45  */
     46 #define	MAXFLOWNAMELEN		128
     47 
     48 /* need to use MAXMACADDRLEN from dld.h instead of this one */
     49 #define	MAXMACADDR		20
     50 
     51 /* Bit-mask for the selectors carried in the flow descriptor */
     52 typedef	uint64_t		flow_mask_t;
     53 
     54 #define	FLOW_LINK_DST		0x00000001	/* Destination MAC addr */
     55 #define	FLOW_LINK_SRC		0x00000002	/* Source MAC address */
     56 #define	FLOW_LINK_VID		0x00000004	/* VLAN ID */
     57 #define	FLOW_LINK_SAP		0x00000008	/* SAP value */
     58 
     59 #define	FLOW_IP_VERSION		0x00000010	/* V4 or V6 */
     60 #define	FLOW_IP_PROTOCOL	0x00000020	/* Protocol type */
     61 #define	FLOW_IP_LOCAL		0x00000040	/* Local address */
     62 #define	FLOW_IP_REMOTE		0x00000080	/* Remote address */
     63 #define	FLOW_IP_DSFIELD		0x00000100	/* DSfield value */
     64 
     65 #define	FLOW_ULP_PORT_LOCAL	0x00001000	/* ULP local port */
     66 #define	FLOW_ULP_PORT_REMOTE	0x00002000	/* ULP remote port */
     67 
     68 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
     69 #pragma pack(4)
     70 #endif
     71 
     72 typedef struct flow_desc_s {
     73 	flow_mask_t			fd_mask;
     74 	uint32_t			fd_mac_len;
     75 	uint8_t				fd_dst_mac[MAXMACADDR];
     76 	uint8_t				fd_src_mac[MAXMACADDR];
     77 	uint16_t			fd_vid;
     78 	uint32_t			fd_sap;
     79 	uint8_t				fd_ipversion;
     80 	uint8_t				fd_protocol;
     81 	in6_addr_t			fd_local_addr;
     82 	in6_addr_t			fd_local_netmask;
     83 	in6_addr_t			fd_remote_addr;
     84 	in6_addr_t			fd_remote_netmask;
     85 	in_port_t			fd_local_port;
     86 	in_port_t			fd_remote_port;
     87 	uint8_t				fd_dsfield;
     88 	uint8_t				fd_dsfield_mask;
     89 } flow_desc_t;
     90 
     91 #define	MRP_NCPUS	128
     92 
     93 /*
     94  * In MCM_CPUS mode, cpu bindings is user specified. In MCM_FANOUT mode,
     95  * user only specifies a fanout count.
     96  * mc_fanout_cnt gives the number of CPUs used for fanout soft rings.
     97  * mc_fanout_cpus[] array stores the CPUs used for fanout soft rings.
     98  */
     99 typedef enum {
    100 	MCM_FANOUT = 1,
    101 	MCM_CPUS
    102 } mac_cpu_mode_t;
    103 
    104 typedef struct mac_cpus_props_s {
    105 	uint32_t		mc_ncpus;		/* num of cpus */
    106 	uint32_t		mc_cpus[MRP_NCPUS]; 	/* cpu list */
    107 	uint32_t		mc_fanout_cnt;		/* soft ring cpu cnt */
    108 	uint32_t		mc_fanout_cpus[MRP_NCPUS]; /* SR cpu list */
    109 	uint32_t		mc_pollid;		/* poll thr binding */
    110 	uint32_t		mc_workerid;		/* worker thr binding */
    111 	/*
    112 	 * interrupt cpu: mrp_intr_cpu less than 0 implies platform limitation
    113 	 * in retargetting the interrupt assignment.
    114 	 */
    115 	int32_t			mc_intr_cpu;
    116 	mac_cpu_mode_t		mc_fanout_mode;		/* fanout mode */
    117 } mac_cpus_t;
    118 
    119 /* Priority values */
    120 typedef enum {
    121 	MPL_LOW,
    122 	MPL_MEDIUM,
    123 	MPL_HIGH,
    124 	MPL_RESET
    125 } mac_priority_level_t;
    126 
    127 /* Protection types */
    128 #define	MPT_MACNOSPOOF		0x00000001
    129 #define	MPT_IPNOSPOOF		0x00000002
    130 #define	MPT_RESTRICTED		0x00000004
    131 #define	MPT_ALL			(MPT_MACNOSPOOF|MPT_IPNOSPOOF|MPT_RESTRICTED)
    132 #define	MPT_RESET		0xffffffff
    133 #define	MPT_MAXIPADDR		32
    134 
    135 typedef struct mac_protect_s {
    136 	uint32_t	mp_types;
    137 	uint32_t	mp_ipaddrcnt;
    138 	ipaddr_t	mp_ipaddrs[MPT_MAXIPADDR];
    139 } mac_protect_t;
    140 
    141 
    142 /* The default priority for links */
    143 #define	MPL_LINK_DEFAULT		MPL_HIGH
    144 
    145 /* The default priority for flows */
    146 #define	MPL_SUBFLOW_DEFAULT		MPL_MEDIUM
    147 
    148 #define	MRP_MAXBW		0x00000001 	/* Limit set */
    149 #define	MRP_CPUS		0x00000002 	/* CPU/fanout set */
    150 #define	MRP_CPUS_USERSPEC	0x00000004 	/* CPU/fanout from user */
    151 #define	MRP_PRIORITY		0x00000008 	/* Priority set */
    152 #define	MRP_PROTECT		0x00000010	/* Protection set */
    153 
    154 #define	MRP_THROTTLE		MRP_MAXBW
    155 
    156 /* 3 levels - low, medium, high */
    157 #define	MRP_PRIORITY_LEVELS		3
    158 
    159 /* Special value denoting no bandwidth control */
    160 #define	MRP_MAXBW_RESETVAL		-1ULL
    161 
    162 /*
    163  * Until sub-megabit limit is implemented,
    164  * reject values lower than 1 MTU per tick or 1.2Mbps
    165  */
    166 #define	MRP_MAXBW_MINVAL		1200000
    167 
    168 typedef	struct mac_resource_props_s {
    169 	/*
    170 	 * Bit-mask for the network resource control types types
    171 	 */
    172 	uint32_t		mrp_mask;
    173 	uint64_t		mrp_maxbw;	/* bandwidth limit in bps */
    174 	mac_priority_level_t	mrp_priority;	/* relative flow priority */
    175 	mac_cpus_t		mrp_cpus;
    176 	mac_protect_t		mrp_protect;
    177 } mac_resource_props_t;
    178 
    179 #define	mrp_ncpus	mrp_cpus.mc_ncpus
    180 #define	mrp_cpu		mrp_cpus.mc_cpus
    181 #define	mrp_fanout_cnt	mrp_cpus.mc_fanout_cnt
    182 #define	mrp_fanout_cpu	mrp_cpus.mc_fanout_cpus
    183 #define	mrp_pollid	mrp_cpus.mc_pollid
    184 #define	mrp_workerid	mrp_cpus.mc_workerid
    185 #define	mrp_intr_cpu	mrp_cpus.mc_intr_cpu
    186 #define	mrp_fanout_mode	mrp_cpus.mc_fanout_mode
    187 
    188 #define	MAC_COPY_CPUS(mrp, fmrp) {					\
    189 	int	ncpus;							\
    190 	(fmrp)->mrp_ncpus = (mrp)->mrp_ncpus;				\
    191 	(fmrp)->mrp_intr_cpu = (mrp)->mrp_intr_cpu;			\
    192 	(fmrp)->mrp_fanout_mode = (mrp)->mrp_fanout_mode;		\
    193 	if ((mrp)->mrp_ncpus == 0) {					\
    194 		(fmrp)->mrp_mask &= ~MRP_CPUS;				\
    195 		(fmrp)->mrp_mask &= ~MRP_CPUS_USERSPEC;			\
    196 	} else {							\
    197 		for (ncpus = 0; ncpus < (fmrp)->mrp_ncpus; ncpus++)	\
    198 			(fmrp)->mrp_cpu[ncpus] = (mrp)->mrp_cpu[ncpus];\
    199 		(fmrp)->mrp_mask |= MRP_CPUS;				\
    200 		if ((mrp)->mrp_mask & MRP_CPUS_USERSPEC)		\
    201 			(fmrp)->mrp_mask |= MRP_CPUS_USERSPEC;		\
    202 	}								\
    203 }
    204 
    205 typedef struct flow_stats_s {
    206 	uint64_t	fs_rbytes;
    207 	uint64_t	fs_ipackets;
    208 	uint64_t	fs_ierrors;
    209 	uint64_t	fs_obytes;
    210 	uint64_t	fs_opackets;
    211 	uint64_t	fs_oerrors;
    212 } flow_stats_t;
    213 
    214 typedef enum {
    215 	FLOW_STAT_RBYTES,
    216 	FLOW_STAT_IPACKETS,
    217 	FLOW_STAT_IERRORS,
    218 	FLOW_STAT_OBYTES,
    219 	FLOW_STAT_OPACKETS,
    220 	FLOW_STAT_OERRORS
    221 } flow_stat_t;
    222 
    223 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
    224 #pragma pack()
    225 #endif
    226 
    227 #ifdef	__cplusplus
    228 }
    229 #endif
    230 
    231 #endif	/* _MAC_FLOW_H */
    232