02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

01 Aug, 2017

1 commit

  • Add fib expression support for netdev family. Like inet family, netdev
    delegates the actual decision to the corresponding backend, either ipv4
    or ipv6.

    This allows to perform very early reverse path filtering, among other
    things.

    You can find more information about fib expression in the f6d0cbcf09c5
    ("") commit message.

    Signed-off-by: Pablo M. Bermudo Garay
    Signed-off-by: Pablo Neira Ayuso

    Pablo M. Bermudo Garay
     

20 Jun, 2017

1 commit


08 Feb, 2017

1 commit

  • This patch adds a new bitmap set type. This bitmap uses two bits to
    represent one element. These two bits determine the element state in the
    current and the future generation that fits into the nf_tables commit
    protocol. When dumping elements back to userspace, the two bits are
    expanded into a struct nft_set_ext object.

    If no NFTA_SET_DESC_SIZE is specified, the existing automatic set
    backend selection prefers bitmap over hash in case of keys whose size is

    Pablo Neira Ayuso
     

03 Jan, 2017

2 commits

  • udplite nat was copied from udp nat, they are virtually 100% identical.
    Not really surprising given udplite is just udp with partial csum coverage.

    old:
    text data bss dec hex filename
    11606 1457 210 13273 33d9 nf_nat.ko
    330 0 2 332 14c nf_nat_proto_udp.o
    276 0 2 278 116 nf_nat_proto_udplite.o
    new:
    text data bss dec hex filename
    11598 1457 210 13265 33d1 nf_nat.ko
    640 0 4 644 284 nf_nat_proto_udp.o

    Signed-off-by: Florian Westphal
    Signed-off-by: Pablo Neira Ayuso

    Florian Westphal
     
  • udplite was copied from udp, they are virtually 100% identical.

    This adds udplite tracker to udp instead, removes udplite module,
    and then makes the udplite tracker builtin.

    udplite will then simply re-use udp timeout settings.
    It makes little sense to add separate sysctls, nowadays we have
    fine-grained timeout policy support via the CT target.

    old:
    text data bss dec hex filename
    1633 672 0 2305 901 nf_conntrack_proto_udp.o
    1756 672 0 2428 97c nf_conntrack_proto_udplite.o
    69526 17937 268 87731 156b3 nf_conntrack.ko

    new:
    text data bss dec hex filename
    2442 1184 0 3626 e2a nf_conntrack_proto_udp.o
    68565 17721 268 86554 1521a nf_conntrack.ko

    Signed-off-by: Florian Westphal
    Signed-off-by: Pablo Neira Ayuso

    Florian Westphal
     

07 Dec, 2016

1 commit


05 Dec, 2016

6 commits

  • CONFIG_NF_CT_PROTO_UDPLITE is no more a tristate. When set to y,
    connection tracking support for UDPlite protocol is built-in into
    nf_conntrack.ko.

    footprint test:
    $ ls -l net/netfilter/nf_conntrack{_proto_udplite,}.ko \
    net/ipv4/netfilter/nf_conntrack_ipv4.ko \
    net/ipv6/netfilter/nf_conntrack_ipv6.ko

    (builtin)|| udplite| ipv4 | ipv6 |nf_conntrack
    ---------++--------+--------+--------+--------------
    none || 432538 | 828755 | 828676 | 6141434
    UDPlite || - | 829649 | 829362 | 6498204

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     
  • CONFIG_NF_CT_PROTO_SCTP is no more a tristate. When set to y, connection
    tracking support for SCTP protocol is built-in into nf_conntrack.ko.

    footprint test:
    $ ls -l net/netfilter/nf_conntrack{_proto_sctp,}.ko \
    net/ipv4/netfilter/nf_conntrack_ipv4.ko \
    net/ipv6/netfilter/nf_conntrack_ipv6.ko

    (builtin)|| sctp | ipv4 | ipv6 | nf_conntrack
    ---------++--------+--------+--------+--------------
    none || 498243 | 828755 | 828676 | 6141434
    SCTP || - | 829254 | 829175 | 6547872

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     
  • CONFIG_NF_CT_PROTO_DCCP is no more a tristate. When set to y, connection
    tracking support for DCCP protocol is built-in into nf_conntrack.ko.

    footprint test:
    $ ls -l net/netfilter/nf_conntrack{_proto_dccp,}.ko \
    net/ipv4/netfilter/nf_conntrack_ipv4.ko \
    net/ipv6/netfilter/nf_conntrack_ipv6.ko

    (builtin)|| dccp | ipv4 | ipv6 | nf_conntrack
    ---------++--------+--------+--------+--------------
    none || 469140 | 828755 | 828676 | 6141434
    DCCP || - | 830566 | 829935 | 6533526

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     
  • CONFIG_NF_NAT_PROTO_UDPLITE is no more a tristate. When set to y, NAT
    support for UDPlite protocol is built-in into nf_nat.ko.

    footprint test:

    (nf_nat_proto_) |udplite || nf_nat
    --------------------------+--------++--------
    no builtin | 408048 || 2241312
    UDPLITE builtin | - || 2577256

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     
  • CONFIG_NF_NAT_PROTO_SCTP is no more a tristate. When set to y, NAT
    support for SCTP protocol is built-in into nf_nat.ko.

    footprint test:

    (nf_nat_proto_) | sctp || nf_nat
    --------------------------+--------++--------
    no builtin | 428344 || 2241312
    SCTP builtin | - || 2597032

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     
  • CONFIG_NF_NAT_PROTO_DCCP is no more a tristate. When set to y, NAT
    support for DCCP protocol is built-in into nf_nat.ko.

    footprint test:

    (nf_nat_proto_) | dccp || nf_nat
    --------------------------+--------++--------
    no builtin | 409800 || 2241312
    DCCP builtin | - || 2578968

    Signed-off-by: Davide Caratti
    Signed-off-by: Pablo Neira Ayuso

    Davide Caratti
     

02 Nov, 2016

3 commits

  • Introduces an nftables rt expression for routing related data with support
    for nexthop (i.e. the directly connected IP address that an outgoing packet
    is sent to), which can be used either for matching or accounting, eg.

    # nft add rule filter postrouting \
    ip daddr 192.168.1.0/24 rt nexthop != 192.168.0.1 drop

    This will drop any traffic to 192.168.1.0/24 that is not routed via
    192.168.0.1.

    # nft add rule filter postrouting \
    flow table acct { rt nexthop timeout 600s counter }
    # nft add rule ip6 filter postrouting \
    flow table acct { rt nexthop timeout 600s counter }

    These rules count outgoing traffic per nexthop. Note that the timeout
    releases an entry if no traffic is seen for this nexthop within 10 minutes.

    # nft add rule inet filter postrouting \
    ether type ip \
    flow table acct { rt nexthop timeout 600s counter }
    # nft add rule inet filter postrouting \
    ether type ip6 \
    flow table acct { rt nexthop timeout 600s counter }

    Same as above, but via the inet family, where the ether type must be
    specified explicitly.

    "rt classid" is also implemented identical to "meta rtclassid", since it
    is more logical to have this match in the routing expression going forward.

    Signed-off-by: Anders K. Pedersen
    Signed-off-by: Pablo Neira Ayuso

    Anders K. Pedersen
     
  • Move layer 2 packet logging into nf_log_l2packet() that resides in
    nf_log_common.c, so this can be shared by both bridge and netdev
    families.

    This patch adds the boiler plate code to register the netdev logging
    family.

    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     
  • Add FIB expression, supported for ipv4, ipv6 and inet family (the latter
    just dispatches to ipv4 or ipv6 one based on nfproto).

    Currently supports fetching output interface index/name and the
    rtm_type associated with an address.

    This can be used for adding path filtering. rtm_type is useful
    to e.g. enforce a strong-end host model where packets
    are only accepted if daddr is configured on the interface the
    packet arrived on.

    The fib expression is a native nftables alternative to the
    xtables addrtype and rp_filter matches.

    FIB result order for oif/oifname retrieval is as follows:
    - if packet is local (skb has rtable, RTF_LOCAL set, this
    will also catch looped-back multicast packets), set oif to
    the loopback interface.
    - if fib lookup returns an error, or result points to local,
    store zero result. This means '--local' option of -m rpfilter
    is not supported. It is possible to use 'fib type local' or add
    explicit saddr/daddr matching rules to create exceptions if this
    is really needed.
    - store result in the destination register.
    In case of multiple routes, search set for desired oif in case
    strict matching is requested.

    ipv4 and ipv6 behave fib expressions are supposed to behave the same.

    [ I have collapsed Arnd Bergmann's ("netfilter: nf_tables: fib warnings")

    http://patchwork.ozlabs.org/patch/688615/

    to address fallout from this patch after rebasing nf-next, that was
    posted to address compilation warnings. --pablo ]

    Signed-off-by: Florian Westphal
    Signed-off-by: Pablo Neira Ayuso

    Florian Westphal
     

26 Sep, 2016

1 commit

  • Inverse ranges != [a,b] are not currently possible because rules are
    composites of && operations, and we need to express this:

    data < a || data > b

    This patch adds a new range expression. Positive ranges can be already
    through two cmp expressions:

    cmp(sreg, data, >=)
    cmp(sreg, data,

    Pablo Neira Ayuso
     

22 Aug, 2016

2 commits

  • This patch adds the numgen expression that allows us to generated
    incremental and random numbers, this generator is bound to a upper limit
    that is specified by userspace.

    This expression is useful to distribute packets in a round-robin fashion
    as well as randomly.

    Signed-off-by: Laura Garcia Liebana
    Signed-off-by: Pablo Neira Ayuso

    Laura Garcia Liebana
     
  • This patch adds the quota expression. This new stateful expression
    integrate easily into the dynset expression to build 'hashquota' flow
    tables.

    Arguably, we could use instead "counter bytes > 1000" instead, but this
    approach has several problems:

    1) We only support for one single stateful expression in dynamic set
    definitions, and the expression above is a composite of two
    expressions: get counter + comparison.

    2) We would need to restore the packed counter representation (that we
    used to have) based on seqlock to synchronize this, since per-cpu is
    not suitable for this.

    So instead of bloating the counter expression back with the seqlock
    representation and extending the existing set infrastructure to make it
    more complex for the composite described above, let's follow the more
    simple approach of adding a quota expression that we can plug into our
    existing infrastructure.

    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     

12 Aug, 2016

2 commits


05 Jan, 2016

1 commit


04 Jan, 2016

1 commit


09 Dec, 2015

1 commit

  • nft monitor mode can then decode and display this trace data.

    Parts of LL/Network/Transport headers are provided as separate
    attributes.

    Otherwise, printing IP address data becomes virtually impossible
    for userspace since in the case of the netdev family we really don't
    want userspace to have to know all the possible link layer types
    and/or sizes just to display/print an ip address.

    We also don't want userspace to have to follow ipv6 header chains
    to get the s/dport info, the kernel already did this work for us.

    To avoid bloating nft_do_chain all data required for tracing is
    encapsulated in nft_traceinfo.

    The structure is initialized unconditionally(!) for each nft_do_chain
    invocation.

    This unconditionall call will be moved under a static key in a
    followup patch.

    With lots of help from Patrick McHardy and Pablo Neira.

    Signed-off-by: Florian Westphal
    Acked-by: Patrick McHardy
    Signed-off-by: Pablo Neira Ayuso

    Florian Westphal
     

05 Oct, 2015

2 commits

  • Now that we have integrated the ct glue code into nfnetlink_queue without
    introducing dependencies with the conntrack code.

    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     
  • The original intention was to avoid dependencies between nfnetlink_queue and
    conntrack without ifdef pollution. However, we can achieve this by moving the
    conntrack dependent code into ctnetlink and keep some glue code to access the
    nfq_ct indirection from nfqueue.

    After this patch, the nfq_ct indirection is always compiled in the netfilter
    core to avoid polluting nfqueue with ifdefs. Thus, if nf_conntrack is not
    compiled this results in only 8-bytes of memory waste in x86_64.

    This patch also adds ctnetlink_nfqueue_seqadj() to avoid that the nf_conn
    structure layout if exposed to nf_queue, which creates another dependency with
    nf_conntrack at compilation time.

    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     

27 May, 2015

1 commit


08 Apr, 2015

1 commit

  • Add a new "dynset" expression for dynamic set updates.

    A new set op ->update() is added which, for non existant elements,
    invokes an initialization callback and inserts the new element.
    For both new or existing elements the extenstion pointer is returned
    to the caller to optionally perform timer updates or other actions.

    Element removal is not supported so far, however that seems to be a
    rather exotic need and can be added later on.

    Signed-off-by: Patrick McHardy
    Signed-off-by: Pablo Neira Ayuso

    Patrick McHardy
     

27 Nov, 2014

1 commit


28 Oct, 2014

1 commit


11 Sep, 2014

1 commit

  • Pablo Neira Ayuso says:

    ====================
    nf-next pull request

    The following patchset contains Netfilter/IPVS updates for your
    net-next tree. Regarding nf_tables, most updates focus on consolidating
    the NAT infrastructure and adding support for masquerading. More
    specifically, they are:

    1) use __u8 instead of u_int8_t in arptables header, from
    Mike Frysinger.

    2) Add support to match by skb->pkttype to the meta expression, from
    Ana Rey.

    3) Add support to match by cpu to the meta expression, also from
    Ana Rey.

    4) A smatch warning about IPSET_ATTR_MARKMASK validation, patch from
    Vytas Dauksa.

    5) Fix netnet and netportnet hash types the range support for IPv4,
    from Sergey Popovich.

    6) Fix missing-field-initializer warnings resolved, from Mark Rustad.

    7) Dan Carperter reported possible integer overflows in ipset, from
    Jozsef Kadlecsick.

    8) Filter out accounting objects in nfacct by type, so you can
    selectively reset quotas, from Alexey Perevalov.

    9) Move specific NAT IPv4 functions to the core so x_tables and
    nf_tables can share the same NAT IPv4 engine.

    10) Use the new NAT IPv4 functions from nft_chain_nat_ipv4.

    11) Move specific NAT IPv6 functions to the core so x_tables and
    nf_tables can share the same NAT IPv4 engine.

    12) Use the new NAT IPv6 functions from nft_chain_nat_ipv6.

    13) Refactor code to add nft_delrule(), which can be reused in the
    enhancement of the NFT_MSG_DELTABLE to remove a table and its
    content, from Arturo Borrero.

    14) Add a helper function to unregister chain hooks, from
    Arturo Borrero.

    15) A cleanup to rename to nft_delrule_by_chain for consistency with
    the new nft_*() functions, also from Arturo.

    16) Add support to match devgroup to the meta expression, from Ana Rey.

    17) Reduce stack usage for IPVS socket option, from Julian Anastasov.

    18) Remove unnecessary textsearch state initialization in xt_string,
    from Bojan Prtvar.

    19) Add several helper functions to nf_tables, more work to prepare
    the enhancement of NFT_MSG_DELTABLE, again from Arturo Borrero.

    20) Enhance NFT_MSG_DELTABLE to delete a table and its content, from
    Arturo Borrero.

    21) Support NAT flags in the nat expression to indicate the flavour,
    eg. random fully, from Arturo.

    22) Add missing audit code to ebtables when replacing tables, from
    Nicolas Dichtel.

    23) Generalize the IPv4 masquerading code to allow its re-use from
    nf_tables, from Arturo.

    24) Generalize the IPv6 masquerading code, also from Arturo.

    25) Add the new masq expression to support IPv4/IPv6 masquerading
    from nf_tables, also from Arturo.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

09 Sep, 2014

1 commit


19 Aug, 2014

1 commit

  • Currently, the NAT configs depend on iptables and ip6tables. However,
    users should be capable of enabling NAT for nft without having to
    switch on iptables.

    Fix this by adding new specific IP_NF_NAT and IP6_NF_NAT config
    switches for iptables and ip6tables NAT support. I have also moved
    the original NF_NAT_IPV4 and NF_NAT_IPV6 configs out of the scope
    of iptables to make them independent of it.

    This patch also adds NETFILTER_XT_NAT which selects the xt_nat
    combo that provides snat/dnat for iptables. We cannot use NF_NAT
    anymore since nf_tables can select this.

    Reported-by: Matteo Croce
    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     

27 Jun, 2014

1 commit

  • The plain text logging is currently embedded into the xt_LOG target.
    In order to be able to use the plain text logging from nft_log, as a
    first step, this patch moves the family specific code to the following
    files and Kconfig symbols:

    1) net/ipv4/netfilter/nf_log_ip.c: CONFIG_NF_LOG_IPV4
    2) net/ipv6/netfilter/nf_log_ip6.c: CONFIG_NF_LOG_IPV6
    3) net/netfilter/nf_log_common.c: CONFIG_NF_LOG_COMMON

    These new modules will be required by xt_LOG and nft_log. This patch
    is based on original patch from Arturo Borrero Gonzalez.

    Signed-off-by: Pablo Neira Ayuso

    Pablo Neira Ayuso
     

06 Feb, 2014

1 commit


11 Jan, 2014

1 commit


10 Jan, 2014

1 commit

  • Introduce an xtables add-on for matching L2TP packets. Supports L2TPv2
    and L2TPv3 over IPv4 and IPv6. As well as filtering on L2TP tunnel-id
    and session-id, the filtering decision can also include the L2TP
    packet type (control or data), protocol version (2 or 3) and
    encapsulation type (UDP or IP).

    The most common use for this will likely be to filter L2TP data
    packets of individual L2TP tunnels or sessions. While a u32 match can
    be used, the L2TP protocol headers are such that field offsets differ
    depending on bits set in the header, making rules for matching generic
    L2TP connections cumbersome. This match extension takes care of all
    that.

    Signed-off-by: James Chapman
    Signed-off-by: Pablo Neira Ayuso

    James Chapman
     

08 Jan, 2014

1 commit


07 Jan, 2014

1 commit

  • Pablo Neira Ayuso says:

    ====================
    nftables updates for net-next

    The following patchset contains nftables updates for your net-next tree,
    they are:

    * Add set operation to the meta expression by means of the select_ops()
    infrastructure, this allows us to set the packet mark among other things.
    From Arturo Borrero Gonzalez.

    * Fix wrong format in sscanf in nf_tables_set_alloc_name(), from Daniel
    Borkmann.

    * Add new queue expression to nf_tables. These comes with two previous patches
    to prepare this new feature, one to add mask in nf_tables_core to
    evaluate the queue verdict appropriately and another to refactor common
    code with xt_NFQUEUE, from Eric Leblond.

    * Do not hide nftables from Kconfig if nfnetlink is not enabled, also from
    Eric Leblond.

    * Add the reject expression to nf_tables, this adds the missing TCP RST
    support. It comes with an initial patch to refactor common code with
    xt_NFQUEUE, again from Eric Leblond.

    * Remove an unused variable assignment in nf_tables_dump_set(), from Michal
    Nazarewicz.

    * Remove the nft_meta_target code, now that Arturo added the set operation
    to the meta expression, from me.

    * Add help information for nf_tables to Kconfig, also from me.

    * Allow to dump all sets by specifying NFPROTO_UNSPEC, similar feature is
    available to other nf_tables objects, requested by Arturo, from me.

    * Expose the table usage counter, so we can know how many chains are using
    this table without dumping the list of chains, from Tomasz Bursztyka.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

04 Jan, 2014

1 commit

  • It would be useful e.g. in a server or desktop environment to have
    a facility in the notion of fine-grained "per application" or "per
    application group" firewall policies. Probably, users in the mobile,
    embedded area (e.g. Android based) with different security policy
    requirements for application groups could have great benefit from
    that as well. For example, with a little bit of configuration effort,
    an admin could whitelist well-known applications, and thus block
    otherwise unwanted "hard-to-track" applications like [1] from a
    user's machine. Blocking is just one example, but it is not limited
    to that, meaning we can have much different scenarios/policies that
    netfilter allows us than just blocking, e.g. fine grained settings
    where applications are allowed to connect/send traffic to, application
    traffic marking/conntracking, application-specific packet mangling,
    and so on.

    Implementation of PID-based matching would not be appropriate
    as they frequently change, and child tracking would make that
    even more complex and ugly. Cgroups would be a perfect candidate
    for accomplishing that as they associate a set of tasks with a
    set of parameters for one or more subsystems, in our case the
    netfilter subsystem, which, of course, can be combined with other
    cgroup subsystems into something more complex if needed.

    As mentioned, to overcome this constraint, such processes could
    be placed into one or multiple cgroups where different fine-grained
    rules can be defined depending on the application scenario, while
    e.g. everything else that is not part of that could be dropped (or
    vice versa), thus making life harder for unwanted processes to
    communicate to the outside world. So, we make use of cgroups here
    to track jobs and limit their resources in terms of iptables
    policies; in other words, limiting, tracking, etc what they are
    allowed to communicate.

    In our case we're working on outgoing traffic based on which local
    socket that originated from. Also, one doesn't even need to have
    an a-prio knowledge of the application internals regarding their
    particular use of ports or protocols. Matching is *extremly*
    lightweight as we just test for the sk_classid marker of sockets,
    originating from net_cls. net_cls and netfilter do not contradict
    each other; in fact, each construct can live as standalone or they
    can be used in combination with each other, which is perfectly fine,
    plus it serves Tejun's requirement to not introduce a new cgroups
    subsystem. Through this, we result in a very minimal and efficient
    module, and don't add anything except netfilter code.

    One possible, minimal usage example (many other iptables options
    can be applied obviously):

    1) Configuring cgroups if not already done, e.g.:

    mkdir /sys/fs/cgroup/net_cls
    mount -t cgroup -o net_cls net_cls /sys/fs/cgroup/net_cls
    mkdir /sys/fs/cgroup/net_cls/0
    echo 1 > /sys/fs/cgroup/net_cls/0/net_cls.classid
    (resp. a real flow handle id for tc)

    2) Configuring netfilter (iptables-nftables), e.g.:

    iptables -A OUTPUT -m cgroup ! --cgroup 1 -j DROP

    3) Running applications, e.g.:

    ping 208.67.222.222
    echo 1799 > /sys/fs/cgroup/net_cls/0/tasks
    64 bytes from 208.67.222.222: icmp_seq=44 ttl=49 time=11.9 ms
    [...]
    ping 208.67.220.220
    ping: sendmsg: Operation not permitted
    [...]
    echo 1804 > /sys/fs/cgroup/net_cls/0/tasks
    64 bytes from 208.67.220.220: icmp_seq=89 ttl=56 time=19.0 ms
    [...]

    Of course, real-world deployments would make use of cgroups user
    space toolsuite, or own custom policy daemons dynamically moving
    applications from/to various cgroups.

    [1] http://www.blackhat.com/presentations/bh-europe-06/bh-eu-06-biondi/bh-eu-06-biondi-up.pdf

    Signed-off-by: Daniel Borkmann
    Cc: Tejun Heo
    Cc: cgroups@vger.kernel.org
    Acked-by: Li Zefan
    Signed-off-by: Pablo Neira Ayuso

    Daniel Borkmann