Signed-off-by: Alex Aizman <[EMAIL PROTECTED]>
Hacked netdevice.h to support multiple channels.
--- netdevice-orig.h 2006-03-04 10:01:38.000000000 -0800
+++ netdevice-channel.h 2006-03-09 10:17:11.419955200 -0800
@@ -246,6 +246,147 @@
extern int __init netdev_boot_setup(char *str);
+#ifdef CONFIG_NET_CHANNELS
+/*************** NETDEVICE HW CHANNELS data structures *****************/
+/**
+ * enum netdev_hwchannel_rx_flow_e - Hardware receive channel "flow" types.
+ * @HWCH_RX_FLOW_NONE: does not filter rx packets.
+ * @HWCH_RX_FLOW_MACADDR: filters based upon the rx mac address
+ * @HWCH_RX_FLOW_VLAN_ID: filters based upon the rx vlan id tag
+ * @HWCH_RX_FLOW_VLAN_QOS: fikters based upon the vlan qos field
+ * @HWCH_RX_FLOW_PORT: filters based upon the tcp or udp receive port number
+ * @HWCH_RX_FLOW_L4_HASH: filters based upon a hash of the tcp session id
+ * @HWCH_RX_FLOW_L4_SPDM: filters based upon a hash of the four-tuple of the
+ * following: source ip, source port, destination ip, destinaton port
+ *
+ * A rx is bound to a specific device. When one of thsese enums is used,
+ * traffic is filtered onto the queue of only the requested type. By default
+ * we use HWCH_RX_FLOW_NONE as we usually want all traffic from this device.
+ **/
+typedef enum netdev_hwchannel_rx_flow_e {
+ HWCH_RX_FLOW_NONE,
+ HWCH_RX_FLOW_MACADDR,
+ HWCH_RX_FLOW_VLAN_ID,
+ HWCH_RX_FLOW_VLAN_QOS,
+ HWCH_RX_FLOW_PORT,
+ HWCH_RX_FLOW_L4_HASH,
+ HWCH_RX_FLOW_L4_SPDM,
+} netdev_hwchan_rx_flow_e;
+
+/**
+ * enum enum netdev_hwchannel_priority_e - Hardware channel priorities.
+ * @HWCH_PRIORITY_NONE: no priority, process as fast as possible
+ * @HWCH_PRIORITY_LOWEST: process all other channels first
+ * @HWCH_PRIORITY_LOW: channel with low priority
+ * @HWCH_PRIORITY_MEDIUM: channel with medium priority
+ * @HWCH_PRIORITY_HIGH: channel with high priority
+ * @HWCH_PRIORITY_HIGHEST: process this channel before all others
+ *
+ * Channel priorities can be set on both tx and rx channels. A default
+ * priority of HWCH_PRIORITY_NONE means all channels are considered equal by
+ * the hardware. If a priority is set then HWCH_PRIORITY_HIGHEST is treated
+ * first and HWCH_PRIORITY_LOWEST is treated last.
+ *
+ **/
+typedef enum netdev_hwchannel_priority_e {
+ HWCH_PRIORITY_NONE,
+ HWCH_PRIORITY_LOWEST,
+ HWCH_PRIORITY_LOW,
+ HWCH_PRIORITY_MEDIUM,
+ HWCH_PRIORITY_HIGH,
+ HWCH_PRIORITY_HIGHEST,
+} netdev_hwchan_priority_e;
+
+/**
+ * struct netdev_rx_flow - Uniquely identifies the traffic flow for a given
+ * rx channel.
+ * @type: specifies what type of traffic flow this channel will use. This
+ * also specifies which of the fields in the union will be examined.
+ * @macaddr: if type is set to HWCH_RX_FLOW_MACADDR this field will be used
+ * to only accept traffic from this mac address
+ * @vlan_id: if type is set to HWCH_RX_FLOW_VLAN_ID this field will be used
+ * to only accept traffic from packets with this vlan id
+ * @vlan_qos: if type is set to HWCH_RX_FLOW_VLAN_QOS this field will be used
+ * to only accept traffic from packets with this vlan qos tag
+ * @port: if type is set to HWCH_RX_FLOW_PORT this field will be used to only
+ * accept traffic from tcp or udp packets with this destination port number
+ * @session_id: if type is set to HWCH_RX_FLOW_L4_HASH this field will be used
+ * to only allow tcp traffic from this specific session id
+ * @l4_4tuple: if type ie set to HWCH_RX_FLOW_L4_SPDM this struct will be
+ * used to only accept traffic which has the correct four-tuple consisting of:
+ * source ip, source port, destination ip, destinatopn port
+ *
+ * Receive channels can be set to shape the types of traffic placed upon them.
+ * This interface allows one to determine how to shape incoming traffic on
+ * a specified channel. For example, if
+ * netdev_rx_flow.type = HWCH_RX_FLOW_PORT and
+ * netdev_rx_flow.rx_flow_val.port = 3260 identifies all standard iSCSI
+ * traffic. The API call bind_rx_channel() is used to take the contents of
+ * struct netdev_rx_flow and apply it to a given rx channel.
+ **/
+struct netdev_rx_flow {
+ netdev_hwchan_rx_flow_e type;
+ union rx_flow_val {
+ unsigned char macaddr[MAX_ADDR_LEN];/* HWCH_RX_FLOW_MACADDR */
+ unsigned short vlan_id; /* HWCH_RX_FLOW_VLAN_ID */
+ unsigned char vlan_qos; /* HWCH_RX_FLOW_VLAN_QOS */
+ unsigned short port; /* HWCH_RX_FLOW_PORT */
+ unsigned int session_id; /* HWCH_RX_FLOW_L4_HASH */
+ struct { /* HWCH_RX_FLOW_L4_SPDM */
+ uint32_t src_ip;
+ unsigned short src_port;
+ uint32_t dst_ip;
+ unsigned short dst_port;
+ } l4_4tuple;
+ } rx_flow_val;
+};
+
+/**
+ * (*netif_rx_hwchannel_cb) - function to be used for an rx channels callback.
+ * @skb: system network buffer to place next available packet from the channel
+ * @kernel_channelh: hardware rx channel handle to bind process
+ * @flow: specifies the type of traffic flow to examine for the given hardware
+ * rx channel
+ *
+ * By using this callback an application can harvest traffic from a specific
+ * hardware rx channel bypassing the kernel. This function is optional.
+ **/
+typedef int (*netif_rx_hwchannel_cb) (struct sk_buff *skb,
+ void *kernel_channelh,
+ struct netdev_rx_flow flow);
+
+/**************************************************************************
+ * 2. Kernel-provided Calls (optional).
+ * ----------------------------------
+ * "Channelized" alterations of the corresponding netif_() callbacks.
+ *************************************************************************/
+
+/**
+ * netif_rx_hwchannel - gives a received buffer from an rx channel to the
+ * linux stack.
+ * @skb: system network buffer to place next available packet from the channel
+ * @kernel_channelh: hardware rx channel handle to process
+ * @flow: specifies the type of traffic flow to examine for the given hardware
+ * rx channel
+ *
+ * Post a buffer received on a given Rx hardware channel to the stack.
+ * Used only if the channel callback is _not_ specified,
+ * see open_rx_hwchannel().
+ **/
+extern int netif_rx_hwchannel (struct sk_buff *skb,
+ void *kernel_channelh,
+ struct netdev_rx_flow flow);
+
+/*
+ * Start/Stop/Wakeup all traffic (flows) using a given Tx channel.
+ * The channel must be Tx, that is - it must be open with open_tx_hwchannel().
+ */
+extern void netif_start_queue_tx_hwchannel (void *kernel_channelh);
+extern void netif_stop_queue_tx_hwchannel (void *kernel_channelh);
+extern void netif_wakeup_queue_tx_hwchannel (void *kernel_channelh);
+extern void netif_queue_stopped (void *kernel_channelh);
+#endif /* CONFIG_NET_CHANNELS */
+
/*
* The DEVICE structure.
* Actually, this whole structure is a big mistake. It mixes I/O
@@ -502,6 +643,144 @@
/* class/net/name entry */
struct class_device class_dev;
+
+#ifdef CONFIG_NET_CHANNELS
+ /***************** NET DEVICE HW CHANNELS ******************
+ * 1. Low-level calls.
+ * Exposes uni-directional hardware-supported channel: hw_channelh.
+ * Provided by a multi-channel (driver + adapter).
+ *****************************************************************/
+
+ /**
+ * (*open_tx_hwchannel) - open a channel to be used for transmit
+ * @dev: net_device structure to associate with this channel
+ * @priority: the channel priority as to how it is processed relative
+ * to other channels
+ * @burst_size: size of the channel, number of descriptors, etc.
+ * @kernel_channelh: hardware channel to bind transmit traffic to
+ * @hw_channelh: pointer to a user handle for a given hardware channel
+ *
+ * Opens a transmit channel and binds it to the hw_channelh parameter.
+ * A hardware channel cannot be opened twice and cannot be used prior
+ * to openeing. Should any error occur, hw_channelh will point to
+ * NULL.
+ **/
+ int (*open_tx_hwchannel) (struct net_device *dev,
+ netdev_hwchan_priority_e priority,
+ int burst_size,
+ void *kernel_channelh,
+ void **hw_channelh);
+
+ /**
+ * (*open_rx_hwchannel) - open a channel to be used for receive
+ * @dev: net_device structure to associate with this channel
+ * @flow_type: the receive channel flow type to associate with this
+ * hardware channel
+ * @priority: the channel priority as to how it is processed relative
+ * to other channels
+ * @burst_size: size of the channel, number of descriptors, etc.
+ * @kernel_channelh: hardware channel to bind transimit traffic to
+ * @hw_channelh: pointer to a user handle for a given hardware channel
+ *
+ * Opens a receive channel and binds it to the hw_channelh parameter.
+ * A hardware channel cannot be opened twice and cannot be used prior
+ * to openeing. Should any error occur, hw_channelh will point to
+ * NULL.
+ * Note: open_rx_hwchannel is optional. If the callback is not
+ * specified the driver will use the regular netif_ API.
+ **/
+ int (*open_rx_hwchannel) (struct net_device *dev,
+ netdev_hwchan_rx_flow_e flow_type,
+ netdev_hwchan_priority_e priority,
+ int cpu,
+ int burst_size,
+ netif_rx_hwchannel_cb callback,
+ void *kernel_channelh,
+ void **hw_channelh);
+
+ /**
+ * (*close_hwchannel) - close a hardware channel.
+ * @hw_channelh - specifies the particular hardware channel to close.
+ *
+ * Closes down a hardware channel that has been opened. This applies
+ * to either a transmit or receive channel. Note in order to close
+ * down a channel link, both the transmit and receive channels have
+ * to be closed separately.
+ **/
+ int (*close_hwchannel) (void *hw_channelh);
+
+ /**
+ * (*hard_start_xmit_hwchannel) - post a buffer to a transmit channel
+ * @skb: network packet to add to the transmit channel
+ * @hw_channelh: transmit channel to append the packet
+ *
+ * Posts a packet into the next available slot on the given transmit
+ * channel. This call will fail if hw_channelh is not open or is
+ * not a transmit channel. Note that unlike receive there is no API
+ * to bind transmit traffic to a given channel.
+ **/
+ int (*hard_start_xmit_hwchannel) (struct sk_buff *skb,
+ void *hw_channelh);
+
+ /**
+ * (*bind_rx_hwchannel) - binds a given receive traffic flow to a
+ * receive channel
+ * @flow: specific receive flow pattern to match traffic against
+ * @hw_channelh: receive hardware channel to match traffic based upon
+ * the given flow
+ *
+ * Given a specific flow this function will bind that flow to the
+ * named receive hardware channel. The relationship between receive
+ * flows and receive hardware channels is one-to-many. This means
+ * several flows can be bound to the same receive hardware channel.
+ * The function call will fail if the channel is not a receive channel,
+ * if the channel is not opened, or if the specified flow does not
+ * correspond with the channel type applied to the channel during
+ * channel open.
+ **/
+ int (*bind_rx_hwchannel) (struct netdev_rx_flow flow, void
*hw_channelh);
+
+ /**
+ * (*unbind_rx_hwchannel) - unbinds a given receive traffic flow to a
+ * receive channel
+ * @flow: specific receive flow pattern to match traffic against
+ * @hw_channelh: receive hardware channel to match traffic based upon
+ * the given flow
+ *
+ * Unbindes a certain flow from a receive hardware channel. The
+ * function will fail if the channel is not open, the channel is not
+ * a receive channel, or if the given flow has not been previously
+ * bound to the receive channel.
+ **/
+ int (*unbind_rx_hwchannel) (struct netdev_rx_flow flow, void
*hw_channelh);
+
+ /*
+ * (*poll_hwchannel) - completion handler executed in a polling mode
+ * @hw_channel: hardware channel to poll
+ * @budget: number of completions "budgeted" for processing in this
+ * iteration
+ *
+ * Polls a hardware channel and tries to reap at least as many
+ * packets as contained in budgeted. This works for both transmit
+ * and receive channels. For transmit this function cleans up
+ * packets marked as completed by the hardware. For receive the
+ * packets are either passed up the netif_ stack or by the
+ * channel receive callback if one was given.
+ */
+ int (*poll_hwchannel) (int *budget, void *hw_channelh);
+
+ /**
+ * (*get_stats_hwchannel) - obtain statistics about a hardware channel
+ * @hw_channelh: specific transmit or receive hardware channel to
+ * query for statistics
+ *
+ * Returns the standard statistics about a given transmit or receive
+ * hardware channel. The statistics are stored in the usual
+ * struct net_device_stats format.
+ **/
+ struct net_device_stats* (*get_stats_hwchannel) (void *hw_channelh);
+
+#endif /* CONFIG_NET_CHANNELS */
};
#define NETDEV_ALIGN 32
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html