• Florian Westphal's avatar
    netfilter: extensions: introduce extension genid count · c56716c6
    Florian Westphal authored
    Multiple netfilter extensions store pointers to external data
    in their extension area struct.
    
    Examples:
    1. Timeout policies
    2. Connection tracking helpers.
    
    No references are taken for these.
    
    When a helper or timeout policy is removed, the conntrack table gets
    traversed and affected extensions are cleared.
    
    Conntrack entries not yet in the hashtable are referenced via a special
    list, the unconfirmed list.
    
    On removal of a policy or connection tracking helper, the unconfirmed
    list gets traversed an all entries are marked as dying, this prevents
    them from getting committed to the table at insertion time: core checks
    for dying bit, if set, the conntrack entry gets destroyed at confirm
    time.
    
    The disadvantage is that each new conntrack has to be added to the percpu
    unconfirmed list, and each insertion needs to remove it from this list.
    The list is only ever needed when a policy or helper is removed -- a rare
    occurrence.
    
    Add a generation ID count: Instead of adding to the list and then
    traversing that list on policy/helper removal, increment a counter
    that is stored in the extension area.
    
    For unconfirmed conntracks, the extension has the genid valid at ct
    allocation time.
    
    Removal of a helper/policy etc. increments the counter.
    At confirmation time, validate that ext->genid == global_id.
    
    If the stored number is not the same, do not allow the conntrack
    insertion, just like as if a confirmed-list traversal would have flagged
    the entry as dying.
    
    After insertion, the genid is no longer relevant (conntrack entries
    are now reachable via the conntrack table iterators and is set to 0.
    
    This allows removal of the percpu unconfirmed list.
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    c56716c6
nf_conntrack_extend.c 4.41 KB