1. 23 1月, 2014 1 次提交
    • N
      bonding: add infrastructure for an option API · 09117362
      Nikolay Aleksandrov 提交于
      This patch adds the necessary basic infrastructure to support
      centralized and unified option manipulation API for the bonding. The new
      structure bond_option will be used to describe each option with its
      dependencies on modes which will be checked automatically thus removing a
      lot of duplicated code. Also automatic range checking is added for
      some options. Currently the option setting function requires RTNL to
      be acquired prior to calling it, since many options already rely on RTNL
      it seemed like the best choice to protect all against common race
      conditions.
      In order to add an option the following steps need to be done:
      1. Add an entry BOND_OPT_<option> to bond_options.h so it gets a unique id
         and a bit corresponding to the id
      2. Add a bond_option entry to the bond_opts[] array in bond_options.c which
         describes the option, its dependencies and its manipulation function
      3. Add code to export the option through sysfs and/or as a module parameter
         (the sysfs export will be made automatically in the future)
      
      The options can have different flags set, currently the following are
      supported:
      BOND_OPTFLAG_NOSLAVES - require that the bond device has no slaves prior
                              to setting the option
      BOND_OPTFLAG_IFDOWN - require that the bond device is down prior to
                            setting the option
      BOND_OPTFLAG_RAWVAL - don't parse the value but return it raw for the
                            option to parse
      
      There's a new value structure to describe different types of values
      which can have the following flags:
      BOND_VALFLAG_DEFAULT - marks the default option (permanent string alias
                             to this option is "default")
      BOND_VALFLAG_MIN - the minimum value that this option can have
      BOND_VALFLAG_MAX - the maximum value that this option can have
      
      An example would be nice here, so if we have an option which can have
      the values "off"(2), "special"(4, default) and supports a range, say
      16 - 32, it should be defined as follows:
      "off", 2,
      "special", 4, BOND_VALFLAG_DEFAULT,
      "rangemin", 16, BOND_VALFLAG_MIN,
      "rangemax", 32, BOND_VALFLAG_MAX
      So we have the valid intervals: [2, 2], [4, 4], [16, 32]
      Also the valid strings: "off" = 2, "special" and "default" = 4
                              "rangemin" = 16, "rangemax" = 32
      
      BOND_VALFLAG_(MIN|MAX) can be used to specify a valid range for an
      option, if MIN is omitted then 0 is considered as a minimum. If an
      exact match is found in the values[] table it will be returned,
      otherwise the range is tried (if available).
      
      The option parameter passing is done by using a special structure called
      bond_opt_value which can take either a string or a value to parse. One
      of the bond_opt_init(val|str) macros should be used depending on which
      one does the user want to parse (string or value). Then a call to
      __bond_opt_set should be done under RTNL.
      Signed-off-by: NNikolay Aleksandrov <nikolay@redhat.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      09117362