| 1 |
|
| 2 | |
| 3 | * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
|
| 4 |
|
| 5 |
|
| 6 | #ifndef _NET_BOND_ALB_H
|
| 7 | #define _NET_BOND_ALB_H
|
| 8 |
|
| 9 | #include <linux/if_ether.h>
|
| 10 |
|
| 11 | struct bonding;
|
| 12 | struct slave;
|
| 13 |
|
| 14 | #define BOND_ALB_INFO(bond) ((bond)->alb_info)
|
| 15 | #define SLAVE_TLB_INFO(slave) ((slave)->tlb_info)
|
| 16 |
|
| 17 | #define ALB_TIMER_TICKS_PER_SEC 10
|
| 18 | #define BOND_TLB_REBALANCE_INTERVAL 10 |
| 19 | * Used for division - never set
|
| 20 | * to zero !!!
|
| 21 |
|
| 22 | #define BOND_ALB_DEFAULT_LP_INTERVAL 1
|
| 23 | #define BOND_ALB_LP_INTERVAL(bond) (bond->params.lp_interval) |
| 24 | * learning packets to the switch
|
| 25 |
|
| 26 |
|
| 27 | #define BOND_TLB_REBALANCE_TICKS (BOND_TLB_REBALANCE_INTERVAL \
|
| 28 | * ALB_TIMER_TICKS_PER_SEC)
|
| 29 |
|
| 30 | #define BOND_ALB_LP_TICKS(bond) (BOND_ALB_LP_INTERVAL(bond) \
|
| 31 | * ALB_TIMER_TICKS_PER_SEC)
|
| 32 |
|
| 33 | #define TLB_HASH_TABLE_SIZE 256 |
| 34 | * Note that this value MUST NOT be smaller
|
| 35 | * because the key hash table is BYTE wide !
|
| 36 |
|
| 37 |
|
| 38 |
|
| 39 | #define TLB_NULL_INDEX 0xffffffff
|
| 40 |
|
| 41 |
|
| 42 | #define RLB_HASH_TABLE_SIZE 256
|
| 43 | #define RLB_NULL_INDEX 0xffffffff
|
| 44 | #define RLB_UPDATE_DELAY (2*ALB_TIMER_TICKS_PER_SEC)
|
| 45 | #define RLB_ARP_BURST_SIZE 2
|
| 46 | #define RLB_UPDATE_RETRY 3 |
| 47 | * rebalance interval (5 min).
|
| 48 |
|
| 49 | |
| 50 | * promiscuous after failover
|
| 51 |
|
| 52 | #define RLB_PROMISC_TIMEOUT (10*ALB_TIMER_TICKS_PER_SEC)
|
| 53 |
|
| 54 |
|
| 55 | struct tlb_client_info {
|
| 56 | struct slave *tx_slave; |
| 57 | * packets to a Client that the Hash function
|
| 58 | * gave this entry index.
|
| 59 |
|
| 60 | u32 tx_bytes; |
| 61 | * were transmitted to it, and after each
|
| 62 | * CallBack the LoadHistory is divided
|
| 63 | * by the balance interval
|
| 64 |
|
| 65 | u32 load_history; |
| 66 | * that were transmitted to this client by
|
| 67 | * the server on the previous balance
|
| 68 | * interval in Bps.
|
| 69 |
|
| 70 | u32 next; |
| 71 | * to use the same adapter for transmit.
|
| 72 |
|
| 73 | u32 prev; |
| 74 | * assigned to use the same
|
| 75 |
|
| 76 | };
|
| 77 |
|
| 78 | |
| 79 | * struct rlb_client_info contains all info related to a specific rx client
|
| 80 | * connection. This is the Clients Hash Table entry struct.
|
| 81 | * Note that this is not a proper hash table; if a new client's IP address
|
| 82 | * hash collides with an existing client entry, the old entry is replaced.
|
| 83 | *
|
| 84 | * There is a linked list (linked by the used_next and used_prev members)
|
| 85 | * linking all the used entries of the hash table. This allows updating
|
| 86 | * all the clients without walking over all the unused elements of the table.
|
| 87 | *
|
| 88 | * There are also linked lists of entries with identical hash(ip_src). These
|
| 89 | * allow cleaning up the table from ip_src<->mac_src associations that have
|
| 90 | * become outdated and would cause sending out invalid ARP updates to the
|
| 91 | * network. These are linked by the (src_next and src_prev members).
|
| 92 | * -------------------------------------------------------------------------
|
| 93 |
|
| 94 | struct rlb_client_info {
|
| 95 | __be32 ip_src;
|
| 96 | __be32 ip_dst;
|
| 97 | u8 mac_src[ETH_ALEN];
|
| 98 | u8 mac_dst[ETH_ALEN];
|
| 99 |
|
| 100 |
|
| 101 | u32 used_next;
|
| 102 | u32 used_prev;
|
| 103 |
|
| 104 |
|
| 105 | u32 src_next;
|
| 106 | u32 src_prev;
|
| 107 | u32 src_first;
|
| 108 |
|
| 109 | u8 assigned;
|
| 110 | u8 ntt;
|
| 111 | struct slave *slave;
|
| 112 | unsigned short vlan_id;
|
| 113 | };
|
| 114 |
|
| 115 | struct tlb_slave_info {
|
| 116 | u32 head; |
| 117 | * hash table entries list. The entries in the list
|
| 118 | * are the entries that were assigned to use this
|
| 119 | * slave for transmit.
|
| 120 |
|
| 121 | u32 load; |
| 122 | * assigned to it
|
| 123 |
|
| 124 | };
|
| 125 |
|
| 126 | struct alb_bond_info {
|
| 127 | struct tlb_client_info *tx_hashtbl;
|
| 128 | u32 unbalanced_load;
|
| 129 | atomic_t tx_rebalance_counter;
|
| 130 | int lp_counter;
|
| 131 |
|
| 132 | int rlb_enabled;
|
| 133 | struct rlb_client_info *rx_hashtbl;
|
| 134 | u32 rx_hashtbl_used_head;
|
| 135 | u8 rx_ntt; |
| 136 | * to all rx clients
|
| 137 |
|
| 138 | struct slave *rx_slave;
|
| 139 | u8 primary_is_promisc;
|
| 140 | u32 rlb_promisc_timeout_counter; |
| 141 | * promiscuity time
|
| 142 |
|
| 143 | u32 rlb_update_delay_counter;
|
| 144 | u32 rlb_update_retry_counter; |
| 145 | * of client update
|
| 146 |
|
| 147 | u8 rlb_rebalance; |
| 148 | * rx traffic should be
|
| 149 | * rebalanced
|
| 150 |
|
| 151 | };
|
| 152 |
|
| 153 | int bond_alb_initialize(struct bonding *bond, int rlb_enabled);
|
| 154 | void bond_alb_deinitialize(struct bonding *bond);
|
| 155 | int bond_alb_init_slave(struct bonding *bond, struct slave *slave);
|
| 156 | void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave);
|
| 157 | void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link);
|
| 158 | void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave);
|
| 159 | netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
|
| 160 | netdev_tx_t bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
|
| 161 | struct slave *bond_xmit_alb_slave_get(struct bonding *bond,
|
| 162 | struct sk_buff *skb);
|
| 163 | struct slave *bond_xmit_tlb_slave_get(struct bonding *bond,
|
| 164 | struct sk_buff *skb);
|
| 165 | void bond_alb_monitor(struct work_struct *);
|
| 166 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
|
| 167 | void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id);
|
| 168 | #endif
|
| 169 |
|