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 transmitting 57 * packets to a Client that the Hash function 58 * gave this entry index. 59 */ 60 u64 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 u64 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 u64 load; /* Each slave sums the loadHistory of all clients 122 * assigned to it 123 */ 124 }; 125 126 struct unbalanced_load_stats { 127 u64_stats_t tx_bytes; 128 struct u64_stats_sync syncp; 129 }; 130 131 struct alb_bond_info { 132 struct tlb_client_info *tx_hashtbl; /* Dynamically allocated */ 133 struct unbalanced_load_stats __percpu *unbalanced_load; 134 u64 prev_total_unbalanced; 135 atomic_t tx_rebalance_counter; 136 int lp_counter; 137 /* -------- rlb parameters -------- */ 138 int rlb_enabled; 139 struct rlb_client_info *rx_hashtbl; /* Receive hash table */ 140 u32 rx_hashtbl_used_head; 141 u8 rx_ntt; /* flag - need to transmit 142 * to all rx clients 143 */ 144 struct slave *rx_slave;/* last slave to xmit from */ 145 u8 primary_is_promisc; /* boolean */ 146 u32 rlb_promisc_timeout_counter;/* counts primary 147 * promiscuity time 148 */ 149 u32 rlb_update_delay_counter; 150 u32 rlb_update_retry_counter;/* counter of retries 151 * of client update 152 */ 153 u8 rlb_rebalance; /* flag - indicates that the 154 * rx traffic should be 155 * rebalanced 156 */ 157 }; 158 159 int bond_alb_initialize(struct bonding *bond, int rlb_enabled); 160 void bond_alb_deinitialize(struct bonding *bond); 161 int bond_alb_init_slave(struct bonding *bond, struct slave *slave); 162 void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave); 163 void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); 164 void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); 165 netdev_tx_t bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); 166 netdev_tx_t bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev); 167 struct slave *bond_xmit_alb_slave_get(struct bonding *bond, 168 struct sk_buff *skb); 169 struct slave *bond_xmit_tlb_slave_get(struct bonding *bond, 170 struct sk_buff *skb); 171 void bond_alb_monitor(struct work_struct *); 172 int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); 173 void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id); 174 #endif /* _NET_BOND_ALB_H */ 175 176