linux/drivers/net/bonding/bond_alb.h
<<
>>
Prefs
   1/*
   2 * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms of the GNU General Public License as published by the
   6 * Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful, but
  10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 * for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along
  15 * with this program; if not, write to the Free Software Foundation, Inc.,
  16 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17 *
  18 * The full GNU General Public License is included in this distribution in the
  19 * file called LICENSE.
  20 *
  21 */
  22
  23#ifndef __BOND_ALB_H__
  24#define __BOND_ALB_H__
  25
  26#include <linux/if_ether.h>
  27
  28struct bonding;
  29struct slave;
  30
  31#define BOND_ALB_INFO(bond)   ((bond)->alb_info)
  32#define SLAVE_TLB_INFO(slave) ((slave)->tlb_info)
  33
  34#define ALB_TIMER_TICKS_PER_SEC     10  /* should be a divisor of HZ */
  35#define BOND_TLB_REBALANCE_INTERVAL 10  /* In seconds, periodic re-balancing.
  36                                         * Used for division - never set
  37                                         * to zero !!!
  38                                         */
  39#define BOND_ALB_LP_INTERVAL        1   /* In seconds, periodic send of
  40                                         * learning packets to the switch
  41                                         */
  42
  43#define BOND_TLB_REBALANCE_TICKS (BOND_TLB_REBALANCE_INTERVAL \
  44                                  * ALB_TIMER_TICKS_PER_SEC)
  45
  46#define BOND_ALB_LP_TICKS (BOND_ALB_LP_INTERVAL \
  47                           * ALB_TIMER_TICKS_PER_SEC)
  48
  49#define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table.
  50                                 * Note that this value MUST NOT be smaller
  51                                 * because the key hash table is BYTE wide !
  52                                 */
  53
  54
  55#define TLB_NULL_INDEX          0xffffffff
  56#define MAX_LP_BURST            3
  57
  58/* rlb defs */
  59#define RLB_HASH_TABLE_SIZE     256
  60#define RLB_NULL_INDEX          0xffffffff
  61#define RLB_UPDATE_DELAY        (2*ALB_TIMER_TICKS_PER_SEC) /* 2 seconds */
  62#define RLB_ARP_BURST_SIZE      2
  63#define RLB_UPDATE_RETRY        3 /* 3-ticks - must be smaller than the rlb
  64                                   * rebalance interval (5 min).
  65                                   */
  66/* RLB_PROMISC_TIMEOUT = 10 sec equals the time that the current slave is
  67 * promiscuous after failover
  68 */
  69#define RLB_PROMISC_TIMEOUT     (10*ALB_TIMER_TICKS_PER_SEC)
  70
  71
  72struct tlb_client_info {
  73        struct slave *tx_slave; /* A pointer to slave used for transmiting
  74                                 * packets to a Client that the Hash function
  75                                 * gave this entry index.
  76                                 */
  77        u32 tx_bytes;           /* Each Client acumulates the BytesTx that
  78                                 * were tranmitted to it, and after each
  79                                 * CallBack the LoadHistory is devided
  80                                 * by the balance interval
  81                                 */
  82        u32 load_history;       /* This field contains the amount of Bytes
  83                                 * that were transmitted to this client by
  84                                 * the server on the previous balance
  85                                 * interval in Bps.
  86                                 */
  87        u32 next;               /* The next Hash table entry index, assigned
  88                                 * to use the same adapter for transmit.
  89                                 */
  90        u32 prev;               /* The previous Hash table entry index,
  91                                 * assigned to use the same
  92                                 */
  93};
  94
  95/* -------------------------------------------------------------------------
  96 * struct rlb_client_info contains all info related to a specific rx client
  97 * connection. This is the Clients Hash Table entry struct
  98 * -------------------------------------------------------------------------
  99 */
 100struct rlb_client_info {
 101        __be32 ip_src;          /* the server IP address */
 102        __be32 ip_dst;          /* the client IP address */
 103        u8  mac_dst[ETH_ALEN];  /* the client MAC address */
 104        u32 next;               /* The next Hash table entry index */
 105        u32 prev;               /* The previous Hash table entry index */
 106        u8  assigned;           /* checking whether this entry is assigned */
 107        u8  ntt;                /* flag - need to transmit client info */
 108        struct slave *slave;    /* the slave assigned to this client */
 109        u8 tag;                 /* flag - need to tag skb */
 110        unsigned short vlan_id; /* VLAN tag associated with IP address */
 111};
 112
 113struct tlb_slave_info {
 114        u32 head;       /* Index to the head of the bi-directional clients
 115                         * hash table entries list. The entries in the list
 116                         * are the entries that were assigned to use this
 117                         * slave for transmit.
 118                         */
 119        u32 load;       /* Each slave sums the loadHistory of all clients
 120                         * assigned to it
 121                         */
 122};
 123
 124struct alb_bond_info {
 125        struct timer_list       alb_timer;
 126        struct tlb_client_info  *tx_hashtbl; /* Dynamically allocated */
 127        spinlock_t              tx_hashtbl_lock;
 128        u32                     unbalanced_load;
 129        int                     tx_rebalance_counter;
 130        int                     lp_counter;
 131        /* -------- rlb parameters -------- */
 132        int rlb_enabled;
 133        struct packet_type      rlb_pkt_type;
 134        struct rlb_client_info  *rx_hashtbl;    /* Receive hash table */
 135        spinlock_t              rx_hashtbl_lock;
 136        u32                     rx_hashtbl_head;
 137        u8                      rx_ntt; /* flag - need to transmit
 138                                         * to all rx clients
 139                                         */
 140        struct slave            *next_rx_slave;/* next slave to be assigned
 141                                                * to a new rx client for
 142                                                */
 143        u32                     rlb_interval_counter;
 144        u8                      primary_is_promisc;        /* boolean */
 145        u32                     rlb_promisc_timeout_counter;/* counts primary
 146                                                             * promiscuity time
 147                                                             */
 148        u32                     rlb_update_delay_counter;
 149        u32                     rlb_update_retry_counter;/* counter of retries
 150                                                          * of client update
 151                                                          */
 152        u8                      rlb_rebalance;  /* flag - indicates that the
 153                                                 * rx traffic should be
 154                                                 * rebalanced
 155                                                 */
 156        struct vlan_entry       *current_alb_vlan;
 157};
 158
 159int bond_alb_initialize(struct bonding *bond, int rlb_enabled);
 160void bond_alb_deinitialize(struct bonding *bond);
 161int bond_alb_init_slave(struct bonding *bond, struct slave *slave);
 162void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave);
 163void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link);
 164void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave);
 165int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
 166void bond_alb_monitor(struct work_struct *);
 167int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
 168void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id);
 169#endif /* __BOND_ALB_H__ */
 170
 171