The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/cxgbe/t4_l2t.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2011 Chelsio Communications, Inc.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * $FreeBSD: releng/8.4/sys/dev/cxgbe/t4_l2t.h 247670 2013-03-02 21:59:07Z np $
   27  *
   28  */
   29 
   30 #ifndef __T4_L2T_H
   31 #define __T4_L2T_H
   32 
   33 /* identifies sync vs async L2T_WRITE_REQs */
   34 #define S_SYNC_WR    12
   35 #define V_SYNC_WR(x) ((x) << S_SYNC_WR)
   36 #define F_SYNC_WR    V_SYNC_WR(1)
   37 
   38 enum { L2T_SIZE = 4096 };     /* # of L2T entries */
   39 
   40 enum {
   41         L2T_STATE_VALID,        /* entry is up to date */
   42         L2T_STATE_STALE,        /* entry may be used but needs revalidation */
   43         L2T_STATE_RESOLVING,    /* entry needs address resolution */
   44         L2T_STATE_FAILED,       /* failed to resolve */
   45         L2T_STATE_SYNC_WRITE,   /* synchronous write of entry underway */
   46 
   47         /* when state is one of the below the entry is not hashed */
   48         L2T_STATE_SWITCHING,    /* entry is being used by a switching filter */
   49         L2T_STATE_UNUSED        /* entry not in use */
   50 };
   51 
   52 /*
   53  * Each L2T entry plays multiple roles.  First of all, it keeps state for the
   54  * corresponding entry of the HW L2 table and maintains a queue of offload
   55  * packets awaiting address resolution.  Second, it is a node of a hash table
   56  * chain, where the nodes of the chain are linked together through their next
   57  * pointer.  Finally, each node is a bucket of a hash table, pointing to the
   58  * first element in its chain through its first pointer.
   59  */
   60 struct l2t_entry {
   61         uint16_t state;                 /* entry state */
   62         uint16_t idx;                   /* entry index */
   63         uint32_t addr[4];               /* next hop IP or IPv6 address */
   64         struct ifnet *ifp;              /* outgoing interface */
   65         uint16_t smt_idx;               /* SMT index */
   66         uint16_t vlan;                  /* VLAN TCI (id: 0-11, prio: 13-15) */
   67         struct l2t_entry *first;        /* start of hash chain */
   68         struct l2t_entry *next;         /* next l2t_entry on chain */
   69         STAILQ_HEAD(, wrqe) wr_list;    /* list of WRs awaiting resolution */
   70         struct mtx lock;
   71         volatile int refcnt;            /* entry reference count */
   72         uint16_t hash;                  /* hash bucket the entry is on */
   73         uint8_t ipv6;                   /* entry is for an IPv6 address */
   74         uint8_t lport;                  /* associated offload logical port */
   75         uint8_t dmac[ETHER_ADDR_LEN];   /* next hop's MAC address */
   76 };
   77 
   78 struct l2t_data {
   79         struct rwlock lock;
   80         u_int l2t_size;
   81         volatile int nfree;     /* number of free entries */
   82         struct l2t_entry *rover;/* starting point for next allocation */
   83         struct l2t_entry l2tab[];
   84 };
   85 
   86 
   87 int t4_init_l2t(struct adapter *, int);
   88 int t4_free_l2t(struct l2t_data *);
   89 struct l2t_entry *t4_alloc_l2e(struct l2t_data *);
   90 struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *);
   91 int t4_l2t_set_switching(struct adapter *, struct l2t_entry *, uint16_t,
   92     uint8_t, uint8_t *);
   93 int t4_write_l2e(struct adapter *, struct l2t_entry *, int);
   94 int do_l2t_write_rpl(struct sge_iq *, const struct rss_header *, struct mbuf *);
   95 
   96 static inline void
   97 t4_l2t_release(struct l2t_entry *e)
   98 {
   99         struct l2t_data *d = member2struct(l2t_data, l2tab[e->idx], e);
  100 
  101         if (atomic_fetchadd_int(&e->refcnt, -1) == 1)
  102                 atomic_add_int(&d->nfree, 1);
  103 }
  104 
  105 
  106 #ifdef SBUF_DRAIN
  107 int sysctl_l2t(SYSCTL_HANDLER_ARGS);
  108 #endif
  109 
  110 #endif  /* __T4_L2T_H */

Cache object: 44eb644d352942e7e89d46f66ff2c647


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.