cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bond_alb.h (6235B)


      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
     11struct bonding;
     12struct 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
     55struct 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 */
     94struct 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
    115struct 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
    126struct 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
    153int bond_alb_initialize(struct bonding *bond, int rlb_enabled);
    154void bond_alb_deinitialize(struct bonding *bond);
    155int bond_alb_init_slave(struct bonding *bond, struct slave *slave);
    156void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave);
    157void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link);
    158void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave);
    159int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
    160int bond_tlb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
    161struct slave *bond_xmit_alb_slave_get(struct bonding *bond,
    162				      struct sk_buff *skb);
    163struct slave *bond_xmit_tlb_slave_get(struct bonding *bond,
    164				      struct sk_buff *skb);
    165void bond_alb_monitor(struct work_struct *);
    166int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
    167void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id);
    168#endif /* _NET_BOND_ALB_H */
    169