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