forked from Minki/linux
f2b7e78dbc
The T4 architecture is capable of filtering ingress packets at line rate using the rule in TCAM. If packet hits a rule in the TCAM then it can be either dropped or passed to the receive queues based on a rule settings. This patch adds framework for managing filters and to use T4's filter capabilities. It constructs a Firmware Filter Work Request which writes the filter at a specified index to get the work done. It hosts shadow copy of ingress filter entry to check field size limitations and save memory in the case where the filter table is large. Signed-off-by: Vipul Pandya <vipul@chelsio.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
111 lines
4.2 KiB
C
111 lines
4.2 KiB
C
/*
|
|
* This file is part of the Chelsio T4 Ethernet driver for Linux.
|
|
*
|
|
* Copyright (c) 2003-2010 Chelsio Communications, Inc. All rights reserved.
|
|
*
|
|
* This software is available to you under a choice of one of two
|
|
* licenses. You may choose to be licensed under the terms of the GNU
|
|
* General Public License (GPL) Version 2, available from the file
|
|
* COPYING in the main directory of this source tree, or the
|
|
* OpenIB.org BSD license below:
|
|
*
|
|
* Redistribution and use in source and binary forms, with or
|
|
* without modification, are permitted provided that the following
|
|
* conditions are met:
|
|
*
|
|
* - Redistributions of source code must retain the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
|
|
#ifndef __CXGB4_L2T_H
|
|
#define __CXGB4_L2T_H
|
|
|
|
#include <linux/spinlock.h>
|
|
#include <linux/if_ether.h>
|
|
#include <linux/atomic.h>
|
|
|
|
struct adapter;
|
|
struct l2t_data;
|
|
struct neighbour;
|
|
struct net_device;
|
|
struct file_operations;
|
|
struct cpl_l2t_write_rpl;
|
|
|
|
/*
|
|
* Each L2T entry plays multiple roles. First of all, it keeps state for the
|
|
* corresponding entry of the HW L2 table and maintains a queue of offload
|
|
* packets awaiting address resolution. Second, it is a node of a hash table
|
|
* chain, where the nodes of the chain are linked together through their next
|
|
* pointer. Finally, each node is a bucket of a hash table, pointing to the
|
|
* first element in its chain through its first pointer.
|
|
*/
|
|
struct l2t_entry {
|
|
u16 state; /* entry state */
|
|
u16 idx; /* entry index */
|
|
u32 addr[4]; /* next hop IP or IPv6 address */
|
|
int ifindex; /* neighbor's net_device's ifindex */
|
|
struct neighbour *neigh; /* associated neighbour */
|
|
struct l2t_entry *first; /* start of hash chain */
|
|
struct l2t_entry *next; /* next l2t_entry on chain */
|
|
struct sk_buff *arpq_head; /* queue of packets awaiting resolution */
|
|
struct sk_buff *arpq_tail;
|
|
spinlock_t lock;
|
|
atomic_t refcnt; /* entry reference count */
|
|
u16 hash; /* hash bucket the entry is on */
|
|
u16 vlan; /* VLAN TCI (id: bits 0-11, prio: 13-15 */
|
|
u8 v6; /* whether entry is for IPv6 */
|
|
u8 lport; /* associated offload logical interface */
|
|
u8 dmac[ETH_ALEN]; /* neighbour's MAC address */
|
|
};
|
|
|
|
typedef void (*arp_err_handler_t)(void *handle, struct sk_buff *skb);
|
|
|
|
/*
|
|
* Callback stored in an skb to handle address resolution failure.
|
|
*/
|
|
struct l2t_skb_cb {
|
|
void *handle;
|
|
arp_err_handler_t arp_err_handler;
|
|
};
|
|
|
|
#define L2T_SKB_CB(skb) ((struct l2t_skb_cb *)(skb)->cb)
|
|
|
|
static inline void t4_set_arp_err_handler(struct sk_buff *skb, void *handle,
|
|
arp_err_handler_t handler)
|
|
{
|
|
L2T_SKB_CB(skb)->handle = handle;
|
|
L2T_SKB_CB(skb)->arp_err_handler = handler;
|
|
}
|
|
|
|
void cxgb4_l2t_release(struct l2t_entry *e);
|
|
int cxgb4_l2t_send(struct net_device *dev, struct sk_buff *skb,
|
|
struct l2t_entry *e);
|
|
struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh,
|
|
const struct net_device *physdev,
|
|
unsigned int priority);
|
|
|
|
void t4_l2t_update(struct adapter *adap, struct neighbour *neigh);
|
|
struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d);
|
|
int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan,
|
|
u8 port, u8 *eth_addr);
|
|
struct l2t_data *t4_init_l2t(void);
|
|
void do_l2t_write_rpl(struct adapter *p, const struct cpl_l2t_write_rpl *rpl);
|
|
|
|
extern const struct file_operations t4_l2t_fops;
|
|
#endif /* __CXGB4_L2T_H */
|