linux/include/net/bonding.h
<<
>>
Prefs
   1/*
   2 * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
   3 *
   4 * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
   5 * NCM: Network and Communications Management, Inc.
   6 *
   7 * BUT, I'm the one who modified it for ethernet, so:
   8 * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov
   9 *
  10 *      This software may be used and distributed according to the terms
  11 *      of the GNU Public License, incorporated herein by reference.
  12 *
  13 */
  14
  15#ifndef _NET_BONDING_H
  16#define _NET_BONDING_H
  17
  18#include <linux/timer.h>
  19#include <linux/proc_fs.h>
  20#include <linux/if_bonding.h>
  21#include <linux/cpumask.h>
  22#include <linux/in6.h>
  23#include <linux/netpoll.h>
  24#include <linux/inetdevice.h>
  25#include <linux/etherdevice.h>
  26#include <linux/reciprocal_div.h>
  27#include <linux/if_link.h>
  28
  29#include <net/bond_3ad.h>
  30#include <net/bond_alb.h>
  31#include <net/bond_options.h>
  32#include <net/ipv6.h>
  33#include <net/addrconf.h>
  34
  35#define BOND_MAX_ARP_TARGETS    16
  36#define BOND_MAX_NS_TARGETS     BOND_MAX_ARP_TARGETS
  37
  38#define BOND_DEFAULT_MIIMON     100
  39
  40#ifndef __long_aligned
  41#define __long_aligned __attribute__((aligned((sizeof(long)))))
  42#endif
  43
  44#define slave_info(bond_dev, slave_dev, fmt, ...) \
  45        netdev_info(bond_dev, "(slave %s): " fmt, (slave_dev)->name, ##__VA_ARGS__)
  46#define slave_warn(bond_dev, slave_dev, fmt, ...) \
  47        netdev_warn(bond_dev, "(slave %s): " fmt, (slave_dev)->name, ##__VA_ARGS__)
  48#define slave_dbg(bond_dev, slave_dev, fmt, ...) \
  49        netdev_dbg(bond_dev, "(slave %s): " fmt, (slave_dev)->name, ##__VA_ARGS__)
  50#define slave_err(bond_dev, slave_dev, fmt, ...) \
  51        netdev_err(bond_dev, "(slave %s): " fmt, (slave_dev)->name, ##__VA_ARGS__)
  52
  53#define BOND_MODE(bond) ((bond)->params.mode)
  54
  55/* slave list primitives */
  56#define bond_slave_list(bond) (&(bond)->dev->adj_list.lower)
  57
  58#define bond_has_slaves(bond) !list_empty(bond_slave_list(bond))
  59
  60/* IMPORTANT: bond_first/last_slave can return NULL in case of an empty list */
  61#define bond_first_slave(bond) \
  62        (bond_has_slaves(bond) ? \
  63                netdev_adjacent_get_private(bond_slave_list(bond)->next) : \
  64                NULL)
  65#define bond_last_slave(bond) \
  66        (bond_has_slaves(bond) ? \
  67                netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \
  68                NULL)
  69
  70/* Caller must have rcu_read_lock */
  71#define bond_first_slave_rcu(bond) \
  72        netdev_lower_get_first_private_rcu(bond->dev)
  73
  74#define bond_is_first_slave(bond, pos) (pos == bond_first_slave(bond))
  75#define bond_is_last_slave(bond, pos) (pos == bond_last_slave(bond))
  76
  77/**
  78 * bond_for_each_slave - iterate over all slaves
  79 * @bond:       the bond holding this list
  80 * @pos:        current slave
  81 * @iter:       list_head * iterator
  82 *
  83 * Caller must hold RTNL
  84 */
  85#define bond_for_each_slave(bond, pos, iter) \
  86        netdev_for_each_lower_private((bond)->dev, pos, iter)
  87
  88/* Caller must have rcu_read_lock */
  89#define bond_for_each_slave_rcu(bond, pos, iter) \
  90        netdev_for_each_lower_private_rcu((bond)->dev, pos, iter)
  91
  92#define BOND_XFRM_FEATURES (NETIF_F_HW_ESP | NETIF_F_HW_ESP_TX_CSUM | \
  93                            NETIF_F_GSO_ESP)
  94
  95#define BOND_TLS_FEATURES (NETIF_F_HW_TLS_TX | NETIF_F_HW_TLS_RX)
  96
  97#ifdef CONFIG_NET_POLL_CONTROLLER
  98extern atomic_t netpoll_block_tx;
  99
 100static inline void block_netpoll_tx(void)
 101{
 102        atomic_inc(&netpoll_block_tx);
 103}
 104
 105static inline void unblock_netpoll_tx(void)
 106{
 107        atomic_dec(&netpoll_block_tx);
 108}
 109
 110static inline int is_netpoll_tx_blocked(struct net_device *dev)
 111{
 112        if (unlikely(netpoll_tx_running(dev)))
 113                return atomic_read(&netpoll_block_tx);
 114        return 0;
 115}
 116#else
 117#define block_netpoll_tx()
 118#define unblock_netpoll_tx()
 119#define is_netpoll_tx_blocked(dev) (0)
 120#endif
 121
 122struct bond_params {
 123        int mode;
 124        int xmit_policy;
 125        int miimon;
 126        u8 num_peer_notif;
 127        u8 missed_max;
 128        int arp_interval;
 129        int arp_validate;
 130        int arp_all_targets;
 131        int use_carrier;
 132        int fail_over_mac;
 133        int updelay;
 134        int downdelay;
 135        int peer_notif_delay;
 136        int lacp_active;
 137        int lacp_fast;
 138        unsigned int min_links;
 139        int ad_select;
 140        char primary[IFNAMSIZ];
 141        int primary_reselect;
 142        __be32 arp_targets[BOND_MAX_ARP_TARGETS];
 143        int tx_queues;
 144        int all_slaves_active;
 145        int resend_igmp;
 146        int lp_interval;
 147        int packets_per_slave;
 148        int tlb_dynamic_lb;
 149        struct reciprocal_value reciprocal_packets_per_slave;
 150        u16 ad_actor_sys_prio;
 151        u16 ad_user_port_key;
 152        struct in6_addr ns_targets[BOND_MAX_NS_TARGETS];
 153
 154        /* 2 bytes of padding : see ether_addr_equal_64bits() */
 155        u8 ad_actor_system[ETH_ALEN + 2];
 156};
 157
 158struct slave {
 159        struct net_device *dev; /* first - useful for panic debug */
 160        struct bonding *bond; /* our master */
 161        int    delay;
 162        /* all three in jiffies */
 163        unsigned long last_link_up;
 164        unsigned long last_rx;
 165        unsigned long target_last_arp_rx[BOND_MAX_ARP_TARGETS];
 166        s8     link;            /* one of BOND_LINK_XXXX */
 167        s8     link_new_state;  /* one of BOND_LINK_XXXX */
 168        u8     backup:1,   /* indicates backup slave. Value corresponds with
 169                              BOND_STATE_ACTIVE and BOND_STATE_BACKUP */
 170               inactive:1, /* indicates inactive slave */
 171               should_notify:1, /* indicates whether the state changed */
 172               should_notify_link:1; /* indicates whether the link changed */
 173        u8     duplex;
 174        u32    original_mtu;
 175        u32    link_failure_count;
 176        u32    speed;
 177        u16    queue_id;
 178        u8     perm_hwaddr[MAX_ADDR_LEN];
 179        struct ad_slave_info *ad_info;
 180        struct tlb_slave_info tlb_info;
 181#ifdef CONFIG_NET_POLL_CONTROLLER
 182        struct netpoll *np;
 183#endif
 184        struct delayed_work notify_work;
 185        struct kobject kobj;
 186        struct rtnl_link_stats64 slave_stats;
 187};
 188
 189static inline struct slave *to_slave(struct kobject *kobj)
 190{
 191        return container_of(kobj, struct slave, kobj);
 192}
 193
 194struct bond_up_slave {
 195        unsigned int    count;
 196        struct rcu_head rcu;
 197        struct slave    *arr[];
 198};
 199
 200/*
 201 * Link pseudo-state only used internally by monitors
 202 */
 203#define BOND_LINK_NOCHANGE -1
 204
 205struct bond_ipsec {
 206        struct list_head list;
 207        struct xfrm_state *xs;
 208};
 209
 210/*
 211 * Here are the locking policies for the two bonding locks:
 212 * Get rcu_read_lock when reading or RTNL when writing slave list.
 213 */
 214struct bonding {
 215        struct   net_device *dev; /* first - useful for panic debug */
 216        struct   slave __rcu *curr_active_slave;
 217        struct   slave __rcu *current_arp_slave;
 218        struct   slave __rcu *primary_slave;
 219        struct   bond_up_slave __rcu *usable_slaves;
 220        struct   bond_up_slave __rcu *all_slaves;
 221        bool     force_primary;
 222        s32      slave_cnt; /* never change this value outside the attach/detach wrappers */
 223        int     (*recv_probe)(const struct sk_buff *, struct bonding *,
 224                              struct slave *);
 225        /* mode_lock is used for mode-specific locking needs, currently used by:
 226         * 3ad mode (4) - protect against running bond_3ad_unbind_slave() and
 227         *                bond_3ad_state_machine_handler() concurrently and also
 228         *                the access to the state machine shared variables.
 229         * TLB mode (5) - to sync the use and modifications of its hash table
 230         * ALB mode (6) - to sync the use and modifications of its hash table
 231         */
 232        spinlock_t mode_lock;
 233        spinlock_t stats_lock;
 234        u8       send_peer_notif;
 235        u8       igmp_retrans;
 236#ifdef CONFIG_PROC_FS
 237        struct   proc_dir_entry *proc_entry;
 238        char     proc_file_name[IFNAMSIZ];
 239#endif /* CONFIG_PROC_FS */
 240        struct   list_head bond_list;
 241        u32 __percpu *rr_tx_counter;
 242        struct   ad_bond_info ad_info;
 243        struct   alb_bond_info alb_info;
 244        struct   bond_params params;
 245        struct   workqueue_struct *wq;
 246        struct   delayed_work mii_work;
 247        struct   delayed_work arp_work;
 248        struct   delayed_work alb_work;
 249        struct   delayed_work ad_work;
 250        struct   delayed_work mcast_work;
 251        struct   delayed_work slave_arr_work;
 252#ifdef CONFIG_DEBUG_FS
 253        /* debugging support via debugfs */
 254        struct   dentry *debug_dir;
 255#endif /* CONFIG_DEBUG_FS */
 256        struct rtnl_link_stats64 bond_stats;
 257#ifdef CONFIG_XFRM_OFFLOAD
 258        struct list_head ipsec_list;
 259        /* protecting ipsec_list */
 260        spinlock_t ipsec_lock;
 261#endif /* CONFIG_XFRM_OFFLOAD */
 262        struct bpf_prog *xdp_prog;
 263};
 264
 265#define bond_slave_get_rcu(dev) \
 266        ((struct slave *) rcu_dereference(dev->rx_handler_data))
 267
 268#define bond_slave_get_rtnl(dev) \
 269        ((struct slave *) rtnl_dereference(dev->rx_handler_data))
 270
 271void bond_queue_slave_event(struct slave *slave);
 272void bond_lower_state_changed(struct slave *slave);
 273
 274struct bond_vlan_tag {
 275        __be16          vlan_proto;
 276        unsigned short  vlan_id;
 277};
 278
 279bool bond_sk_check(struct bonding *bond);
 280
 281/**
 282 * Returns NULL if the net_device does not belong to any of the bond's slaves
 283 *
 284 * Caller must hold bond lock for read
 285 */
 286static inline struct slave *bond_get_slave_by_dev(struct bonding *bond,
 287                                                  struct net_device *slave_dev)
 288{
 289        return netdev_lower_dev_get_private(bond->dev, slave_dev);
 290}
 291
 292static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
 293{
 294        return slave->bond;
 295}
 296
 297static inline bool bond_should_override_tx_queue(struct bonding *bond)
 298{
 299        return BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP ||
 300               BOND_MODE(bond) == BOND_MODE_ROUNDROBIN;
 301}
 302
 303static inline bool bond_is_lb(const struct bonding *bond)
 304{
 305        return BOND_MODE(bond) == BOND_MODE_TLB ||
 306               BOND_MODE(bond) == BOND_MODE_ALB;
 307}
 308
 309static inline bool bond_needs_speed_duplex(const struct bonding *bond)
 310{
 311        return BOND_MODE(bond) == BOND_MODE_8023AD || bond_is_lb(bond);
 312}
 313
 314static inline bool bond_is_nondyn_tlb(const struct bonding *bond)
 315{
 316        return (bond_is_lb(bond) && bond->params.tlb_dynamic_lb == 0);
 317}
 318
 319static inline bool bond_mode_can_use_xmit_hash(const struct bonding *bond)
 320{
 321        return (BOND_MODE(bond) == BOND_MODE_8023AD ||
 322                BOND_MODE(bond) == BOND_MODE_XOR ||
 323                BOND_MODE(bond) == BOND_MODE_TLB ||
 324                BOND_MODE(bond) == BOND_MODE_ALB);
 325}
 326
 327static inline bool bond_mode_uses_xmit_hash(const struct bonding *bond)
 328{
 329        return (BOND_MODE(bond) == BOND_MODE_8023AD ||
 330                BOND_MODE(bond) == BOND_MODE_XOR ||
 331                bond_is_nondyn_tlb(bond));
 332}
 333
 334static inline bool bond_mode_uses_arp(int mode)
 335{
 336        return mode != BOND_MODE_8023AD && mode != BOND_MODE_TLB &&
 337               mode != BOND_MODE_ALB;
 338}
 339
 340static inline bool bond_mode_uses_primary(int mode)
 341{
 342        return mode == BOND_MODE_ACTIVEBACKUP || mode == BOND_MODE_TLB ||
 343               mode == BOND_MODE_ALB;
 344}
 345
 346static inline bool bond_uses_primary(struct bonding *bond)
 347{
 348        return bond_mode_uses_primary(BOND_MODE(bond));
 349}
 350
 351static inline struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond)
 352{
 353        struct slave *slave = rcu_dereference_rtnl(bond->curr_active_slave);
 354
 355        return bond_uses_primary(bond) && slave ? slave->dev : NULL;
 356}
 357
 358static inline bool bond_slave_is_up(struct slave *slave)
 359{
 360        return netif_running(slave->dev) && netif_carrier_ok(slave->dev);
 361}
 362
 363static inline void bond_set_active_slave(struct slave *slave)
 364{
 365        if (slave->backup) {
 366                slave->backup = 0;
 367                bond_queue_slave_event(slave);
 368                bond_lower_state_changed(slave);
 369        }
 370}
 371
 372static inline void bond_set_backup_slave(struct slave *slave)
 373{
 374        if (!slave->backup) {
 375                slave->backup = 1;
 376                bond_queue_slave_event(slave);
 377                bond_lower_state_changed(slave);
 378        }
 379}
 380
 381static inline void bond_set_slave_state(struct slave *slave,
 382                                        int slave_state, bool notify)
 383{
 384        if (slave->backup == slave_state)
 385                return;
 386
 387        slave->backup = slave_state;
 388        if (notify) {
 389                bond_lower_state_changed(slave);
 390                bond_queue_slave_event(slave);
 391                slave->should_notify = 0;
 392        } else {
 393                if (slave->should_notify)
 394                        slave->should_notify = 0;
 395                else
 396                        slave->should_notify = 1;
 397        }
 398}
 399
 400static inline void bond_slave_state_change(struct bonding *bond)
 401{
 402        struct list_head *iter;
 403        struct slave *tmp;
 404
 405        bond_for_each_slave(bond, tmp, iter) {
 406                if (tmp->link == BOND_LINK_UP)
 407                        bond_set_active_slave(tmp);
 408                else if (tmp->link == BOND_LINK_DOWN)
 409                        bond_set_backup_slave(tmp);
 410        }
 411}
 412
 413static inline void bond_slave_state_notify(struct bonding *bond)
 414{
 415        struct list_head *iter;
 416        struct slave *tmp;
 417
 418        bond_for_each_slave(bond, tmp, iter) {
 419                if (tmp->should_notify) {
 420                        bond_lower_state_changed(tmp);
 421                        tmp->should_notify = 0;
 422                }
 423        }
 424}
 425
 426static inline int bond_slave_state(struct slave *slave)
 427{
 428        return slave->backup;
 429}
 430
 431static inline bool bond_is_active_slave(struct slave *slave)
 432{
 433        return !bond_slave_state(slave);
 434}
 435
 436static inline bool bond_slave_can_tx(struct slave *slave)
 437{
 438        return bond_slave_is_up(slave) && slave->link == BOND_LINK_UP &&
 439               bond_is_active_slave(slave);
 440}
 441
 442static inline bool bond_is_active_slave_dev(const struct net_device *slave_dev)
 443{
 444        struct slave *slave;
 445        bool active;
 446
 447        rcu_read_lock();
 448        slave = bond_slave_get_rcu(slave_dev);
 449        active = bond_is_active_slave(slave);
 450        rcu_read_unlock();
 451
 452        return active;
 453}
 454
 455static inline void bond_hw_addr_copy(u8 *dst, const u8 *src, unsigned int len)
 456{
 457        if (len == ETH_ALEN) {
 458                ether_addr_copy(dst, src);
 459                return;
 460        }
 461
 462        memcpy(dst, src, len);
 463}
 464
 465#define BOND_PRI_RESELECT_ALWAYS        0
 466#define BOND_PRI_RESELECT_BETTER        1
 467#define BOND_PRI_RESELECT_FAILURE       2
 468
 469#define BOND_FOM_NONE                   0
 470#define BOND_FOM_ACTIVE                 1
 471#define BOND_FOM_FOLLOW                 2
 472
 473#define BOND_ARP_TARGETS_ANY            0
 474#define BOND_ARP_TARGETS_ALL            1
 475
 476#define BOND_ARP_VALIDATE_NONE          0
 477#define BOND_ARP_VALIDATE_ACTIVE        (1 << BOND_STATE_ACTIVE)
 478#define BOND_ARP_VALIDATE_BACKUP        (1 << BOND_STATE_BACKUP)
 479#define BOND_ARP_VALIDATE_ALL           (BOND_ARP_VALIDATE_ACTIVE | \
 480                                         BOND_ARP_VALIDATE_BACKUP)
 481#define BOND_ARP_FILTER                 (BOND_ARP_VALIDATE_ALL + 1)
 482#define BOND_ARP_FILTER_ACTIVE          (BOND_ARP_VALIDATE_ACTIVE | \
 483                                         BOND_ARP_FILTER)
 484#define BOND_ARP_FILTER_BACKUP          (BOND_ARP_VALIDATE_BACKUP | \
 485                                         BOND_ARP_FILTER)
 486
 487#define BOND_SLAVE_NOTIFY_NOW           true
 488#define BOND_SLAVE_NOTIFY_LATER         false
 489
 490static inline int slave_do_arp_validate(struct bonding *bond,
 491                                        struct slave *slave)
 492{
 493        return bond->params.arp_validate & (1 << bond_slave_state(slave));
 494}
 495
 496static inline int slave_do_arp_validate_only(struct bonding *bond)
 497{
 498        return bond->params.arp_validate & BOND_ARP_FILTER;
 499}
 500
 501static inline int bond_is_ip_target_ok(__be32 addr)
 502{
 503        return !ipv4_is_lbcast(addr) && !ipv4_is_zeronet(addr);
 504}
 505
 506static inline int bond_is_ip6_target_ok(struct in6_addr *addr)
 507{
 508        return !ipv6_addr_any(addr) &&
 509               !ipv6_addr_loopback(addr) &&
 510               !ipv6_addr_is_multicast(addr);
 511}
 512
 513/* Get the oldest arp which we've received on this slave for bond's
 514 * arp_targets.
 515 */
 516static inline unsigned long slave_oldest_target_arp_rx(struct bonding *bond,
 517                                                       struct slave *slave)
 518{
 519        int i = 1;
 520        unsigned long ret = slave->target_last_arp_rx[0];
 521
 522        for (; (i < BOND_MAX_ARP_TARGETS) && bond->params.arp_targets[i]; i++)
 523                if (time_before(slave->target_last_arp_rx[i], ret))
 524                        ret = slave->target_last_arp_rx[i];
 525
 526        return ret;
 527}
 528
 529static inline unsigned long slave_last_rx(struct bonding *bond,
 530                                        struct slave *slave)
 531{
 532        if (bond->params.arp_all_targets == BOND_ARP_TARGETS_ALL)
 533                return slave_oldest_target_arp_rx(bond, slave);
 534
 535        return slave->last_rx;
 536}
 537
 538#ifdef CONFIG_NET_POLL_CONTROLLER
 539static inline netdev_tx_t bond_netpoll_send_skb(const struct slave *slave,
 540                                         struct sk_buff *skb)
 541{
 542        return netpoll_send_skb(slave->np, skb);
 543}
 544#else
 545static inline netdev_tx_t bond_netpoll_send_skb(const struct slave *slave,
 546                                         struct sk_buff *skb)
 547{
 548        BUG();
 549        return NETDEV_TX_OK;
 550}
 551#endif
 552
 553static inline void bond_set_slave_inactive_flags(struct slave *slave,
 554                                                 bool notify)
 555{
 556        if (!bond_is_lb(slave->bond))
 557                bond_set_slave_state(slave, BOND_STATE_BACKUP, notify);
 558        if (!slave->bond->params.all_slaves_active)
 559                slave->inactive = 1;
 560}
 561
 562static inline void bond_set_slave_active_flags(struct slave *slave,
 563                                               bool notify)
 564{
 565        bond_set_slave_state(slave, BOND_STATE_ACTIVE, notify);
 566        slave->inactive = 0;
 567}
 568
 569static inline bool bond_is_slave_inactive(struct slave *slave)
 570{
 571        return slave->inactive;
 572}
 573
 574static inline void bond_propose_link_state(struct slave *slave, int state)
 575{
 576        slave->link_new_state = state;
 577}
 578
 579static inline void bond_commit_link_state(struct slave *slave, bool notify)
 580{
 581        if (slave->link_new_state == BOND_LINK_NOCHANGE)
 582                return;
 583
 584        slave->link = slave->link_new_state;
 585        if (notify) {
 586                bond_queue_slave_event(slave);
 587                bond_lower_state_changed(slave);
 588                slave->should_notify_link = 0;
 589        } else {
 590                if (slave->should_notify_link)
 591                        slave->should_notify_link = 0;
 592                else
 593                        slave->should_notify_link = 1;
 594        }
 595}
 596
 597static inline void bond_set_slave_link_state(struct slave *slave, int state,
 598                                             bool notify)
 599{
 600        bond_propose_link_state(slave, state);
 601        bond_commit_link_state(slave, notify);
 602}
 603
 604static inline void bond_slave_link_notify(struct bonding *bond)
 605{
 606        struct list_head *iter;
 607        struct slave *tmp;
 608
 609        bond_for_each_slave(bond, tmp, iter) {
 610                if (tmp->should_notify_link) {
 611                        bond_queue_slave_event(tmp);
 612                        bond_lower_state_changed(tmp);
 613                        tmp->should_notify_link = 0;
 614                }
 615        }
 616}
 617
 618static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local)
 619{
 620        struct in_device *in_dev;
 621        __be32 addr = 0;
 622
 623        rcu_read_lock();
 624        in_dev = __in_dev_get_rcu(dev);
 625
 626        if (in_dev)
 627                addr = inet_confirm_addr(dev_net(dev), in_dev, dst, local,
 628                                         RT_SCOPE_HOST);
 629        rcu_read_unlock();
 630        return addr;
 631}
 632
 633struct bond_net {
 634        struct net              *net;   /* Associated network namespace */
 635        struct list_head        dev_list;
 636#ifdef CONFIG_PROC_FS
 637        struct proc_dir_entry   *proc_dir;
 638#endif
 639        struct class_attribute  class_attr_bonding_masters;
 640};
 641
 642int bond_rcv_validate(const struct sk_buff *skb, struct bonding *bond, struct slave *slave);
 643netdev_tx_t bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
 644int bond_create(struct net *net, const char *name);
 645int bond_create_sysfs(struct bond_net *net);
 646void bond_destroy_sysfs(struct bond_net *net);
 647void bond_prepare_sysfs_group(struct bonding *bond);
 648int bond_sysfs_slave_add(struct slave *slave);
 649void bond_sysfs_slave_del(struct slave *slave);
 650int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
 651                 struct netlink_ext_ack *extack);
 652int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
 653u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb);
 654int bond_set_carrier(struct bonding *bond);
 655void bond_select_active_slave(struct bonding *bond);
 656void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
 657void bond_create_debugfs(void);
 658void bond_destroy_debugfs(void);
 659void bond_debug_register(struct bonding *bond);
 660void bond_debug_unregister(struct bonding *bond);
 661void bond_debug_reregister(struct bonding *bond);
 662const char *bond_mode_name(int mode);
 663void bond_setup(struct net_device *bond_dev);
 664unsigned int bond_get_num_tx_queues(void);
 665int bond_netlink_init(void);
 666void bond_netlink_fini(void);
 667struct net_device *bond_option_active_slave_get_rcu(struct bonding *bond);
 668const char *bond_slave_link_status(s8 link);
 669struct bond_vlan_tag *bond_verify_device_path(struct net_device *start_dev,
 670                                              struct net_device *end_dev,
 671                                              int level);
 672int bond_update_slave_arr(struct bonding *bond, struct slave *skipslave);
 673void bond_slave_arr_work_rearm(struct bonding *bond, unsigned long delay);
 674void bond_work_init_all(struct bonding *bond);
 675
 676#ifdef CONFIG_PROC_FS
 677void bond_create_proc_entry(struct bonding *bond);
 678void bond_remove_proc_entry(struct bonding *bond);
 679void bond_create_proc_dir(struct bond_net *bn);
 680void bond_destroy_proc_dir(struct bond_net *bn);
 681#else
 682static inline void bond_create_proc_entry(struct bonding *bond)
 683{
 684}
 685
 686static inline void bond_remove_proc_entry(struct bonding *bond)
 687{
 688}
 689
 690static inline void bond_create_proc_dir(struct bond_net *bn)
 691{
 692}
 693
 694static inline void bond_destroy_proc_dir(struct bond_net *bn)
 695{
 696}
 697#endif
 698
 699static inline struct slave *bond_slave_has_mac(struct bonding *bond,
 700                                               const u8 *mac)
 701{
 702        struct list_head *iter;
 703        struct slave *tmp;
 704
 705        bond_for_each_slave(bond, tmp, iter)
 706                if (ether_addr_equal_64bits(mac, tmp->dev->dev_addr))
 707                        return tmp;
 708
 709        return NULL;
 710}
 711
 712/* Caller must hold rcu_read_lock() for read */
 713static inline bool bond_slave_has_mac_rx(struct bonding *bond, const u8 *mac)
 714{
 715        struct list_head *iter;
 716        struct slave *tmp;
 717        struct netdev_hw_addr *ha;
 718
 719        bond_for_each_slave_rcu(bond, tmp, iter)
 720                if (ether_addr_equal_64bits(mac, tmp->dev->dev_addr))
 721                        return true;
 722
 723        if (netdev_uc_empty(bond->dev))
 724                return false;
 725
 726        netdev_for_each_uc_addr(ha, bond->dev)
 727                if (ether_addr_equal_64bits(mac, ha->addr))
 728                        return true;
 729
 730        return false;
 731}
 732
 733/* Check if the ip is present in arp ip list, or first free slot if ip == 0
 734 * Returns -1 if not found, index if found
 735 */
 736static inline int bond_get_targets_ip(__be32 *targets, __be32 ip)
 737{
 738        int i;
 739
 740        for (i = 0; i < BOND_MAX_ARP_TARGETS; i++)
 741                if (targets[i] == ip)
 742                        return i;
 743                else if (targets[i] == 0)
 744                        break;
 745
 746        return -1;
 747}
 748
 749static inline int bond_get_targets_ip6(struct in6_addr *targets, struct in6_addr *ip)
 750{
 751        int i;
 752
 753        for (i = 0; i < BOND_MAX_NS_TARGETS; i++)
 754                if (ipv6_addr_equal(&targets[i], ip))
 755                        return i;
 756                else if (ipv6_addr_any(&targets[i]))
 757                        break;
 758
 759        return -1;
 760}
 761
 762/* exported from bond_main.c */
 763extern unsigned int bond_net_id;
 764
 765/* exported from bond_netlink.c */
 766extern struct rtnl_link_ops bond_link_ops;
 767
 768/* exported from bond_sysfs_slave.c */
 769extern const struct sysfs_ops slave_sysfs_ops;
 770
 771static inline netdev_tx_t bond_tx_drop(struct net_device *dev, struct sk_buff *skb)
 772{
 773        dev_core_stats_tx_dropped_inc(dev);
 774        dev_kfree_skb_any(skb);
 775        return NET_XMIT_DROP;
 776}
 777
 778#endif /* _NET_BONDING_H */
 779