17 Jan, 2015

1 commit

  • In addition to the problem Jeff Layton reported, I looked at the code
    and reproduced the same warning by subscribing and removing the genl
    family with a socket still open. This is a fairly tricky race which
    originates in the fact that generic netlink allows the family to go
    away while sockets are still open - unlike regular netlink which has
    a module refcount for every open socket so in general this cannot be
    triggered.

    Trying to resolve this issue by the obvious locking isn't possible as
    it will result in deadlocks between unregistration and group unbind
    notification (which incidentally lockdep doesn't find due to the home
    grown locking in the netlink table.)

    To really resolve this, introduce a "closing socket" reference counter
    (for generic netlink only, as it's the only affected family) in the
    core netlink code and use that in generic netlink to wait for all the
    sockets that are being closed at the same time as a generic netlink
    family is removed.

    This fixes the race that when a socket is closed, it will should call
    the unbind, but if the family is removed at the same time the unbind
    will not find it, leading to the warning. The real problem though is
    that in this case the unbind could actually find a new family that is
    registered to have a multicast group with the same ID, and call its
    mcast_unbind() leading to confusing.

    Also remove the warning since it would still trigger, but is now no
    longer a problem.

    This also moves the code in af_netlink.c to before unreferencing the
    module to avoid having the same problem in the normal non-genl case.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

13 Oct, 2012

1 commit


24 Jul, 2012

1 commit


30 May, 2012

1 commit

  • Generic netlink searches for -type- formatted aliases when requesting a module to
    fulfill a protocol request (i.e. net-pf-16-proto-16-type-, where x is a type
    value). However generic netlink protocols have no well defined type numbers,
    they have string names. Modify genl_ctrl_getfamily to request an alias in the
    format net-pf-16-proto-16-family- instead, where x is a generic string, and
    add a macro that builds on the previously added MODULE_ALIAS_NET_PF_PROTO_NAME
    macro to allow modules to specifify those generic strings.

    Note, l2tp previously hacked together an net-pf-16-proto-16-type-l2tp alias
    using the MODULE_ALIAS macro, with these updates we can convert that to use the
    PROTO_NAME macro.

    Signed-off-by: Neil Horman
    CC: Eric Dumazet
    CC: James Chapman
    CC: David Miller
    Signed-off-by: David S. Miller

    Neil Horman
     

04 Dec, 2011

2 commits


04 Apr, 2010

1 commit


31 Jan, 2009

1 commit


19 Jul, 2007

1 commit


07 Dec, 2006

1 commit

  • This patch moves command capabilities to command flags. Other than
    being cleaner, saves several bytes.
    We increment the nlctrl version so as to signal to user space that
    to not expect the attributes. We will try to be careful
    not to do this too often ;->

    Signed-off-by: Jamal Hadi Salim
    Signed-off-by: David S. Miller

    Jamal Hadi Salim
     

23 Sep, 2006

1 commit

  • Additionaly exports the following information when providing
    the list of registered generic netlink families:
    - protocol version
    - header size
    - maximum number of attributes
    - list of available operations including
    - id
    - flags
    - avaiability of policy and doit/dumpit function

    libnl HEAD provides a utility to read this new information:

    0x0010 nlctrl version 1
    hdrsize 0 maxattr 6
    op GETFAMILY (0x03) [POLICY,DOIT,DUMPIT]
    0x0011 NLBL_MGMT version 1
    hdrsize 0 maxattr 0
    op unknown (0x02) [DOIT]
    op unknown (0x03) [DOIT]
    ....

    Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf
     

10 Nov, 2005

1 commit

  • The generic netlink family builds on top of netlink and provides
    simplifies access for the less demanding netlink users. It solves
    the problem of protocol numbers running out by introducing a so
    called controller taking care of id management and name resolving.

    Generic netlink modules register themself after filling out their
    id card (struct genl_family), after successful registration the
    modules are able to register callbacks to command numbers by
    filling out a struct genl_ops and calling genl_register_op(). The
    registered callbacks are invoked with attributes parsed making
    life of simple modules a lot easier.

    Although generic netlink modules can request static identifiers,
    it is recommended to use GENL_ID_GENERATE and to let the controller
    assign a unique identifier to the module. Userspace applications
    will then ask the controller and lookup the idenfier by the module
    name.

    Due to the current multicast implementation of netlink, the number
    of generic netlink modules is restricted to 1024 to avoid wasting
    memory for the per socket multiacst subscription bitmask.

    Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf