11 Oct, 2007

40 commits

  • This patch makes most of the generic device layer network
    namespace safe. This patch makes dev_base_head a
    network namespace variable, and then it picks up
    a few associated variables. The functions:
    dev_getbyhwaddr
    dev_getfirsthwbytype
    dev_get_by_flags
    dev_get_by_name
    __dev_get_by_name
    dev_get_by_index
    __dev_get_by_index
    dev_ioctl
    dev_ethtool
    dev_load
    wireless_process_ioctl

    were modified to take a network namespace argument, and
    deal with it.

    vlan_ioctl_set and brioctl_set were modified so their
    hooks will receive a network namespace argument.

    So basically anthing in the core of the network stack that was
    affected to by the change of dev_base was modified to handle
    multiple network namespaces. The rest of the network stack was
    simply modified to explicitly use &init_net the initial network
    namespace. This can be fixed when those components of the network
    stack are modified to handle multiple network namespaces.

    For now the ifindex generator is left global.

    Fundametally ifindex numbers are per namespace, or else
    we will have corner case problems with migration when
    we get that far.

    At the same time there are assumptions in the network stack
    that the ifindex of a network device won't change. Making
    the ifindex number global seems a good compromise until
    the network stack can cope with ifindex changes when
    you change namespaces, and the like.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • Each netlink socket will live in exactly one network namespace,
    this includes the controlling kernel sockets.

    This patch updates all of the existing netlink protocols
    to only support the initial network namespace. Request
    by clients in other namespaces will get -ECONREFUSED.
    As they would if the kernel did not have the support for
    that netlink protocol compiled in.

    As each netlink protocol is updated to be multiple network
    namespace safe it can register multiple kernel sockets
    to acquire a presence in the rest of the network namespaces.

    The implementation in af_netlink is a simple filter implementation
    at hash table insertion and hash table look up time.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • Every user of the network device notifiers is either a protocol
    stack or a pseudo device. If a protocol stack that does not have
    support for multiple network namespaces receives an event for a
    device that is not in the initial network namespace it quite possibly
    can get confused and do the wrong thing.

    To avoid problems until all of the protocol stacks are converted
    this patch modifies all netdev event handlers to ignore events on
    devices that are not in the initial network namespace.

    As the rest of the code is made network namespace aware these
    checks can be removed.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This patch modifies every packet receive function
    registered with dev_add_pack() to drop packets if they
    are not from the initial network namespace.

    This should ensure that the various network stacks do
    not receive packets in a anything but the initial network
    namespace until the code has been converted and is ready
    for them.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • Except for carefully selected pseudo devices all network
    interfaces should start out in the initial network namespace.
    Ultimately it will be register_netdev that examines what
    dev->nd_net is set to and places a device in a network namespace.

    This patch modifies alloc_netdev to initialize the network
    namespace a device is in with the initial network namespace.
    This gets it right for the vast majority of devices so their
    drivers need not be modified and for those few pseudo devices
    that need something different they can change this parameter
    before calling register_netdevice.

    The network namespace parameter on a network device is not
    reference counted as the devices are inside of a network namespace
    and cannot remain in that namespace past the lifetime of the
    network namespace.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This patch passes in the namespace a new socket should be created in
    and has the socket code do the appropriate reference counting. By
    virtue of this all socket create methods are touched. In addition
    the socket create methods are modified so that they will fail if
    you attempt to create a socket in a non-default network namespace.

    Failing if we attempt to create a socket outside of the default
    network namespace ensures that as we incrementally make the network stack
    network namespace aware we will not export functionality that someone
    has not audited and made certain is network namespace safe.
    Allowing us to partially enable network namespaces before all of the
    exotic protocols are supported.

    Any protocol layers I have missed will fail to compile because I now
    pass an extra parameter into the socket creation code.

    [ Integrated AF_IUCV build fixes from Andrew Morton... -DaveM ]

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This patch makes /proc/net per network namespace. It modifies the global
    variables proc_net and proc_net_stat to be per network namespace.
    The proc_net file helpers are modified to take a network namespace argument,
    and all of their callers are fixed to pass &init_net for that argument.
    This ensures that all of the /proc/net files are only visible and
    usable in the initial network namespace until the code behind them
    has been updated to be handle multiple network namespaces.

    Making /proc/net per namespace is necessary as at least some files
    in /proc/net depend upon the set of network devices which is per
    network namespace, and even more files in /proc/net have contents
    that are relevant to a single network namespace.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • Sockets need to get a reference to their network namespace,
    or possibly a simple hold if someone registers on the network
    namespace notifier and will free the sockets when the namespace
    is going to be destroyed.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • Please note that network devices do not increase the count
    count on the network namespace. The are inside the network
    namespace and so the network namespace tag is in the nature
    of a back pointer and so getting and putting the network namespace
    is unnecessary.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This is the network namespace from which all which all sockets
    and anything else under user control ultimately get their network
    namespace parameters.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This is the basic infrastructure needed to support network
    namespaces. This infrastructure is:
    - Registration functions to support initializing per network
    namespace data when a network namespaces is created or destroyed.

    - struct net. The network namespace data structure.
    This structure will grow as variables are made per network
    namespace but this is the minimal starting point.

    - Functions to grab a reference to the network namespace.
    I provide both get/put functions that keep a network namespace
    from being freed. And hold/release functions serve as weak references
    and will warn if their count is not zero when the data structure
    is freed. Useful for dealing with more complicated data structures
    like the ipv4 route cache.

    - A list of all of the network namespaces so we can iterate over them.

    - A slab for the network namespace data structure allowing leaks
    to be spotted.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • The current implementation of dev_ifname makes maintenance difficult
    because updates to the implementation of the ioctl have to made in two
    places. So this patch updates dev_ifname32 to do a classic 32/64
    structure conversion and call sys_ioctl like the rest of the
    compat calls do.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This slightly improves code safety and clarity.

    Later network namespace patches touch this code so this is a
    preliminary cleanup.

    Signed-off-by: Eric W. Biederman
    Signed-off-by: David S. Miller

    Eric W. Biederman
     
  • This patch modifies the current ipsec audit layer
    by breaking it up into purpose driven audit calls.

    So far, the only audit calls made are when add/delete
    an SA/policy. It had been discussed to give each
    key manager it's own calls to do this, but I found
    there to be much redundnacy since they did the exact
    same things, except for how they got auid and sid, so I
    combined them. The below audit calls can be made by any
    key manager. Hopefully, this is ok.

    Signed-off-by: Joy Latten
    Signed-off-by: David S. Miller

    Joy Latten
     
  • The type of owner in sock_lock_t is currently (struct sock_iocb *),
    presumably for historical reasons. It is never used as this type, only
    tested as NULL or set to (void *)1. For clarity, this changes it to type
    int, and renames to owned, to avoid any possible type casting errors.

    Signed-off-by: John Heffner
    Signed-off-by: David S. Miller

    John Heffner
     
  • Changes asserts in sunrpc to use sock_owned_by_user() macro instead of
    referencing sock_lock.owner directly.

    Signed-off-by: John Heffner
    Signed-off-by: David S. Miller

    John Heffner
     
  • Removed sparse warnings from tg3 driver. The new logic seems fine (I
    don't immediately see where we are running over values for any of the
    variables that need to be saved).

    This patch compiles fine and I'm currently using a tg3 with the patched
    driver to post this patch as a basic proof of concept.

    Signed-off-by: Andy Gospodarek
    Signed-off-by: David S. Miller

    Andy Gospodarek
     
  • Andi mentioned he did something like this already, but never submitted
    it.

    The dhcp client application uses AF_PACKET with a packet filter to
    receive data. The application doesn't even use timestamps, but because
    the AF_PACKET API has timestamps, they get turned on globally which
    causes an expensive time of day lookup for every packet received on
    any system that uses the standard DHCP client.

    The fix is to not enable the timestamp (but use if if available).
    This causes the time lookup to only occur on those packets that are
    destined for the AF_PACKET socket. The timestamping occurs after
    packet filtering so all packets dropped by filtering to not cause a
    clock call.

    The one downside of this a a few microseconds additional delay added
    from the normal timestamping location (netif_rx) until the receive
    callback in AF_PACKET. But since the offset is fairly consistent it
    should not upset applications that do want really use timestamps, like
    wireshark.

    Signed-off-by: Stephen Hemminger
    Signed-off-by: David S. Miller

    Stephen Hemminger
     
  • This trivial patch removes the unneeded pointer newdp, which is never used.

    Signed-off-by: Micah Gruber
    Signed-off-by: David S. Miller

    Micah Gruber
     
  • This trivial patch removes the unneeded pointer iph, which is never used.

    Signed-off-by: Micah Gruber
    Signed-off-by: David S. Miller

    Micah Gruber
     
  • The sta_info.assoc_ap value is used as a flag, move it
    into flags.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • This removes some definitions that are used only within ioctls
    that will never make it into mainline.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • When I changed the code there I forgot to mention what happens
    with multicast frames in a regular BSS and keep wondering myself
    if the code is correct. Add appropriate comments.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • In STA mode, the AP will echo our traffic. This includes multicast
    traffic.

    Receiving these frames confuses some protocols and applications,
    notably IPv6 Duplicate Address Detection.

    Signed-off-by: John W. Linville
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    John W. Linville
     
  • This cleans up some whitespace to make the mac80211
    version in mainline diverge less from wireless-dev.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • It looks like in commit 28487a90 the condition was unintentionally
    negated by moving some code, fix it.

    Signed-off-by: Johannes Berg
    Cc: Daniel Drake
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • The current version of wireless statistics contains a bug in the averaging
    that makes the numbers be too sticky and not react to small changes. This
    patch removes all averaging.

    Signed-off-by: Larry Finger
    Signed-off-by: Jiri Benc
    Signed-off-by: John W. Linville
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Larry Finger
     
  • Add a new file 'ifindex' to each key's debugfs dir to
    allow finding which interface the key was configured on.
    This isn't done as a symlink because of possible netdev
    name changes.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • This moves all the key handling code out from ieee80211_ioctl.c
    into key.c and also does the following changes including documentation
    updates in mac80211.h:

    1) Turn off hardware acceleration for keys when the interface
    is down. This is necessary because otherwise monitor
    interfaces could be decrypting frames for other interfaces
    that are down at the moment. Also, it should go some way
    towards better suspend/resume support, in any case the
    routines used here could be used for that as well.
    Additionally, this makes the driver interface nicer, keys
    for a specific local MAC address are only ever present
    while an interface with that MAC address is enabled.

    2) Change driver set_key() callback interface to allow only
    return values of -ENOSPC, -EOPNOTSUPP and 0, warn on all
    other return values. This allows debugging the stack when
    a driver notices it's handed a key while it is down.

    3) Invert the flag meaning to KEY_FLAG_UPLOADED_TO_HARDWARE.

    4) Remove REMOVE_ALL_KEYS command as it isn't used nor do we
    want to use it, we'll use DISABLE_KEY for each key. It is
    hard to use REMOVE_ALL_KEYS because we can handle multiple
    virtual interfaces with different key configuration, so we'd
    have to keep track of a lot of state for this and that isn't
    worth it.

    5) Warn when disabling a key fails, it musn't.

    6) Remove IEEE80211_HW_NO_TKIP_WMM_HWACCEL in favour of per-key
    IEEE80211_KEY_FLAG_WMM_STA to let driver sort it out itself.

    7) Tell driver that a (non-WEP) key is used only for transmission
    by using an all-zeroes station MAC address when configuring.

    8) Change the set_key() callback to have access to the local MAC
    address the key is being added for.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Remove adding a fake key with a NONE key algorithm for each
    associated STA. If we have hardware with such TX filtering
    we should probably extend the sta_table_notification()
    callback with the sta information instead; the fact that
    it's treated as a key for some atheros hardware shouldn't
    bother the stack.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Remove the default_wep_only stuff, this wasn't really done well
    and no current driver actually cares.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • they aren't really refcounted anyway

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • This patch embeds the struct ieee80211_key_conf into struct ieee80211_key
    and thus avoids allocations and having data present twice.

    This required some more changes:
    1) The removal of the IEEE80211_KEY_DEFAULT_TX_KEY key flag.
    This flag isn't used by drivers nor should it be since
    we have a set_key_idx() callback. Maybe that callback needs
    to be extended to include the key conf, but only a driver that
    requires it will tell.
    2) The removal of the IEEE80211_KEY_DEFAULT_WEP_ONLY key flag.
    This flag is global, so it shouldn't be passed in the key
    conf structure. Pass it to the function instead.

    Also, this patch removes the AID parameter to the set_key() callback
    because it is currently unused and the hardware currently cannot know
    about the AID anyway. I suspect this was used with some hardware that
    actually selected the AID itself, but that functionality was removed.

    Additionally, I've removed the ALG_NULL key algorithm since we have
    ALG_NONE.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • mac80211, remove bitfields from struct ieee80211_sub_if_data

    Signed-off-by: Jiri Slaby
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Jiri Slaby
     
  • mac80211, remove bitfields from struct ieee80211_if_sta

    Signed-off-by: Jiri Slaby
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Jiri Slaby
     
  • mac80211, remove bitfields from struct ieee80211_txrx_data

    Signed-off-by: Jiri Slaby
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Jiri Slaby
     
  • remove bitfields from struct ieee80211_tx_packet_data

    [Johannes: completely clear flags in ieee80211_remove_tx_extra]

    Signed-off-by: Jiri Slaby
    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Jiri Slaby
     
  • The transmit code needs to set the addresses depending on the
    interface type, a likely() for AP/VLAN is quite wrong since
    most people will be using STA; convert to a switch statement
    to make it look nicer.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Create a new file event.c that will contain code to send mac/mlme
    events to userspace. For now put the Michael MIC failure condition
    into it and remove sending of that condition via the management
    interface, hostapd interestingly doesn't do anything when it gets
    such a packet besides printing a message, it reacts only on the
    private iwevent.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • The key_mgmt variable for STA interfaces doesn't seem well-defined
    nor do we actually use the values other than "NONE", so change it to
    be named better.

    Signed-off-by: Johannes Berg
    Acked-by: Michael Wu
    Signed-off-by: John W. Linville
    Signed-off-by: David S. Miller

    Johannes Berg