1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 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 /* should be a divisor of HZ */ 18 #define BOND_TLB_REBALANCE_INTERVAL 10 /* In seconds, periodic re-balancing. 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) /* In seconds, periodic send of 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 /* The size of the clients hash table. 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 /* rlb defs */ 42 #define RLB_HASH_TABLE_SIZE 256 43 #define RLB_NULL_INDEX 0xffffffff 44 #define RLB_UPDATE_DELAY (2*ALB_TIMER_TICKS_PER_SEC) /* 2 seconds */ 45 #define RLB_ARP_BURST_SIZE 2 46 #define RLB_UPDATE_RETRY 3 /* 3-ticks - must be smaller than the rlb 47 * rebalance interval (5 min). 48 */ 49 /* RLB_PROMISC_TIMEOUT = 10 sec equals the time that the current slave is 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; /* A pointer to slave used for transmiting 57 * packets to a Client that the Hash function 58 * gave this entry index. 59 */ 60 u32 tx_bytes; /* Each Client accumulates the BytesTx that 61 * were transmitted to it, and after each 62 * CallBack the LoadHistory is divided 63 * by the balance interval 64 */ 65 u32 load_history; /* This field contains the amount of Bytes 66 * that were transmitted to this client by 67 * the server on the previous balance 68 * interval in Bps. 69 */ 70 u32 next; /* The next Hash table entry index, assigned 71 * to use the same adapter for transmit. 72 */ 73 u32 prev; /* The previous Hash table entry index, 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; /* the server IP address */ 96 __be32 ip_dst; /* the client IP address */ 97 u8 mac_src[ETH_ALEN]; /* the server MAC address */ 98 u8 mac_dst[ETH_ALEN]; /* the client MAC address */ 99 100 /* list of used hash table entries, starting at rx_hashtbl_used_head */ 101 u32 used_next; 102 u32 used_prev; 103 104 /* ip_src based hashing */ 105 u32 src_next; /* next entry with same hash(ip_src) */ 106 u32 src_prev; /* prev entry with same hash(ip_src) */ 107 u32 src_first; /* first entry with hash(ip_src) == this entry's index */ 108 109 u8 assigned; /* checking whether this entry is assigned */ 110 u8 ntt; /* flag - need to transmit client info */ 111 struct slave *slave; /* the slave assigned to this client */ 112 unsigned short vlan_id; /* VLAN tag associated with IP address */ 113 }; 114 115 struct tlb_slave_info { 116 u32 head; /* Index to the head of the bi-directional clients 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; /* Each slave sums the loadHistory of all clients 122 * assigned to it 123 */ 124 }; 125 126 struct alb_bond_info { 127 struct tlb_client_info *tx_hashtbl; /* Dynamically allocated */ 128 u32 unbalanced_load; 129 atomic_t tx_rebalance_counter; 130 int lp_counter; 131 /* -------- rlb parameters -------- */ 132 int rlb_enabled; 133 struct rlb_client_info *rx_hashtbl; /* Receive hash table */ 134 u32 rx_hashtbl_used_head; 135 u8 rx_ntt; /* flag - need to transmit 136 * to all rx clients 137 */ 138 struct slave *rx_slave;/* last slave to xmit from */ 139 u8 primary_is_promisc; /* boolean */ 140 u32 rlb_promisc_timeout_counter;/* counts primary 141 * promiscuity time 142 */ 143 u32 rlb_update_delay_counter; 144 u32 rlb_update_retry_counter;/* counter of retries 145 * of client update 146 */ 147 u8 rlb_rebalance; /* flag - indicates that the 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 /* _NET_BOND_ALB_H */ 169 170