]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Merge branch 'merge-4.10' into next-merge
authorStephen Hemminger <sthemmin@microsoft.com>
Fri, 17 Feb 2017 23:34:24 +0000 (15:34 -0800)
committerStephen Hemminger <sthemmin@microsoft.com>
Fri, 17 Feb 2017 23:34:24 +0000 (15:34 -0800)
56 files changed:
bash-completion/tc
include/linux/atmarp.h [new file with mode: 0644]
include/linux/atmdev.h [new file with mode: 0644]
include/linux/bpf.h
include/linux/can/netlink.h
include/linux/devlink.h
include/linux/elf-em.h [new file with mode: 0644]
include/linux/icmpv6.h [new file with mode: 0644]
include/linux/if_bridge.h
include/linux/if_link.h
include/linux/ife.h [new file with mode: 0644]
include/linux/in_route.h [new file with mode: 0644]
include/linux/ip.h [new file with mode: 0644]
include/linux/ipv6.h [new file with mode: 0644]
include/linux/kernel.h [new file with mode: 0644]
include/linux/l2tp.h
include/linux/limits.h [new file with mode: 0644]
include/linux/magic.h [new file with mode: 0644]
include/linux/mpls.h
include/linux/neighbour.h
include/linux/netfilter/ipset/ip_set.h [new file with mode: 0644]
include/linux/netfilter/xt_set.h [new file with mode: 0644]
include/linux/netfilter_ipv6.h [new file with mode: 0644]
include/linux/netfilter_ipv6/ip6_tables.h [new file with mode: 0644]
include/linux/netlink.h
include/linux/param.h [new file with mode: 0644]
include/linux/pkt_cls.h
include/linux/posix_types.h [new file with mode: 0644]
include/linux/rtnetlink.h
include/linux/sctp.h
include/linux/sockios.h [new file with mode: 0644]
include/linux/stddef.h [new file with mode: 0644]
include/linux/sysctl.h [new file with mode: 0644]
include/linux/sysinfo.h [new file with mode: 0644]
include/linux/tc_act/tc_csum.h
include/linux/tc_act/tc_ife.h
include/linux/tc_act/tc_pedit.h
include/linux/tc_act/tc_sample.h [new file with mode: 0644]
include/linux/tc_act/tc_skbmod.h [new file with mode: 0644]
include/linux/tc_ematch/tc_em_text.h [deleted file]
include/linux/tcp.h
include/linux/tipc.h
ip/iplink_bridge.c
ip/iplink_bridge_slave.c
ip/ipmroute.c
ip/iproute.c
man/man8/Makefile
man/man8/ip-link.8.in
man/man8/tc-csum.8
man/man8/tc-flower.8
man/man8/tc-matchall.8
man/man8/tc-sample.8 [new file with mode: 0644]
tc/Makefile
tc/f_flower.c
tc/m_csum.c
tc/m_sample.c [new file with mode: 0644]

index 79dd5fcc172c52ffeb1b2fc7e926d6951100f0e8..80d12972c8f3c711868f03cd76f6cf896d12b769 100644 (file)
@@ -2,6 +2,12 @@
 # Copyright 2016 6WIND S.A.
 # Copyright 2016 Quentin Monnet <quentin.monnet@6wind.com>
 
+QDISC_KIND=' choke codel bfifo pfifo pfifo_head_drop fq fq_codel gred hhf \
+            mqprio multiq netem pfifo_fast pie red rr sfb sfq tbf atm cbq drr \
+            dsmark hfsc htb prio qfq '
+FILTER_KIND=' basic bpf cgroup flow flower fw route rsvp tcindex u32 matchall '
+ACTION_KIND=' gact mirred bpf sample '
+
 # Takes a list of words in argument; each one of them is added to COMPREPLY if
 # it is not already present on the command line. Returns no value.
 _tc_once_attr()
@@ -20,6 +26,26 @@ _tc_once_attr()
     done
 }
 
+# Takes a list of words in argument; each one of them is added to COMPREPLY if
+# it is not already present on the command line from the provided index. Returns
+# no value.
+_tc_once_attr_from()
+{
+    local w subcword found from=$1
+    shift
+    for w in $*; do
+        found=0
+        for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do
+            if [[ $w == ${words[subcword]} ]]; then
+                found=1
+                break
+            fi
+        done
+        [[ $found -eq 0 ]] && \
+            COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) )
+    done
+}
+
 # Takes a list of words in argument; adds them all to COMPREPLY if none of them
 # is already present on the command line. Returns no value.
 _tc_one_of_list()
@@ -33,6 +59,21 @@ _tc_one_of_list()
     COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) )
 }
 
+# Takes a list of words in argument; adds them all to COMPREPLY if none of them
+# is already present on the command line from the provided index. Returns no
+# value.
+_tc_one_of_list_from()
+{
+    local w subcword from=$1
+    shift
+    for w in $*; do
+        for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do
+            [[ $w == ${words[subcword]} ]] && return 1
+        done
+    done
+    COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) )
+}
+
 # Returns "$cur ${cur}arg1 ${cur}arg2 ..."
 _tc_expand_units()
 {
@@ -345,11 +386,44 @@ _tc_bpf_options()
     return 0
 }
 
+# Complete with options names for filter actions.
+# This function is recursive, thus allowing multiple actions statement to be
+# parsed.
+# Returns 0 is completion should stop after running this function, 1 otherwise.
+_tc_filter_action_options()
+{
+    for ((acwd=$1; acwd < ${#words[@]}-1; acwd++));
+    do
+        if [[ action == ${words[acwd]} ]]; then
+            _tc_filter_action_options $((acwd+1)) && return 0
+        fi
+    done
+
+    local action acwd
+    for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); do
+        if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then
+            _tc_one_of_list_from $acwd action
+            _tc_action_options $acwd && return 0
+        fi
+    done
+    _tc_one_of_list_from $acwd $ACTION_KIND
+    return 0
+}
+
 # Complete with options names for filters.
 # Returns 0 is completion should stop after running this function, 1 otherwise.
 _tc_filter_options()
 {
-    case $1 in
+
+    for ((acwd=$1; acwd < ${#words[@]}-1; acwd++));
+    do
+        if [[ action == ${words[acwd]} ]]; then
+            _tc_filter_action_options $((acwd+1)) && return 0
+        fi
+    done
+
+    filter=${words[$1]}
+    case $filter in
         basic)
             _tc_once_attr 'match action classid'
             return 0
@@ -375,6 +449,10 @@ _tc_filter_options()
             _tc_once_attr 'map hash divisor baseclass match action'
             return 0
             ;;
+        matchall)
+            _tc_once_attr 'action skip_sw skip_hw'
+            return 0
+            ;;
         flower)
             _tc_once_attr 'action classid indev dst_mac src_mac eth_type \
                 ip_proto dst_ip src_ip dst_port src_port'
@@ -419,20 +497,28 @@ _tc_filter_options()
 # Returns 0 is completion should stop after running this function, 1 otherwise.
 _tc_action_options()
 {
-    case $1 in
+    local from=$1
+    local action=${words[from]}
+    case $action in
         bpf)
             _tc_bpf_options
             return 0
             ;;
         mirred)
-            _tc_one_of_list 'ingress egress'
-            _tc_one_of_list 'mirror redirect'
-            _tc_once_attr 'index dev'
+            _tc_one_of_list_from $from 'ingress egress'
+            _tc_one_of_list_from $from 'mirror redirect'
+            _tc_once_attr_from $from 'index dev'
+            return 0
+            ;;
+        sample)
+            _tc_once_attr_from $from 'rate'
+            _tc_once_attr_from $from 'trunc'
+            _tc_once_attr_from $from 'group'
             return 0
             ;;
         gact)
-            _tc_one_of_list 'reclassify drop continue pass'
-            _tc_once_attr 'random'
+            _tc_one_of_list_from $from 'reclassify drop continue pass'
+            _tc_once_attr_from $from 'random'
             return 0
             ;;
     esac
@@ -562,10 +648,7 @@ _tc()
                         COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
                         return 0
                     fi
-                    local qdisc qdwd QDISC_KIND=' choke codel bfifo pfifo \
-                        pfifo_head_drop fq fq_codel gred hhf mqprio multiq \
-                        netem pfifo_fast pie red rr sfb sfq tbf atm cbq drr \
-                        dsmark hfsc htb prio qfq '
+                    local qdisc qdwd
                     for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do
                         if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then
                             qdisc=${words[qdwd]}
@@ -600,10 +683,7 @@ _tc()
                         COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
                         return 0
                     fi
-                    local qdisc qdwd QDISC_KIND=' choke codel bfifo pfifo \
-                        pfifo_head_drop fq fq_codel gred hhf mqprio multiq \
-                        netem pfifo_fast pie red rr sfb sfq tbf atm cbq drr \
-                        dsmark hfsc htb prio qfq '
+                    local qdisc qdwd
                     for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do
                         if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then
                             qdisc=${words[qdwd]}
@@ -638,13 +718,11 @@ _tc()
                         COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
                         return 0
                     fi
-                    local filter fltwd FILTER_KIND=' basic bpf cgroup flow \
-                        flower fw route rsvp tcindex u32 '
+                    local filter fltwd
                     for ((fltwd=$subcword; fltwd < ${#words[@]}-1; fltwd++));
                     do
                         if [[ $FILTER_KIND =~ ' '${words[fltwd]}' ' ]]; then
-                            filter=${words[fltwd]}
-                            _tc_filter_options $filter && return 0
+                            _tc_filter_options $fltwd && return 0
                         fi
                     done
                     _tc_one_of_list $FILTER_KIND
@@ -671,11 +749,10 @@ _tc()
         action)
             case $subcmd in
                 add|change|replace)
-                    local action acwd ACTION_KIND=' gact mirred bpf '
+                    local action acwd
                     for ((acwd=$subcword; acwd < ${#words[@]}-1; acwd++)); do
                         if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then
-                            action=${words[acwd]}
-                            _tc_action_options $action && return 0
+                            _tc_action_options $acwd && return 0
                         fi
                     done
                     _tc_one_of_list $ACTION_KIND
diff --git a/include/linux/atmarp.h b/include/linux/atmarp.h
new file mode 100644 (file)
index 0000000..231f4bd
--- /dev/null
@@ -0,0 +1,41 @@
+/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */
+/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */
+
+#ifndef _LINUX_ATMARP_H
+#define _LINUX_ATMARP_H
+
+#include <linux/types.h>
+#include <linux/atmapi.h>
+#include <linux/atmioc.h>
+
+
+#define ATMARP_RETRY_DELAY 30          /* request next resolution or forget
+                                          NAK after 30 sec - should go into
+                                          atmclip.h */
+#define ATMARP_MAX_UNRES_PACKETS 5     /* queue that many packets while
+                                          waiting for the resolver */
+
+
+#define ATMARPD_CTRL   _IO('a',ATMIOC_CLIP+1)  /* become atmarpd ctrl sock */
+#define ATMARP_MKIP    _IO('a',ATMIOC_CLIP+2)  /* attach socket to IP */
+#define ATMARP_SETENTRY        _IO('a',ATMIOC_CLIP+3)  /* fill or hide ARP entry */
+#define ATMARP_ENCAP   _IO('a',ATMIOC_CLIP+5)  /* change encapsulation */
+
+
+enum atmarp_ctrl_type {
+       act_invalid,            /* catch uninitialized structures */
+       act_need,               /* need address resolution */
+       act_up,                 /* interface is coming up */
+       act_down,               /* interface is going down */
+       act_change              /* interface configuration has changed */
+};
+
+struct atmarp_ctrl {
+       enum atmarp_ctrl_type   type;   /* message type */
+       int                     itf_num;/* interface number (if present) */
+       __be32                  ip;     /* IP address (act_need only) */
+};
+
+#endif
diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h
new file mode 100644 (file)
index 0000000..8faa8b9
--- /dev/null
@@ -0,0 +1,215 @@
+/* atmdev.h - ATM device driver declarations and various related items */
+/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+
+#ifndef LINUX_ATMDEV_H
+#define LINUX_ATMDEV_H
+
+
+#include <linux/atmapi.h>
+#include <linux/atm.h>
+#include <linux/atmioc.h>
+
+
+#define ESI_LEN                6
+
+#define ATM_OC3_PCR    (155520000/270*260/8/53)
+                       /* OC3 link rate:  155520000 bps
+                          SONET overhead: /270*260 (9 section, 1 path)
+                          bits per cell:  /8/53
+                          max cell rate:  353207.547 cells/sec */
+#define ATM_25_PCR     ((25600000/8-8000)/54)
+                       /* 25 Mbps ATM cell rate (59111) */
+#define ATM_OC12_PCR   (622080000/1080*1040/8/53)
+                       /* OC12 link rate: 622080000 bps
+                          SONET overhead: /1080*1040
+                          bits per cell:  /8/53
+                          max cell rate:  1412830.188 cells/sec */
+#define ATM_DS3_PCR    (8000*12)
+                       /* DS3: 12 cells in a 125 usec time slot */
+
+
+#define __AAL_STAT_ITEMS \
+    __HANDLE_ITEM(tx);                 /* TX okay */ \
+    __HANDLE_ITEM(tx_err);             /* TX errors */ \
+    __HANDLE_ITEM(rx);                 /* RX okay */ \
+    __HANDLE_ITEM(rx_err);             /* RX errors */ \
+    __HANDLE_ITEM(rx_drop);            /* RX out of memory */
+
+struct atm_aal_stats {
+#define __HANDLE_ITEM(i) int i
+       __AAL_STAT_ITEMS
+#undef __HANDLE_ITEM
+};
+
+
+struct atm_dev_stats {
+       struct atm_aal_stats aal0;
+       struct atm_aal_stats aal34;
+       struct atm_aal_stats aal5;
+} __ATM_API_ALIGN;
+
+
+#define ATM_GETLINKRATE        _IOW('a',ATMIOC_ITF+1,struct atmif_sioc)
+                                       /* get link rate */
+#define ATM_GETNAMES   _IOW('a',ATMIOC_ITF+3,struct atm_iobuf)
+                                       /* get interface names (numbers) */
+#define ATM_GETTYPE    _IOW('a',ATMIOC_ITF+4,struct atmif_sioc)
+                                       /* get interface type name */
+#define ATM_GETESI     _IOW('a',ATMIOC_ITF+5,struct atmif_sioc)
+                                       /* get interface ESI */
+#define ATM_GETADDR    _IOW('a',ATMIOC_ITF+6,struct atmif_sioc)
+                                       /* get itf's local ATM addr. list */
+#define ATM_RSTADDR    _IOW('a',ATMIOC_ITF+7,struct atmif_sioc)
+                                       /* reset itf's ATM address list */
+#define ATM_ADDADDR    _IOW('a',ATMIOC_ITF+8,struct atmif_sioc)
+                                       /* add a local ATM address */
+#define ATM_DELADDR    _IOW('a',ATMIOC_ITF+9,struct atmif_sioc)
+                                       /* remove a local ATM address */
+#define ATM_GETCIRANGE _IOW('a',ATMIOC_ITF+10,struct atmif_sioc)
+                                       /* get connection identifier range */
+#define ATM_SETCIRANGE _IOW('a',ATMIOC_ITF+11,struct atmif_sioc)
+                                       /* set connection identifier range */
+#define ATM_SETESI     _IOW('a',ATMIOC_ITF+12,struct atmif_sioc)
+                                       /* set interface ESI */
+#define ATM_SETESIF    _IOW('a',ATMIOC_ITF+13,struct atmif_sioc)
+                                       /* force interface ESI */
+#define ATM_ADDLECSADDR        _IOW('a', ATMIOC_ITF+14, struct atmif_sioc)
+                                       /* register a LECS address */
+#define ATM_DELLECSADDR        _IOW('a', ATMIOC_ITF+15, struct atmif_sioc)
+                                       /* unregister a LECS address */
+#define ATM_GETLECSADDR        _IOW('a', ATMIOC_ITF+16, struct atmif_sioc)
+                                       /* retrieve LECS address(es) */
+
+#define ATM_GETSTAT    _IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc)
+                                       /* get AAL layer statistics */
+#define ATM_GETSTATZ   _IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc)
+                                       /* get AAL layer statistics and zero */
+#define ATM_GETLOOP    _IOW('a',ATMIOC_SARCOM+2,struct atmif_sioc)
+                                       /* get loopback mode */
+#define ATM_SETLOOP    _IOW('a',ATMIOC_SARCOM+3,struct atmif_sioc)
+                                       /* set loopback mode */
+#define ATM_QUERYLOOP  _IOW('a',ATMIOC_SARCOM+4,struct atmif_sioc)
+                                       /* query supported loopback modes */
+#define ATM_SETSC      _IOW('a',ATMIOC_SPECIAL+1,int)
+                                       /* enable or disable single-copy */
+#define ATM_SETBACKEND _IOW('a',ATMIOC_SPECIAL+2,atm_backend_t)
+                                       /* set backend handler */
+#define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
+                                       /* use backend to make new if */
+#define ATM_ADDPARTY   _IOW('a', ATMIOC_SPECIAL+4,struct atm_iobuf)
+                                       /* add party to p2mp call */
+#ifdef CONFIG_COMPAT
+/* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */
+#define COMPAT_ATM_ADDPARTY    _IOW('a', ATMIOC_SPECIAL+4,struct compat_atm_iobuf)
+#endif
+#define ATM_DROPPARTY  _IOW('a', ATMIOC_SPECIAL+5,int)
+                                       /* drop party from p2mp call */
+
+/*
+ * These are backend handkers that can be set via the ATM_SETBACKEND call
+ * above.  In the future we may support dynamic loading of these - for now,
+ * they're just being used to share the ATMIOC_BACKEND ioctls
+ */
+#define ATM_BACKEND_RAW                0       
+#define ATM_BACKEND_PPP                1       /* PPPoATM - RFC2364 */
+#define ATM_BACKEND_BR2684     2       /* Bridged RFC1483/2684 */
+
+/* for ATM_GETTYPE */
+#define ATM_ITFTYP_LEN 8       /* maximum length of interface type name */
+
+/*
+ * Loopback modes for ATM_{PHY,SAR}_{GET,SET}LOOP
+ */
+
+/* Point of loopback                           CPU-->SAR-->PHY-->line--> ... */
+#define __ATM_LM_NONE  0       /* no loop back     ^     ^     ^      ^      */
+#define __ATM_LM_AAL   1       /* loop back PDUs --'     |     |      |      */
+#define __ATM_LM_ATM   2       /* loop back ATM cells ---'     |      |      */
+/* RESERVED            4       loop back on PHY side  ---'                   */
+#define __ATM_LM_PHY   8       /* loop back bits (digital) ----'      |      */
+#define __ATM_LM_ANALOG 16     /* loop back the analog signal --------'      */
+
+/* Direction of loopback */
+#define __ATM_LM_MKLOC(n)      ((n))       /* Local (i.e. loop TX to RX) */
+#define __ATM_LM_MKRMT(n)      ((n) << 8)  /* Remote (i.e. loop RX to TX) */
+
+#define __ATM_LM_XTLOC(n)      ((n) & 0xff)
+#define __ATM_LM_XTRMT(n)      (((n) >> 8) & 0xff)
+
+#define ATM_LM_NONE    0       /* no loopback */
+
+#define ATM_LM_LOC_AAL __ATM_LM_MKLOC(__ATM_LM_AAL)
+#define ATM_LM_LOC_ATM __ATM_LM_MKLOC(__ATM_LM_ATM)
+#define ATM_LM_LOC_PHY __ATM_LM_MKLOC(__ATM_LM_PHY)
+#define ATM_LM_LOC_ANALOG __ATM_LM_MKLOC(__ATM_LM_ANALOG)
+
+#define ATM_LM_RMT_AAL __ATM_LM_MKRMT(__ATM_LM_AAL)
+#define ATM_LM_RMT_ATM __ATM_LM_MKRMT(__ATM_LM_ATM)
+#define ATM_LM_RMT_PHY __ATM_LM_MKRMT(__ATM_LM_PHY)
+#define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG)
+
+/*
+ * Note: ATM_LM_LOC_* and ATM_LM_RMT_* can be combined, provided that
+ * __ATM_LM_XTLOC(x) <= __ATM_LM_XTRMT(x)
+ */
+
+
+struct atm_iobuf {
+       int length;
+       void *buffer;
+};
+
+/* for ATM_GETCIRANGE / ATM_SETCIRANGE */
+
+#define ATM_CI_MAX      -1              /* use maximum range of VPI/VCI */
+struct atm_cirange {
+       signed char     vpi_bits;       /* 1..8, ATM_CI_MAX (-1) for maximum */
+       signed char     vci_bits;       /* 1..16, ATM_CI_MAX (-1) for maximum */
+};
+
+/* for ATM_SETSC; actually taken from the ATM_VF number space */
+
+#define ATM_SC_RX      1024            /* enable RX single-copy */
+#define ATM_SC_TX      2048            /* enable TX single-copy */
+
+#define ATM_BACKLOG_DEFAULT 32 /* if we get more, we're likely to time out
+                                 anyway */
+
+/* MF: change_qos (Modify) flags */
+
+#define ATM_MF_IMMED    1      /* Block until change is effective */
+#define ATM_MF_INC_RSV  2      /* Change reservation on increase */
+#define ATM_MF_INC_SHP  4      /* Change shaping on increase */
+#define ATM_MF_DEC_RSV  8      /* Change reservation on decrease */
+#define ATM_MF_DEC_SHP 16      /* Change shaping on decrease */
+#define ATM_MF_BWD     32      /* Set the backward direction parameters */
+
+#define ATM_MF_SET     (ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \
+                         ATM_MF_DEC_SHP | ATM_MF_BWD)
+
+/*
+ * ATM_VS_* are used to express VC state in a human-friendly way.
+ */
+
+#define ATM_VS_IDLE    0       /* VC is not used */
+#define ATM_VS_CONNECTED 1     /* VC is connected */
+#define ATM_VS_CLOSING 2       /* VC is closing */
+#define ATM_VS_LISTEN  3       /* VC is listening for incoming setups */
+#define ATM_VS_INUSE   4       /* VC is in use (registered with atmsigd) */
+#define ATM_VS_BOUND   5       /* VC is bound */
+
+#define ATM_VS2TXT_MAP \
+    "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND"
+
+#define ATM_VF2TXT_MAP \
+    "ADDR",    "READY",        "PARTIAL",      "REGIS", \
+    "RELEASED", "HASQOS",      "LISTEN",       "META", \
+    "256",     "512",          "1024",         "2048", \
+    "SESSION", "HASSAP",       "BOUND",        "CLOSE"
+
+
+
+#endif /* LINUX_ATMDEV_H */
index b75635f204a7a59cde0c9ff624c43cf2b4ac86e6..178e20c3888529b0417af5c7912bcda592b887a4 100644 (file)
@@ -63,6 +63,12 @@ struct bpf_insn {
        __s32   imm;            /* signed immediate constant */
 };
 
+/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */
+struct bpf_lpm_trie_key {
+       __u32   prefixlen;      /* up to 32 for AF_INET, 128 for AF_INET6 */
+       __u8    data[0];        /* Arbitrary size */
+};
+
 /* BPF syscall commands, see bpf(2) man-page for details. */
 enum bpf_cmd {
        BPF_MAP_CREATE,
@@ -89,6 +95,7 @@ enum bpf_map_type {
        BPF_MAP_TYPE_CGROUP_ARRAY,
        BPF_MAP_TYPE_LRU_HASH,
        BPF_MAP_TYPE_LRU_PERCPU_HASH,
+       BPF_MAP_TYPE_LPM_TRIE,
 };
 
 enum bpf_prog_type {
@@ -116,6 +123,12 @@ enum bpf_attach_type {
 
 #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
 
+/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command
+ * to the given target_fd cgroup the descendent cgroup will be able to
+ * override effective bpf program that was inherited from this cgroup
+ */
+#define BPF_F_ALLOW_OVERRIDE   (1U << 0)
+
 #define BPF_PSEUDO_MAP_FD      1
 
 /* flags for BPF_MAP_UPDATE_ELEM command */
@@ -171,6 +184,7 @@ union bpf_attr {
                __u32           target_fd;      /* container object to attach to */
                __u32           attach_bpf_fd;  /* eBPF program to attach */
                __u32           attach_type;
+               __u32           attach_flags;
        };
 } __attribute__((aligned(8)));
 
@@ -430,6 +444,18 @@ union bpf_attr {
  *     @xdp_md: pointer to xdp_md
  *     @delta: An positive/negative integer to be added to xdp_md.data
  *     Return: 0 on success or negative on error
+ *
+ * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr)
+ *     Copy a NUL terminated string from unsafe address. In case the string
+ *     length is smaller than size, the target is not padded with further NUL
+ *     bytes. In case the string length is larger than size, just count-1
+ *     bytes are copied and the last byte is set to NUL.
+ *     @dst: destination address
+ *     @size: maximum number of bytes to copy, including the trailing NUL
+ *     @unsafe_ptr: unsafe address
+ *     Return:
+ *       > 0 length of the string including the trailing NUL on success
+ *       < 0 error
  */
 #define __BPF_FUNC_MAPPER(FN)          \
        FN(unspec),                     \
@@ -476,7 +502,8 @@ union bpf_attr {
        FN(set_hash_invalid),           \
        FN(get_numa_node_id),           \
        FN(skb_change_head),            \
-       FN(xdp_adjust_head),
+       FN(xdp_adjust_head),            \
+       FN(probe_read_str),
 
 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
  * function eBPF program intends to call
@@ -502,6 +529,7 @@ enum bpf_func_id {
 /* BPF_FUNC_l4_csum_replace flags. */
 #define BPF_F_PSEUDO_HDR               (1ULL << 4)
 #define BPF_F_MARK_MANGLED_0           (1ULL << 5)
+#define BPF_F_MARK_ENFORCE             (1ULL << 6)
 
 /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
 #define BPF_F_INGRESS                  (1ULL << 0)
index 6d4ec2a9dbc10a6de0e399f5f08fc8ae103570bb..b9214bd7aa2bc592eb352b627eb42627ca1460ee 100644 (file)
@@ -127,9 +127,16 @@ enum {
        IFLA_CAN_BERR_COUNTER,
        IFLA_CAN_DATA_BITTIMING,
        IFLA_CAN_DATA_BITTIMING_CONST,
+       IFLA_CAN_TERMINATION,
+       IFLA_CAN_TERMINATION_CONST,
+       IFLA_CAN_BITRATE_CONST,
+       IFLA_CAN_DATA_BITRATE_CONST,
        __IFLA_CAN_MAX
 };
 
 #define IFLA_CAN_MAX   (__IFLA_CAN_MAX - 1)
 
+/* u16 termination range: 1..65535 Ohms */
+#define CAN_TERMINATION_DISABLED 0
+
 #endif /* !_UAPI_CAN_NETLINK_H */
index 7c14d77313f254aba6a497a3750fd10fb48e6e03..2ad3585b417aeb13177200b337e2113e26f46e50 100644 (file)
@@ -57,8 +57,14 @@ enum devlink_command {
        DEVLINK_CMD_SB_OCC_SNAPSHOT,
        DEVLINK_CMD_SB_OCC_MAX_CLEAR,
 
-       DEVLINK_CMD_ESWITCH_MODE_GET,
-       DEVLINK_CMD_ESWITCH_MODE_SET,
+       DEVLINK_CMD_ESWITCH_GET,
+#define DEVLINK_CMD_ESWITCH_MODE_GET /* obsolete, never use this! */ \
+       DEVLINK_CMD_ESWITCH_GET
+
+       DEVLINK_CMD_ESWITCH_SET,
+#define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \
+       DEVLINK_CMD_ESWITCH_SET
+
        /* add new commands above here */
 
        __DEVLINK_CMD_MAX,
diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h
new file mode 100644 (file)
index 0000000..cb5d1a5
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef _LINUX_ELF_EM_H
+#define _LINUX_ELF_EM_H
+
+/* These constants define the various ELF target machines */
+#define EM_NONE                0
+#define EM_M32         1
+#define EM_SPARC       2
+#define EM_386         3
+#define EM_68K         4
+#define EM_88K         5
+#define EM_486         6       /* Perhaps disused */
+#define EM_860         7
+#define EM_MIPS                8       /* MIPS R3000 (officially, big-endian only) */
+                               /* Next two are historical and binaries and
+                                  modules of these types will be rejected by
+                                  Linux.  */
+#define EM_MIPS_RS3_LE 10      /* MIPS R3000 little-endian */
+#define EM_MIPS_RS4_BE 10      /* MIPS R4000 big-endian */
+
+#define EM_PARISC      15      /* HPPA */
+#define EM_SPARC32PLUS 18      /* Sun's "v8plus" */
+#define EM_PPC         20      /* PowerPC */
+#define EM_PPC64       21       /* PowerPC64 */
+#define EM_SPU         23      /* Cell BE SPU */
+#define EM_ARM         40      /* ARM 32 bit */
+#define EM_SH          42      /* SuperH */
+#define EM_SPARCV9     43      /* SPARC v9 64-bit */
+#define EM_H8_300      46      /* Renesas H8/300 */
+#define EM_IA_64       50      /* HP/Intel IA-64 */
+#define EM_X86_64      62      /* AMD x86-64 */
+#define EM_S390                22      /* IBM S/390 */
+#define EM_CRIS                76      /* Axis Communications 32-bit embedded processor */
+#define EM_M32R                88      /* Renesas M32R */
+#define EM_MN10300     89      /* Panasonic/MEI MN10300, AM33 */
+#define EM_OPENRISC     92     /* OpenRISC 32-bit embedded processor */
+#define EM_BLACKFIN     106     /* ADI Blackfin Processor */
+#define EM_ALTERA_NIOS2        113     /* Altera Nios II soft-core processor */
+#define EM_TI_C6000    140     /* TI C6X DSPs */
+#define EM_AARCH64     183     /* ARM 64 bit */
+#define EM_TILEPRO     188     /* Tilera TILEPro */
+#define EM_MICROBLAZE  189     /* Xilinx MicroBlaze */
+#define EM_TILEGX      191     /* Tilera TILE-Gx */
+#define EM_BPF         247     /* Linux BPF - in-kernel virtual machine */
+#define EM_FRV         0x5441  /* Fujitsu FR-V */
+#define EM_AVR32       0x18ad  /* Atmel AVR32 */
+
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA       0x9026
+
+/* Bogus old m32r magic number, used by old tools. */
+#define EM_CYGNUS_M32R 0x9041
+/* This is the old interim value for S/390 architecture */
+#define EM_S390_OLD    0xA390
+/* Also Panasonic/MEI MN10300, AM33 */
+#define EM_CYGNUS_MN10300 0xbeef
+
+
+#endif /* _LINUX_ELF_EM_H */
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
new file mode 100644 (file)
index 0000000..a2e839e
--- /dev/null
@@ -0,0 +1,166 @@
+#ifndef _LINUX_ICMPV6_H
+#define _LINUX_ICMPV6_H
+
+#include <linux/types.h>
+#include <asm/byteorder.h>
+
+struct icmp6hdr {
+
+       __u8            icmp6_type;
+       __u8            icmp6_code;
+       __sum16         icmp6_cksum;
+
+
+       union {
+               __be32                  un_data32[1];
+               __be16                  un_data16[2];
+               __u8                    un_data8[4];
+
+               struct icmpv6_echo {
+                       __be16          identifier;
+                       __be16          sequence;
+               } u_echo;
+
+                struct icmpv6_nd_advt {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+                        __u32          reserved:5,
+                                       override:1,
+                                       solicited:1,
+                                       router:1,
+                                       reserved2:24;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+                        __u32          router:1,
+                                       solicited:1,
+                                       override:1,
+                                       reserved:29;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif                                         
+                } u_nd_advt;
+
+                struct icmpv6_nd_ra {
+                       __u8            hop_limit;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+                       __u8            reserved:3,
+                                       router_pref:2,
+                                       home_agent:1,
+                                       other:1,
+                                       managed:1;
+
+#elif defined(__BIG_ENDIAN_BITFIELD)
+                       __u8            managed:1,
+                                       other:1,
+                                       home_agent:1,
+                                       router_pref:2,
+                                       reserved:3;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif
+                       __be16          rt_lifetime;
+                } u_nd_ra;
+
+       } icmp6_dataun;
+
+#define icmp6_identifier       icmp6_dataun.u_echo.identifier
+#define icmp6_sequence         icmp6_dataun.u_echo.sequence
+#define icmp6_pointer          icmp6_dataun.un_data32[0]
+#define icmp6_mtu              icmp6_dataun.un_data32[0]
+#define icmp6_unused           icmp6_dataun.un_data32[0]
+#define icmp6_maxdelay         icmp6_dataun.un_data16[0]
+#define icmp6_router           icmp6_dataun.u_nd_advt.router
+#define icmp6_solicited                icmp6_dataun.u_nd_advt.solicited
+#define icmp6_override         icmp6_dataun.u_nd_advt.override
+#define icmp6_ndiscreserved    icmp6_dataun.u_nd_advt.reserved
+#define icmp6_hop_limit                icmp6_dataun.u_nd_ra.hop_limit
+#define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed
+#define icmp6_addrconf_other   icmp6_dataun.u_nd_ra.other
+#define icmp6_rt_lifetime      icmp6_dataun.u_nd_ra.rt_lifetime
+#define icmp6_router_pref      icmp6_dataun.u_nd_ra.router_pref
+};
+
+
+#define ICMPV6_ROUTER_PREF_LOW         0x3
+#define ICMPV6_ROUTER_PREF_MEDIUM      0x0
+#define ICMPV6_ROUTER_PREF_HIGH                0x1
+#define ICMPV6_ROUTER_PREF_INVALID     0x2
+
+#define ICMPV6_DEST_UNREACH            1
+#define ICMPV6_PKT_TOOBIG              2
+#define ICMPV6_TIME_EXCEED             3
+#define ICMPV6_PARAMPROB               4
+
+#define ICMPV6_INFOMSG_MASK            0x80
+
+#define ICMPV6_ECHO_REQUEST            128
+#define ICMPV6_ECHO_REPLY              129
+#define ICMPV6_MGM_QUERY               130
+#define ICMPV6_MGM_REPORT              131
+#define ICMPV6_MGM_REDUCTION           132
+
+#define ICMPV6_NI_QUERY                        139
+#define ICMPV6_NI_REPLY                        140
+
+#define ICMPV6_MLD2_REPORT             143
+
+#define ICMPV6_DHAAD_REQUEST           144
+#define ICMPV6_DHAAD_REPLY             145
+#define ICMPV6_MOBILE_PREFIX_SOL       146
+#define ICMPV6_MOBILE_PREFIX_ADV       147
+
+/*
+ *     Codes for Destination Unreachable
+ */
+#define ICMPV6_NOROUTE                 0
+#define ICMPV6_ADM_PROHIBITED          1
+#define ICMPV6_NOT_NEIGHBOUR           2
+#define ICMPV6_ADDR_UNREACH            3
+#define ICMPV6_PORT_UNREACH            4
+#define ICMPV6_POLICY_FAIL             5
+#define ICMPV6_REJECT_ROUTE            6
+
+/*
+ *     Codes for Time Exceeded
+ */
+#define ICMPV6_EXC_HOPLIMIT            0
+#define ICMPV6_EXC_FRAGTIME            1
+
+/*
+ *     Codes for Parameter Problem
+ */
+#define ICMPV6_HDR_FIELD               0
+#define ICMPV6_UNK_NEXTHDR             1
+#define ICMPV6_UNK_OPTION              2
+
+/*
+ *     constants for (set|get)sockopt
+ */
+
+#define ICMPV6_FILTER                  1
+
+/*
+ *     ICMPV6 filter
+ */
+
+#define ICMPV6_FILTER_BLOCK            1
+#define ICMPV6_FILTER_PASS             2
+#define ICMPV6_FILTER_BLOCKOTHERS      3
+#define ICMPV6_FILTER_PASSONLY         4
+
+struct icmp6_filter {
+       __u32           data[8];
+};
+
+/*
+ *     Definitions for MLDv2
+ */
+#define MLD2_MODE_IS_INCLUDE   1
+#define MLD2_MODE_IS_EXCLUDE   2
+#define MLD2_CHANGE_TO_INCLUDE 3
+#define MLD2_CHANGE_TO_EXCLUDE 4
+#define MLD2_ALLOW_NEW_SOURCES 5
+#define MLD2_BLOCK_OLD_SOURCES 6
+
+#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
+
+
+#endif /* _LINUX_ICMPV6_H */
index b7393dd2b5407879569031370e6f49d1a6c89ffa..156f4434ca3254acdbdbf7099bad954610de6d69 100644 (file)
@@ -118,6 +118,7 @@ enum {
        IFLA_BRIDGE_FLAGS,
        IFLA_BRIDGE_MODE,
        IFLA_BRIDGE_VLAN_INFO,
+       IFLA_BRIDGE_VLAN_TUNNEL_INFO,
        __IFLA_BRIDGE_MAX,
 };
 #define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
@@ -134,6 +135,16 @@ struct bridge_vlan_info {
        __u16 vid;
 };
 
+enum {
+       IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC,
+       IFLA_BRIDGE_VLAN_TUNNEL_ID,
+       IFLA_BRIDGE_VLAN_TUNNEL_VID,
+       IFLA_BRIDGE_VLAN_TUNNEL_FLAGS,
+       __IFLA_BRIDGE_VLAN_TUNNEL_MAX,
+};
+
+#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1)
+
 struct bridge_vlan_xstats {
        __u64 rx_bytes;
        __u64 rx_packets;
index 44224740c0f065b27908c037f949a2b826e60ae0..b0bdbd6e16c047f81a16bc69161d020721cf5b6d 100644 (file)
@@ -319,6 +319,8 @@ enum {
        IFLA_BRPORT_MULTICAST_ROUTER,
        IFLA_BRPORT_PAD,
        IFLA_BRPORT_MCAST_FLOOD,
+       IFLA_BRPORT_MCAST_TO_UCAST,
+       IFLA_BRPORT_VLAN_TUNNEL,
        __IFLA_BRPORT_MAX
 };
 #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
@@ -845,6 +847,7 @@ enum {
        IFLA_STATS_LINK_XSTATS,
        IFLA_STATS_LINK_XSTATS_SLAVE,
        IFLA_STATS_LINK_OFFLOAD_XSTATS,
+       IFLA_STATS_AF_SPEC,
        __IFLA_STATS_MAX,
 };
 
diff --git a/include/linux/ife.h b/include/linux/ife.h
new file mode 100644 (file)
index 0000000..2954da3
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __UAPI_IFE_H
+#define __UAPI_IFE_H
+
+#define IFE_METAHDRLEN 2
+
+enum {
+       IFE_META_SKBMARK = 1,
+       IFE_META_HASHID,
+       IFE_META_PRIO,
+       IFE_META_QMAP,
+       IFE_META_TCINDEX,
+       __IFE_META_MAX
+};
+
+/*Can be overridden at runtime by module option*/
+#define IFE_META_MAX (__IFE_META_MAX - 1)
+
+#endif
diff --git a/include/linux/in_route.h b/include/linux/in_route.h
new file mode 100644 (file)
index 0000000..b261b8c
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef _LINUX_IN_ROUTE_H
+#define _LINUX_IN_ROUTE_H
+
+/* IPv4 routing cache flags */
+
+#define RTCF_DEAD      RTNH_F_DEAD
+#define RTCF_ONLINK    RTNH_F_ONLINK
+
+/* Obsolete flag. About to be deleted */
+#define RTCF_NOPMTUDISC RTM_F_NOPMTUDISC
+
+#define RTCF_NOTIFY    0x00010000
+#define RTCF_DIRECTDST 0x00020000 /* unused */
+#define RTCF_REDIRECTED        0x00040000
+#define RTCF_TPROXY    0x00080000 /* unused */
+
+#define RTCF_FAST      0x00200000 /* unused */
+#define RTCF_MASQ      0x00400000 /* unused */
+#define RTCF_SNAT      0x00800000 /* unused */
+#define RTCF_DOREDIRECT 0x01000000
+#define RTCF_DIRECTSRC 0x04000000
+#define RTCF_DNAT      0x08000000
+#define RTCF_BROADCAST 0x10000000
+#define RTCF_MULTICAST 0x20000000
+#define RTCF_REJECT    0x40000000 /* unused */
+#define RTCF_LOCAL     0x80000000
+
+#define RTCF_NAT       (RTCF_DNAT|RTCF_SNAT)
+
+#define RT_TOS(tos)    ((tos)&IPTOS_TOS_MASK)
+
+#endif /* _LINUX_IN_ROUTE_H */
diff --git a/include/linux/ip.h b/include/linux/ip.h
new file mode 100644 (file)
index 0000000..1907284
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * INET                An implementation of the TCP/IP protocol suite for the LINUX
+ *             operating system.  INET is implemented using the  BSD Socket
+ *             interface as the means of communication with the user level.
+ *
+ *             Definitions for the IP protocol.
+ *
+ * Version:    @(#)ip.h        1.0.2   04/28/93
+ *
+ * Authors:    Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ */
+#ifndef _LINUX_IP_H
+#define _LINUX_IP_H
+#include <linux/types.h>
+#include <asm/byteorder.h>
+
+#define IPTOS_TOS_MASK         0x1E
+#define IPTOS_TOS(tos)         ((tos)&IPTOS_TOS_MASK)
+#define        IPTOS_LOWDELAY          0x10
+#define        IPTOS_THROUGHPUT        0x08
+#define        IPTOS_RELIABILITY       0x04
+#define        IPTOS_MINCOST           0x02
+
+#define IPTOS_PREC_MASK                0xE0
+#define IPTOS_PREC(tos)                ((tos)&IPTOS_PREC_MASK)
+#define IPTOS_PREC_NETCONTROL           0xe0
+#define IPTOS_PREC_INTERNETCONTROL      0xc0
+#define IPTOS_PREC_CRITIC_ECP           0xa0
+#define IPTOS_PREC_FLASHOVERRIDE        0x80
+#define IPTOS_PREC_FLASH                0x60
+#define IPTOS_PREC_IMMEDIATE            0x40
+#define IPTOS_PREC_PRIORITY             0x20
+#define IPTOS_PREC_ROUTINE              0x00
+
+
+/* IP options */
+#define IPOPT_COPY             0x80
+#define IPOPT_CLASS_MASK       0x60
+#define IPOPT_NUMBER_MASK      0x1f
+
+#define        IPOPT_COPIED(o)         ((o)&IPOPT_COPY)
+#define        IPOPT_CLASS(o)          ((o)&IPOPT_CLASS_MASK)
+#define        IPOPT_NUMBER(o)         ((o)&IPOPT_NUMBER_MASK)
+
+#define        IPOPT_CONTROL           0x00
+#define        IPOPT_RESERVED1         0x20
+#define        IPOPT_MEASUREMENT       0x40
+#define        IPOPT_RESERVED2         0x60
+
+#define IPOPT_END      (0 |IPOPT_CONTROL)
+#define IPOPT_NOOP     (1 |IPOPT_CONTROL)
+#define IPOPT_SEC      (2 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_LSRR     (3 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_TIMESTAMP        (4 |IPOPT_MEASUREMENT)
+#define IPOPT_CIPSO    (6 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_RR       (7 |IPOPT_CONTROL)
+#define IPOPT_SID      (8 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_SSRR     (9 |IPOPT_CONTROL|IPOPT_COPY)
+#define IPOPT_RA       (20|IPOPT_CONTROL|IPOPT_COPY)
+
+#define IPVERSION      4
+#define MAXTTL         255
+#define IPDEFTTL       64
+
+#define IPOPT_OPTVAL 0
+#define IPOPT_OLEN   1
+#define IPOPT_OFFSET 2
+#define IPOPT_MINOFF 4
+#define MAX_IPOPTLEN 40
+#define IPOPT_NOP IPOPT_NOOP
+#define IPOPT_EOL IPOPT_END
+#define IPOPT_TS  IPOPT_TIMESTAMP
+
+#define        IPOPT_TS_TSONLY         0               /* timestamps only */
+#define        IPOPT_TS_TSANDADDR      1               /* timestamps and addresses */
+#define        IPOPT_TS_PRESPEC        3               /* specified modules only */
+
+#define IPV4_BEET_PHMAXLEN 8
+
+struct iphdr {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+       __u8    ihl:4,
+               version:4;
+#elif defined (__BIG_ENDIAN_BITFIELD)
+       __u8    version:4,
+               ihl:4;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif
+       __u8    tos;
+       __be16  tot_len;
+       __be16  id;
+       __be16  frag_off;
+       __u8    ttl;
+       __u8    protocol;
+       __sum16 check;
+       __be32  saddr;
+       __be32  daddr;
+       /*The options start here. */
+};
+
+
+struct ip_auth_hdr {
+       __u8  nexthdr;
+       __u8  hdrlen;           /* This one is measured in 32 bit units! */
+       __be16 reserved;
+       __be32 spi;
+       __be32 seq_no;          /* Sequence number */
+       __u8  auth_data[0];     /* Variable len but >=4. Mind the 64 bit alignment! */
+};
+
+struct ip_esp_hdr {
+       __be32 spi;
+       __be32 seq_no;          /* Sequence number */
+       __u8  enc_data[0];      /* Variable len but >=8. Mind the 64 bit alignment! */
+};
+
+struct ip_comp_hdr {
+       __u8 nexthdr;
+       __u8 flags;
+       __be16 cpi;
+};
+
+struct ip_beet_phdr {
+       __u8 nexthdr;
+       __u8 hdrlen;
+       __u8 padlen;
+       __u8 reserved;
+};
+
+/* index values for the variables in ipv4_devconf */
+enum
+{
+       IPV4_DEVCONF_FORWARDING=1,
+       IPV4_DEVCONF_MC_FORWARDING,
+       IPV4_DEVCONF_PROXY_ARP,
+       IPV4_DEVCONF_ACCEPT_REDIRECTS,
+       IPV4_DEVCONF_SECURE_REDIRECTS,
+       IPV4_DEVCONF_SEND_REDIRECTS,
+       IPV4_DEVCONF_SHARED_MEDIA,
+       IPV4_DEVCONF_RP_FILTER,
+       IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE,
+       IPV4_DEVCONF_BOOTP_RELAY,
+       IPV4_DEVCONF_LOG_MARTIANS,
+       IPV4_DEVCONF_TAG,
+       IPV4_DEVCONF_ARPFILTER,
+       IPV4_DEVCONF_MEDIUM_ID,
+       IPV4_DEVCONF_NOXFRM,
+       IPV4_DEVCONF_NOPOLICY,
+       IPV4_DEVCONF_FORCE_IGMP_VERSION,
+       IPV4_DEVCONF_ARP_ANNOUNCE,
+       IPV4_DEVCONF_ARP_IGNORE,
+       IPV4_DEVCONF_PROMOTE_SECONDARIES,
+       IPV4_DEVCONF_ARP_ACCEPT,
+       IPV4_DEVCONF_ARP_NOTIFY,
+       IPV4_DEVCONF_ACCEPT_LOCAL,
+       IPV4_DEVCONF_SRC_VMARK,
+       IPV4_DEVCONF_PROXY_ARP_PVLAN,
+       IPV4_DEVCONF_ROUTE_LOCALNET,
+       IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
+       IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
+       IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
+       IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
+       IPV4_DEVCONF_DROP_GRATUITOUS_ARP,
+       __IPV4_DEVCONF_MAX
+};
+
+#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
+
+#endif /* _LINUX_IP_H */
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
new file mode 100644 (file)
index 0000000..26ee549
--- /dev/null
@@ -0,0 +1,190 @@
+#ifndef _IPV6_H
+#define _IPV6_H
+
+#include <linux/libc-compat.h>
+#include <linux/types.h>
+#include <linux/in6.h>
+#include <asm/byteorder.h>
+
+/* The latest drafts declared increase in minimal mtu up to 1280. */
+
+#define IPV6_MIN_MTU   1280
+
+/*
+ *     Advanced API
+ *     source interface/address selection, source routing, etc...
+ *     *under construction*
+ */
+
+#if __UAPI_DEF_IN6_PKTINFO
+struct in6_pktinfo {
+       struct in6_addr ipi6_addr;
+       int             ipi6_ifindex;
+};
+#endif
+
+#if __UAPI_DEF_IP6_MTUINFO
+struct ip6_mtuinfo {
+       struct sockaddr_in6     ip6m_addr;
+       __u32                   ip6m_mtu;
+};
+#endif
+
+struct in6_ifreq {
+       struct in6_addr ifr6_addr;
+       __u32           ifr6_prefixlen;
+       int             ifr6_ifindex; 
+};
+
+#define IPV6_SRCRT_STRICT      0x01    /* Deprecated; will be removed */
+#define IPV6_SRCRT_TYPE_0      0       /* Deprecated; will be removed */
+#define IPV6_SRCRT_TYPE_2      2       /* IPv6 type 2 Routing Header   */
+#define IPV6_SRCRT_TYPE_4      4       /* Segment Routing with IPv6 */
+
+/*
+ *     routing header
+ */
+struct ipv6_rt_hdr {
+       __u8            nexthdr;
+       __u8            hdrlen;
+       __u8            type;
+       __u8            segments_left;
+
+       /*
+        *      type specific data
+        *      variable length field
+        */
+};
+
+
+struct ipv6_opt_hdr {
+       __u8            nexthdr;
+       __u8            hdrlen;
+       /* 
+        * TLV encoded option data follows.
+        */
+} __attribute__((packed));     /* required for some archs */
+
+#define ipv6_destopt_hdr ipv6_opt_hdr
+#define ipv6_hopopt_hdr  ipv6_opt_hdr
+
+/* Router Alert option values (RFC2711) */
+#define IPV6_OPT_ROUTERALERT_MLD       0x0000  /* MLD(RFC2710) */
+
+/*
+ *     routing header type 0 (used in cmsghdr struct)
+ */
+
+struct rt0_hdr {
+       struct ipv6_rt_hdr      rt_hdr;
+       __u32                   reserved;
+       struct in6_addr         addr[0];
+
+#define rt0_type               rt_hdr.type
+};
+
+/*
+ *     routing header type 2
+ */
+
+struct rt2_hdr {
+       struct ipv6_rt_hdr      rt_hdr;
+       __u32                   reserved;
+       struct in6_addr         addr;
+
+#define rt2_type               rt_hdr.type
+};
+
+/*
+ *     home address option in destination options header
+ */
+
+struct ipv6_destopt_hao {
+       __u8                    type;
+       __u8                    length;
+       struct in6_addr         addr;
+} __attribute__((packed));
+
+/*
+ *     IPv6 fixed header
+ *
+ *     BEWARE, it is incorrect. The first 4 bits of flow_lbl
+ *     are glued to priority now, forming "class".
+ */
+
+struct ipv6hdr {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+       __u8                    priority:4,
+                               version:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+       __u8                    version:4,
+                               priority:4;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif
+       __u8                    flow_lbl[3];
+
+       __be16                  payload_len;
+       __u8                    nexthdr;
+       __u8                    hop_limit;
+
+       struct  in6_addr        saddr;
+       struct  in6_addr        daddr;
+};
+
+
+/* index values for the variables in ipv6_devconf */
+enum {
+       DEVCONF_FORWARDING = 0,
+       DEVCONF_HOPLIMIT,
+       DEVCONF_MTU6,
+       DEVCONF_ACCEPT_RA,
+       DEVCONF_ACCEPT_REDIRECTS,
+       DEVCONF_AUTOCONF,
+       DEVCONF_DAD_TRANSMITS,
+       DEVCONF_RTR_SOLICITS,
+       DEVCONF_RTR_SOLICIT_INTERVAL,
+       DEVCONF_RTR_SOLICIT_DELAY,
+       DEVCONF_USE_TEMPADDR,
+       DEVCONF_TEMP_VALID_LFT,
+       DEVCONF_TEMP_PREFERED_LFT,
+       DEVCONF_REGEN_MAX_RETRY,
+       DEVCONF_MAX_DESYNC_FACTOR,
+       DEVCONF_MAX_ADDRESSES,
+       DEVCONF_FORCE_MLD_VERSION,
+       DEVCONF_ACCEPT_RA_DEFRTR,
+       DEVCONF_ACCEPT_RA_PINFO,
+       DEVCONF_ACCEPT_RA_RTR_PREF,
+       DEVCONF_RTR_PROBE_INTERVAL,
+       DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
+       DEVCONF_PROXY_NDP,
+       DEVCONF_OPTIMISTIC_DAD,
+       DEVCONF_ACCEPT_SOURCE_ROUTE,
+       DEVCONF_MC_FORWARDING,
+       DEVCONF_DISABLE_IPV6,
+       DEVCONF_ACCEPT_DAD,
+       DEVCONF_FORCE_TLLAO,
+       DEVCONF_NDISC_NOTIFY,
+       DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL,
+       DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL,
+       DEVCONF_SUPPRESS_FRAG_NDISC,
+       DEVCONF_ACCEPT_RA_FROM_LOCAL,
+       DEVCONF_USE_OPTIMISTIC,
+       DEVCONF_ACCEPT_RA_MTU,
+       DEVCONF_STABLE_SECRET,
+       DEVCONF_USE_OIF_ADDRS_ONLY,
+       DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT,
+       DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
+       DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
+       DEVCONF_DROP_UNSOLICITED_NA,
+       DEVCONF_KEEP_ADDR_ON_DOWN,
+       DEVCONF_RTR_SOLICIT_MAX_INTERVAL,
+       DEVCONF_SEG6_ENABLED,
+       DEVCONF_SEG6_REQUIRE_HMAC,
+       DEVCONF_ENHANCED_DAD,
+       DEVCONF_ADDR_GEN_MODE,
+       DEVCONF_MAX
+};
+
+
+#endif /* _IPV6_H */
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
new file mode 100644 (file)
index 0000000..527549f
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _LINUX_KERNEL_H
+#define _LINUX_KERNEL_H
+
+#include <linux/sysinfo.h>
+
+/*
+ * 'kernel.h' contains some often-used function prototypes etc
+ */
+#define __ALIGN_KERNEL(x, a)           __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
+#define __ALIGN_KERNEL_MASK(x, mask)   (((x) + (mask)) & ~(mask))
+
+#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+
+#endif /* _LINUX_KERNEL_H */
index ac22738e459846f94e7a0b4c809775ca8506ee64..8a80007bb1ec6c9376fc3b184b6484a5ffd02dd9 100644 (file)
@@ -9,7 +9,8 @@
 
 #include <linux/types.h>
 #include <linux/socket.h>
-#include <netinet/in.h>
+#include <linux/in.h>
+#include <linux/in6.h>
 
 #define IPPROTO_L2TP           115
 
@@ -29,7 +30,7 @@ struct sockaddr_l2tpip {
        __u32           l2tp_conn_id;   /* Connection ID of tunnel */
 
        /* Pad to size of `struct sockaddr'. */
-       unsigned char   __pad[sizeof(struct sockaddr) -
+       unsigned char   __pad[__SOCK_SIZE__ -
                              sizeof(__kernel_sa_family_t) -
                              sizeof(__be16) - sizeof(struct in_addr) -
                              sizeof(__u32)];
diff --git a/include/linux/limits.h b/include/linux/limits.h
new file mode 100644 (file)
index 0000000..2d0f941
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _LINUX_LIMITS_H
+#define _LINUX_LIMITS_H
+
+#define NR_OPEN                1024
+
+#define NGROUPS_MAX    65536   /* supplemental group IDs are available */
+#define ARG_MAX       131072   /* # bytes of args + environ for exec() */
+#define LINK_MAX         127   /* # links a file may have */
+#define MAX_CANON        255   /* size of the canonical input queue */
+#define MAX_INPUT        255   /* size of the type-ahead buffer */
+#define NAME_MAX         255   /* # chars in a file name */
+#define PATH_MAX        4096   /* # chars in a path name including nul */
+#define PIPE_BUF        4096   /* # bytes in atomic write to a pipe */
+#define XATTR_NAME_MAX   255   /* # chars in an extended attribute name */
+#define XATTR_SIZE_MAX 65536   /* size of an extended attribute value (64k) */
+#define XATTR_LIST_MAX 65536   /* size of extended attribute namelist (64k) */
+
+#define RTSIG_MAX        32
+
+#endif
diff --git a/include/linux/magic.h b/include/linux/magic.h
new file mode 100644 (file)
index 0000000..e230af2
--- /dev/null
@@ -0,0 +1,88 @@
+#ifndef __LINUX_MAGIC_H__
+#define __LINUX_MAGIC_H__
+
+#define ADFS_SUPER_MAGIC       0xadf5
+#define AFFS_SUPER_MAGIC       0xadff
+#define AFS_SUPER_MAGIC                0x5346414F
+#define AUTOFS_SUPER_MAGIC     0x0187
+#define CODA_SUPER_MAGIC       0x73757245
+#define CRAMFS_MAGIC           0x28cd3d45      /* some random number */
+#define CRAMFS_MAGIC_WEND      0x453dcd28      /* magic number with the wrong endianess */
+#define DEBUGFS_MAGIC          0x64626720
+#define SECURITYFS_MAGIC       0x73636673
+#define SELINUX_MAGIC          0xf97cff8c
+#define SMACK_MAGIC            0x43415d53      /* "SMAC" */
+#define RAMFS_MAGIC            0x858458f6      /* some random number */
+#define TMPFS_MAGIC            0x01021994
+#define HUGETLBFS_MAGIC        0x958458f6      /* some random number */
+#define SQUASHFS_MAGIC         0x73717368
+#define ECRYPTFS_SUPER_MAGIC   0xf15f
+#define EFS_SUPER_MAGIC                0x414A53
+#define EXT2_SUPER_MAGIC       0xEF53
+#define EXT3_SUPER_MAGIC       0xEF53
+#define XENFS_SUPER_MAGIC      0xabba1974
+#define EXT4_SUPER_MAGIC       0xEF53
+#define BTRFS_SUPER_MAGIC      0x9123683E
+#define NILFS_SUPER_MAGIC      0x3434
+#define F2FS_SUPER_MAGIC       0xF2F52010
+#define HPFS_SUPER_MAGIC       0xf995e849
+#define ISOFS_SUPER_MAGIC      0x9660
+#define JFFS2_SUPER_MAGIC      0x72b6
+#define PSTOREFS_MAGIC         0x6165676C
+#define EFIVARFS_MAGIC         0xde5e81e4
+#define HOSTFS_SUPER_MAGIC     0x00c0ffee
+#define OVERLAYFS_SUPER_MAGIC  0x794c7630
+
+#define MINIX_SUPER_MAGIC      0x137F          /* minix v1 fs, 14 char names */
+#define MINIX_SUPER_MAGIC2     0x138F          /* minix v1 fs, 30 char names */
+#define MINIX2_SUPER_MAGIC     0x2468          /* minix v2 fs, 14 char names */
+#define MINIX2_SUPER_MAGIC2    0x2478          /* minix v2 fs, 30 char names */
+#define MINIX3_SUPER_MAGIC     0x4d5a          /* minix v3 fs, 60 char names */
+
+#define MSDOS_SUPER_MAGIC      0x4d44          /* MD */
+#define NCP_SUPER_MAGIC                0x564c          /* Guess, what 0x564c is :-) */
+#define NFS_SUPER_MAGIC                0x6969
+#define OPENPROM_SUPER_MAGIC   0x9fa1
+#define QNX4_SUPER_MAGIC       0x002f          /* qnx4 fs detection */
+#define QNX6_SUPER_MAGIC       0x68191122      /* qnx6 fs detection */
+
+#define REISERFS_SUPER_MAGIC   0x52654973      /* used by gcc */
+                                       /* used by file system utilities that
+                                          look at the superblock, etc.  */
+#define REISERFS_SUPER_MAGIC_STRING    "ReIsErFs"
+#define REISER2FS_SUPER_MAGIC_STRING   "ReIsEr2Fs"
+#define REISER2FS_JR_SUPER_MAGIC_STRING        "ReIsEr3Fs"
+
+#define SMB_SUPER_MAGIC                0x517B
+#define CGROUP_SUPER_MAGIC     0x27e0eb
+#define CGROUP2_SUPER_MAGIC    0x63677270
+
+#define RDTGROUP_SUPER_MAGIC   0x7655821
+
+#define STACK_END_MAGIC                0x57AC6E9D
+
+#define TRACEFS_MAGIC          0x74726163
+
+#define V9FS_MAGIC             0x01021997
+
+#define BDEVFS_MAGIC            0x62646576
+#define DAXFS_MAGIC             0x64646178
+#define BINFMTFS_MAGIC          0x42494e4d
+#define DEVPTS_SUPER_MAGIC     0x1cd1
+#define FUTEXFS_SUPER_MAGIC    0xBAD1DEA
+#define PIPEFS_MAGIC            0x50495045
+#define PROC_SUPER_MAGIC       0x9fa0
+#define SOCKFS_MAGIC           0x534F434B
+#define SYSFS_MAGIC            0x62656572
+#define USBDEVICE_SUPER_MAGIC  0x9fa2
+#define MTD_INODE_FS_MAGIC      0x11307854
+#define ANON_INODE_FS_MAGIC    0x09041934
+#define BTRFS_TEST_MAGIC       0x73727279
+#define NSFS_MAGIC             0x6e736673
+#define BPF_FS_MAGIC           0xcafe4a11
+/* Since UDF 2.01 is ISO 13346 based... */
+#define UDF_SUPER_MAGIC                0x15013346
+#define BALLOON_KVM_MAGIC      0x13661366
+#define ZSMALLOC_MAGIC         0x58295829
+
+#endif /* __LINUX_MAGIC_H__ */
index a14b54b5ccaf838bb06fa0179506903a429fb63d..bf5b6259058f1e209e906a5e6f1c7c2e3ae24042 100644 (file)
@@ -43,4 +43,34 @@ struct mpls_label {
 
 #define MPLS_LABEL_FIRST_UNRESERVED    16 /* RFC3032 */
 
+/* These are embedded into IFLA_STATS_AF_SPEC:
+ * [IFLA_STATS_AF_SPEC]
+ * -> [AF_MPLS]
+ *    -> [MPLS_STATS_xxx]
+ *
+ * Attributes:
+ * [MPLS_STATS_LINK] = {
+ *     struct mpls_link_stats
+ * }
+ */
+enum {
+       MPLS_STATS_UNSPEC, /* also used as 64bit pad attribute */
+       MPLS_STATS_LINK,
+       __MPLS_STATS_MAX,
+};
+
+#define MPLS_STATS_MAX (__MPLS_STATS_MAX - 1)
+
+struct mpls_link_stats {
+       __u64   rx_packets;             /* total packets received       */
+       __u64   tx_packets;             /* total packets transmitted    */
+       __u64   rx_bytes;               /* total bytes received         */
+       __u64   tx_bytes;               /* total bytes transmitted      */
+       __u64   rx_errors;              /* bad packets received         */
+       __u64   tx_errors;              /* packet transmit problems     */
+       __u64   rx_dropped;             /* packet dropped on receive    */
+       __u64   tx_dropped;             /* packet dropped on transmit   */
+       __u64   rx_noroute;             /* no route for packet dest     */
+};
+
 #endif /* _MPLS_H */
index bd99a8d80f36e527094f05ceabb55c21ea004ae7..f3d16dbe09d64424d2d92c581f30771f6add6e0b 100644 (file)
@@ -26,6 +26,7 @@ enum {
        NDA_IFINDEX,
        NDA_MASTER,
        NDA_LINK_NETNSID,
+       NDA_SRC_VNI,
        __NDA_MAX
 };
 
diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h
new file mode 100644 (file)
index 0000000..a6c96b0
--- /dev/null
@@ -0,0 +1,304 @@
+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
+ *                         Patrick Schaaf <bof@bof.de>
+ *                         Martin Josefsson <gandalf@wlug.westbo.se>
+ * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef _IP_SET_H
+#define _IP_SET_H
+
+#include <linux/types.h>
+
+/* The protocol version */
+#define IPSET_PROTOCOL         6
+
+/* The max length of strings including NUL: set and type identifiers */
+#define IPSET_MAXNAMELEN       32
+
+/* The maximum permissible comment length we will accept over netlink */
+#define IPSET_MAX_COMMENT_SIZE 255
+
+/* Message types and commands */
+enum ipset_cmd {
+       IPSET_CMD_NONE,
+       IPSET_CMD_PROTOCOL,     /* 1: Return protocol version */
+       IPSET_CMD_CREATE,       /* 2: Create a new (empty) set */
+       IPSET_CMD_DESTROY,      /* 3: Destroy a (empty) set */
+       IPSET_CMD_FLUSH,        /* 4: Remove all elements from a set */
+       IPSET_CMD_RENAME,       /* 5: Rename a set */
+       IPSET_CMD_SWAP,         /* 6: Swap two sets */
+       IPSET_CMD_LIST,         /* 7: List sets */
+       IPSET_CMD_SAVE,         /* 8: Save sets */
+       IPSET_CMD_ADD,          /* 9: Add an element to a set */
+       IPSET_CMD_DEL,          /* 10: Delete an element from a set */
+       IPSET_CMD_TEST,         /* 11: Test an element in a set */
+       IPSET_CMD_HEADER,       /* 12: Get set header data only */
+       IPSET_CMD_TYPE,         /* 13: Get set type */
+       IPSET_MSG_MAX,          /* Netlink message commands */
+
+       /* Commands in userspace: */
+       IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */
+       IPSET_CMD_HELP,         /* 15: Get help */
+       IPSET_CMD_VERSION,      /* 16: Get program version */
+       IPSET_CMD_QUIT,         /* 17: Quit from interactive mode */
+
+       IPSET_CMD_MAX,
+
+       IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */
+};
+
+/* Attributes at command level */
+enum {
+       IPSET_ATTR_UNSPEC,
+       IPSET_ATTR_PROTOCOL,    /* 1: Protocol version */
+       IPSET_ATTR_SETNAME,     /* 2: Name of the set */
+       IPSET_ATTR_TYPENAME,    /* 3: Typename */
+       IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */
+       IPSET_ATTR_REVISION,    /* 4: Settype revision */
+       IPSET_ATTR_FAMILY,      /* 5: Settype family */
+       IPSET_ATTR_FLAGS,       /* 6: Flags at command level */
+       IPSET_ATTR_DATA,        /* 7: Nested attributes */
+       IPSET_ATTR_ADT,         /* 8: Multiple data containers */
+       IPSET_ATTR_LINENO,      /* 9: Restore lineno */
+       IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */
+       IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */
+       __IPSET_ATTR_CMD_MAX,
+};
+#define IPSET_ATTR_CMD_MAX     (__IPSET_ATTR_CMD_MAX - 1)
+
+/* CADT specific attributes */
+enum {
+       IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1,
+       IPSET_ATTR_IP_FROM = IPSET_ATTR_IP,
+       IPSET_ATTR_IP_TO,       /* 2 */
+       IPSET_ATTR_CIDR,        /* 3 */
+       IPSET_ATTR_PORT,        /* 4 */
+       IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT,
+       IPSET_ATTR_PORT_TO,     /* 5 */
+       IPSET_ATTR_TIMEOUT,     /* 6 */
+       IPSET_ATTR_PROTO,       /* 7 */
+       IPSET_ATTR_CADT_FLAGS,  /* 8 */
+       IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO,     /* 9 */
+       IPSET_ATTR_MARK,        /* 10 */
+       IPSET_ATTR_MARKMASK,    /* 11 */
+       /* Reserve empty slots */
+       IPSET_ATTR_CADT_MAX = 16,
+       /* Create-only specific attributes */
+       IPSET_ATTR_GC,
+       IPSET_ATTR_HASHSIZE,
+       IPSET_ATTR_MAXELEM,
+       IPSET_ATTR_NETMASK,
+       IPSET_ATTR_PROBES,
+       IPSET_ATTR_RESIZE,
+       IPSET_ATTR_SIZE,
+       /* Kernel-only */
+       IPSET_ATTR_ELEMENTS,
+       IPSET_ATTR_REFERENCES,
+       IPSET_ATTR_MEMSIZE,
+
+       __IPSET_ATTR_CREATE_MAX,
+};
+#define IPSET_ATTR_CREATE_MAX  (__IPSET_ATTR_CREATE_MAX - 1)
+
+/* ADT specific attributes */
+enum {
+       IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1,
+       IPSET_ATTR_NAME,
+       IPSET_ATTR_NAMEREF,
+       IPSET_ATTR_IP2,
+       IPSET_ATTR_CIDR2,
+       IPSET_ATTR_IP2_TO,
+       IPSET_ATTR_IFACE,
+       IPSET_ATTR_BYTES,
+       IPSET_ATTR_PACKETS,
+       IPSET_ATTR_COMMENT,
+       IPSET_ATTR_SKBMARK,
+       IPSET_ATTR_SKBPRIO,
+       IPSET_ATTR_SKBQUEUE,
+       IPSET_ATTR_PAD,
+       __IPSET_ATTR_ADT_MAX,
+};
+#define IPSET_ATTR_ADT_MAX     (__IPSET_ATTR_ADT_MAX - 1)
+
+/* IP specific attributes */
+enum {
+       IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1,
+       IPSET_ATTR_IPADDR_IPV6,
+       __IPSET_ATTR_IPADDR_MAX,
+};
+#define IPSET_ATTR_IPADDR_MAX  (__IPSET_ATTR_IPADDR_MAX - 1)
+
+/* Error codes */
+enum ipset_errno {
+       IPSET_ERR_PRIVATE = 4096,
+       IPSET_ERR_PROTOCOL,
+       IPSET_ERR_FIND_TYPE,
+       IPSET_ERR_MAX_SETS,
+       IPSET_ERR_BUSY,
+       IPSET_ERR_EXIST_SETNAME2,
+       IPSET_ERR_TYPE_MISMATCH,
+       IPSET_ERR_EXIST,
+       IPSET_ERR_INVALID_CIDR,
+       IPSET_ERR_INVALID_NETMASK,
+       IPSET_ERR_INVALID_FAMILY,
+       IPSET_ERR_TIMEOUT,
+       IPSET_ERR_REFERENCED,
+       IPSET_ERR_IPADDR_IPV4,
+       IPSET_ERR_IPADDR_IPV6,
+       IPSET_ERR_COUNTER,
+       IPSET_ERR_COMMENT,
+       IPSET_ERR_INVALID_MARKMASK,
+       IPSET_ERR_SKBINFO,
+
+       /* Type specific error codes */
+       IPSET_ERR_TYPE_SPECIFIC = 4352,
+};
+
+/* Flags at command level or match/target flags, lower half of cmdattrs*/
+enum ipset_cmd_flags {
+       IPSET_FLAG_BIT_EXIST    = 0,
+       IPSET_FLAG_EXIST        = (1 << IPSET_FLAG_BIT_EXIST),
+       IPSET_FLAG_BIT_LIST_SETNAME = 1,
+       IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME),
+       IPSET_FLAG_BIT_LIST_HEADER = 2,
+       IPSET_FLAG_LIST_HEADER  = (1 << IPSET_FLAG_BIT_LIST_HEADER),
+       IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3,
+       IPSET_FLAG_SKIP_COUNTER_UPDATE =
+               (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE),
+       IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4,
+       IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE =
+               (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE),
+       IPSET_FLAG_BIT_MATCH_COUNTERS = 5,
+       IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS),
+       IPSET_FLAG_BIT_RETURN_NOMATCH = 7,
+       IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH),
+       IPSET_FLAG_BIT_MAP_SKBMARK = 8,
+       IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK),
+       IPSET_FLAG_BIT_MAP_SKBPRIO = 9,
+       IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO),
+       IPSET_FLAG_BIT_MAP_SKBQUEUE = 10,
+       IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE),
+       IPSET_FLAG_CMD_MAX = 15,
+};
+
+/* Flags at CADT attribute level, upper half of cmdattrs */
+enum ipset_cadt_flags {
+       IPSET_FLAG_BIT_BEFORE   = 0,
+       IPSET_FLAG_BEFORE       = (1 << IPSET_FLAG_BIT_BEFORE),
+       IPSET_FLAG_BIT_PHYSDEV  = 1,
+       IPSET_FLAG_PHYSDEV      = (1 << IPSET_FLAG_BIT_PHYSDEV),
+       IPSET_FLAG_BIT_NOMATCH  = 2,
+       IPSET_FLAG_NOMATCH      = (1 << IPSET_FLAG_BIT_NOMATCH),
+       IPSET_FLAG_BIT_WITH_COUNTERS = 3,
+       IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS),
+       IPSET_FLAG_BIT_WITH_COMMENT = 4,
+       IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT),
+       IPSET_FLAG_BIT_WITH_FORCEADD = 5,
+       IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD),
+       IPSET_FLAG_BIT_WITH_SKBINFO = 6,
+       IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO),
+       IPSET_FLAG_CADT_MAX     = 15,
+};
+
+/* The flag bits which correspond to the non-extension create flags */
+enum ipset_create_flags {
+       IPSET_CREATE_FLAG_BIT_FORCEADD = 0,
+       IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD),
+       IPSET_CREATE_FLAG_BIT_MAX = 7,
+};
+
+/* Commands with settype-specific attributes */
+enum ipset_adt {
+       IPSET_ADD,
+       IPSET_DEL,
+       IPSET_TEST,
+       IPSET_ADT_MAX,
+       IPSET_CREATE = IPSET_ADT_MAX,
+       IPSET_CADT_MAX,
+};
+
+/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t
+ * and IPSET_INVALID_ID if you want to increase the max number of sets.
+ */
+typedef __u16 ip_set_id_t;
+
+#define IPSET_INVALID_ID               65535
+
+enum ip_set_dim {
+       IPSET_DIM_ZERO = 0,
+       IPSET_DIM_ONE,
+       IPSET_DIM_TWO,
+       IPSET_DIM_THREE,
+       /* Max dimension in elements.
+        * If changed, new revision of iptables match/target is required.
+        */
+       IPSET_DIM_MAX = 6,
+       /* Backward compatibility: set match revision 2 */
+       IPSET_BIT_RETURN_NOMATCH = 7,
+};
+
+/* Option flags for kernel operations */
+enum ip_set_kopt {
+       IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO),
+       IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE),
+       IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO),
+       IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE),
+       IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH),
+};
+
+enum {
+       IPSET_COUNTER_NONE = 0,
+       IPSET_COUNTER_EQ,
+       IPSET_COUNTER_NE,
+       IPSET_COUNTER_LT,
+       IPSET_COUNTER_GT,
+};
+
+/* Backward compatibility for set match v3 */
+struct ip_set_counter_match0 {
+       __u8 op;
+       __u64 value;
+};
+
+struct ip_set_counter_match {
+       __aligned_u64 value;
+       __u8 op;
+};
+
+/* Interface to iptables/ip6tables */
+
+#define SO_IP_SET              83
+
+union ip_set_name_index {
+       char name[IPSET_MAXNAMELEN];
+       ip_set_id_t index;
+};
+
+#define IP_SET_OP_GET_BYNAME   0x00000006      /* Get set index by name */
+struct ip_set_req_get_set {
+       unsigned int op;
+       unsigned int version;
+       union ip_set_name_index set;
+};
+
+#define IP_SET_OP_GET_BYINDEX  0x00000007      /* Get set name by index */
+/* Uses ip_set_req_get_set */
+
+#define IP_SET_OP_GET_FNAME    0x00000008      /* Get set index and family */
+struct ip_set_req_get_set_family {
+       unsigned int op;
+       unsigned int version;
+       unsigned int family;
+       union ip_set_name_index set;
+};
+
+#define IP_SET_OP_VERSION      0x00000100      /* Ask kernel version */
+struct ip_set_req_version {
+       unsigned int op;
+       unsigned int version;
+};
+
+#endif /* _IP_SET_H */
diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h
new file mode 100644 (file)
index 0000000..d4e0234
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef _XT_SET_H
+#define _XT_SET_H
+
+#include <linux/types.h>
+#include <linux/netfilter/ipset/ip_set.h>
+
+/* Revision 0 interface: backward compatible with netfilter/iptables */
+
+/*
+ * Option flags for kernel operations (xt_set_info_v0)
+ */
+#define IPSET_SRC              0x01    /* Source match/add */
+#define IPSET_DST              0x02    /* Destination match/add */
+#define IPSET_MATCH_INV                0x04    /* Inverse matching */
+
+struct xt_set_info_v0 {
+       ip_set_id_t index;
+       union {
+               __u32 flags[IPSET_DIM_MAX + 1];
+               struct {
+                       __u32 __flags[IPSET_DIM_MAX];
+                       __u8 dim;
+                       __u8 flags;
+               } compat;
+       } u;
+};
+
+/* match and target infos */
+struct xt_set_info_match_v0 {
+       struct xt_set_info_v0 match_set;
+};
+
+struct xt_set_info_target_v0 {
+       struct xt_set_info_v0 add_set;
+       struct xt_set_info_v0 del_set;
+};
+
+/* Revision 1  match and target */
+
+struct xt_set_info {
+       ip_set_id_t index;
+       __u8 dim;
+       __u8 flags;
+};
+
+/* match and target infos */
+struct xt_set_info_match_v1 {
+       struct xt_set_info match_set;
+};
+
+struct xt_set_info_target_v1 {
+       struct xt_set_info add_set;
+       struct xt_set_info del_set;
+};
+
+/* Revision 2 target */
+
+struct xt_set_info_target_v2 {
+       struct xt_set_info add_set;
+       struct xt_set_info del_set;
+       __u32 flags;
+       __u32 timeout;
+};
+
+/* Revision 3 match */
+
+struct xt_set_info_match_v3 {
+       struct xt_set_info match_set;
+       struct ip_set_counter_match0 packets;
+       struct ip_set_counter_match0 bytes;
+       __u32 flags;
+};
+
+/* Revision 3 target */
+
+struct xt_set_info_target_v3 {
+       struct xt_set_info add_set;
+       struct xt_set_info del_set;
+       struct xt_set_info map_set;
+       __u32 flags;
+       __u32 timeout;
+};
+
+/* Revision 4 match */
+
+struct xt_set_info_match_v4 {
+       struct xt_set_info match_set;
+       struct ip_set_counter_match packets;
+       struct ip_set_counter_match bytes;
+       __u32 flags;
+};
+
+#endif /*_XT_SET_H*/
diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h
new file mode 100644 (file)
index 0000000..8483d1d
--- /dev/null
@@ -0,0 +1,77 @@
+/* IPv6-specific defines for netfilter. 
+ * (C)1998 Rusty Russell -- This code is GPL.
+ * (C)1999 David Jeffery
+ *   this header was blatantly ripped from netfilter_ipv4.h 
+ *   it's amazing what adding a bunch of 6s can do =8^)
+ */
+#ifndef __LINUX_IP6_NETFILTER_H
+#define __LINUX_IP6_NETFILTER_H
+
+
+#include <linux/netfilter.h>
+
+/* only for userspace compatibility */
+
+#include <limits.h> /* for INT_MIN, INT_MAX */
+
+/* IP Cache bits. */
+/* Src IP address. */
+#define NFC_IP6_SRC              0x0001
+/* Dest IP address. */
+#define NFC_IP6_DST              0x0002
+/* Input device. */
+#define NFC_IP6_IF_IN            0x0004
+/* Output device. */
+#define NFC_IP6_IF_OUT           0x0008
+/* TOS. */
+#define NFC_IP6_TOS              0x0010
+/* Protocol. */
+#define NFC_IP6_PROTO            0x0020
+/* IP options. */
+#define NFC_IP6_OPTIONS          0x0040
+/* Frag & flags. */
+#define NFC_IP6_FRAG             0x0080
+
+
+/* Per-protocol information: only matters if proto match. */
+/* TCP flags. */
+#define NFC_IP6_TCPFLAGS         0x0100
+/* Source port. */
+#define NFC_IP6_SRC_PT           0x0200
+/* Dest port. */
+#define NFC_IP6_DST_PT           0x0400
+/* Something else about the proto */
+#define NFC_IP6_PROTO_UNKNOWN    0x2000
+
+/* IP6 Hooks */
+/* After promisc drops, checksum checks. */
+#define NF_IP6_PRE_ROUTING     0
+/* If the packet is destined for this box. */
+#define NF_IP6_LOCAL_IN                1
+/* If the packet is destined for another interface. */
+#define NF_IP6_FORWARD         2
+/* Packets coming from a local process. */
+#define NF_IP6_LOCAL_OUT               3
+/* Packets about to hit the wire. */
+#define NF_IP6_POST_ROUTING    4
+#define NF_IP6_NUMHOOKS                5
+
+
+enum nf_ip6_hook_priorities {
+       NF_IP6_PRI_FIRST = INT_MIN,
+       NF_IP6_PRI_CONNTRACK_DEFRAG = -400,
+       NF_IP6_PRI_RAW = -300,
+       NF_IP6_PRI_SELINUX_FIRST = -225,
+       NF_IP6_PRI_CONNTRACK = -200,
+       NF_IP6_PRI_MANGLE = -150,
+       NF_IP6_PRI_NAT_DST = -100,
+       NF_IP6_PRI_FILTER = 0,
+       NF_IP6_PRI_SECURITY = 50,
+       NF_IP6_PRI_NAT_SRC = 100,
+       NF_IP6_PRI_SELINUX_LAST = 225,
+       NF_IP6_PRI_CONNTRACK_HELPER = 300,
+       NF_IP6_PRI_LAST = INT_MAX,
+};
+
+
+#endif /* __LINUX_IP6_NETFILTER_H */
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h
new file mode 100644 (file)
index 0000000..fcc8cca
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * 25-Jul-1998 Major changes to allow for ip chain table
+ *
+ * 3-Jan-2000 Named tables to allow packet selection for different uses.
+ */
+
+/*
+ *     Format of an IP6 firewall descriptor
+ *
+ *     src, dst, src_mask, dst_mask are always stored in network byte order.
+ *     flags are stored in host byte order (of course).
+ *     Port numbers are stored in HOST byte order.
+ */
+
+#ifndef _IP6_TABLES_H
+#define _IP6_TABLES_H
+
+#include <linux/types.h>
+
+#include <linux/if.h>
+#include <linux/netfilter_ipv6.h>
+
+#include <linux/netfilter/x_tables.h>
+
+#define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN
+#define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN
+#define ip6t_match xt_match
+#define ip6t_target xt_target
+#define ip6t_table xt_table
+#define ip6t_get_revision xt_get_revision
+#define ip6t_entry_match xt_entry_match
+#define ip6t_entry_target xt_entry_target
+#define ip6t_standard_target xt_standard_target
+#define ip6t_error_target xt_error_target
+#define ip6t_counters xt_counters
+#define IP6T_CONTINUE XT_CONTINUE
+#define IP6T_RETURN XT_RETURN
+
+/* Pre-iptables-1.4.0 */
+#include <linux/netfilter/xt_tcpudp.h>
+#define ip6t_tcp xt_tcp
+#define ip6t_udp xt_udp
+#define IP6T_TCP_INV_SRCPT     XT_TCP_INV_SRCPT
+#define IP6T_TCP_INV_DSTPT     XT_TCP_INV_DSTPT
+#define IP6T_TCP_INV_FLAGS     XT_TCP_INV_FLAGS
+#define IP6T_TCP_INV_OPTION    XT_TCP_INV_OPTION
+#define IP6T_TCP_INV_MASK      XT_TCP_INV_MASK
+#define IP6T_UDP_INV_SRCPT     XT_UDP_INV_SRCPT
+#define IP6T_UDP_INV_DSTPT     XT_UDP_INV_DSTPT
+#define IP6T_UDP_INV_MASK      XT_UDP_INV_MASK
+
+#define ip6t_counters_info xt_counters_info
+#define IP6T_STANDARD_TARGET XT_STANDARD_TARGET
+#define IP6T_ERROR_TARGET XT_ERROR_TARGET
+#define IP6T_MATCH_ITERATE(e, fn, args...) \
+       XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args)
+#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \
+       XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args)
+
+/* Yes, Virginia, you have to zero the padding. */
+struct ip6t_ip6 {
+       /* Source and destination IP6 addr */
+       struct in6_addr src, dst;               
+       /* Mask for src and dest IP6 addr */
+       struct in6_addr smsk, dmsk;
+       char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
+       unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
+
+       /* Upper protocol number
+        * - The allowed value is 0 (any) or protocol number of last parsable
+        *   header, which is 50 (ESP), 59 (No Next Header), 135 (MH), or
+        *   the non IPv6 extension headers.
+        * - The protocol numbers of IPv6 extension headers except of ESP and
+        *   MH do not match any packets.
+        * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol.
+        */
+       __u16 proto;
+       /* TOS to match iff flags & IP6T_F_TOS */
+       __u8 tos;
+
+       /* Flags word */
+       __u8 flags;
+       /* Inverse flags */
+       __u8 invflags;
+};
+
+/* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */
+#define IP6T_F_PROTO           0x01    /* Set if rule cares about upper 
+                                          protocols */
+#define IP6T_F_TOS             0x02    /* Match the TOS. */
+#define IP6T_F_GOTO            0x04    /* Set if jump is a goto */
+#define IP6T_F_MASK            0x07    /* All possible flag bits mask. */
+
+/* Values for "inv" field in struct ip6t_ip6. */
+#define IP6T_INV_VIA_IN                0x01    /* Invert the sense of IN IFACE. */
+#define IP6T_INV_VIA_OUT               0x02    /* Invert the sense of OUT IFACE */
+#define IP6T_INV_TOS           0x04    /* Invert the sense of TOS. */
+#define IP6T_INV_SRCIP         0x08    /* Invert the sense of SRC IP. */
+#define IP6T_INV_DSTIP         0x10    /* Invert the sense of DST OP. */
+#define IP6T_INV_FRAG          0x20    /* Invert the sense of FRAG. */
+#define IP6T_INV_PROTO         XT_INV_PROTO
+#define IP6T_INV_MASK          0x7F    /* All possible flag bits mask. */
+
+/* This structure defines each of the firewall rules.  Consists of 3
+   parts which are 1) general IP header stuff 2) match specific
+   stuff 3) the target to perform if the rule matches */
+struct ip6t_entry {
+       struct ip6t_ip6 ipv6;
+
+       /* Mark with fields that we care about. */
+       unsigned int nfcache;
+
+       /* Size of ipt_entry + matches */
+       __u16 target_offset;
+       /* Size of ipt_entry + matches + target */
+       __u16 next_offset;
+
+       /* Back pointer */
+       unsigned int comefrom;
+
+       /* Packet and byte counters. */
+       struct xt_counters counters;
+
+       /* The matches (if any), then the target. */
+       unsigned char elems[0];
+};
+
+/* Standard entry */
+struct ip6t_standard {
+       struct ip6t_entry entry;
+       struct xt_standard_target target;
+};
+
+struct ip6t_error {
+       struct ip6t_entry entry;
+       struct xt_error_target target;
+};
+
+#define IP6T_ENTRY_INIT(__size)                                                       \
+{                                                                             \
+       .target_offset  = sizeof(struct ip6t_entry),                           \
+       .next_offset    = (__size),                                            \
+}
+
+#define IP6T_STANDARD_INIT(__verdict)                                         \
+{                                                                             \
+       .entry          = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)),       \
+       .target         = XT_TARGET_INIT(XT_STANDARD_TARGET,                   \
+                                        sizeof(struct xt_standard_target)),   \
+       .target.verdict = -(__verdict) - 1,                                    \
+}
+
+#define IP6T_ERROR_INIT                                                               \
+{                                                                             \
+       .entry          = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)),          \
+       .target         = XT_TARGET_INIT(XT_ERROR_TARGET,                      \
+                                        sizeof(struct xt_error_target)),      \
+       .target.errorname = "ERROR",                                           \
+}
+
+/*
+ * New IP firewall options for [gs]etsockopt at the RAW IP level.
+ * Unlike BSD Linux inherits IP options so you don't have to use
+ * a raw socket for this. Instead we check rights in the calls.
+ *
+ * ATTENTION: check linux/in6.h before adding new number here.
+ */
+#define IP6T_BASE_CTL                  64
+
+#define IP6T_SO_SET_REPLACE            (IP6T_BASE_CTL)
+#define IP6T_SO_SET_ADD_COUNTERS       (IP6T_BASE_CTL + 1)
+#define IP6T_SO_SET_MAX                        IP6T_SO_SET_ADD_COUNTERS
+
+#define IP6T_SO_GET_INFO               (IP6T_BASE_CTL)
+#define IP6T_SO_GET_ENTRIES            (IP6T_BASE_CTL + 1)
+#define IP6T_SO_GET_REVISION_MATCH     (IP6T_BASE_CTL + 4)
+#define IP6T_SO_GET_REVISION_TARGET    (IP6T_BASE_CTL + 5)
+#define IP6T_SO_GET_MAX                        IP6T_SO_GET_REVISION_TARGET
+
+/* obtain original address if REDIRECT'd connection */
+#define IP6T_SO_ORIGINAL_DST            80
+
+/* ICMP matching stuff */
+struct ip6t_icmp {
+       __u8 type;                              /* type to match */
+       __u8 code[2];                           /* range of code */
+       __u8 invflags;                          /* Inverse flags */
+};
+
+/* Values for "inv" field for struct ipt_icmp. */
+#define IP6T_ICMP_INV  0x01    /* Invert the sense of type/code test */
+
+/* The argument to IP6T_SO_GET_INFO */
+struct ip6t_getinfo {
+       /* Which table: caller fills this in. */
+       char name[XT_TABLE_MAXNAMELEN];
+
+       /* Kernel fills these in. */
+       /* Which hook entry points are valid: bitmask */
+       unsigned int valid_hooks;
+
+       /* Hook entry points: one per netfilter hook. */
+       unsigned int hook_entry[NF_INET_NUMHOOKS];
+
+       /* Underflow points. */
+       unsigned int underflow[NF_INET_NUMHOOKS];
+
+       /* Number of entries */
+       unsigned int num_entries;
+
+       /* Size of entries. */
+       unsigned int size;
+};
+
+/* The argument to IP6T_SO_SET_REPLACE. */
+struct ip6t_replace {
+       /* Which table. */
+       char name[XT_TABLE_MAXNAMELEN];
+
+       /* Which hook entry points are valid: bitmask.  You can't
+           change this. */
+       unsigned int valid_hooks;
+
+       /* Number of entries */
+       unsigned int num_entries;
+
+       /* Total size of new entries */
+       unsigned int size;
+
+       /* Hook entry points. */
+       unsigned int hook_entry[NF_INET_NUMHOOKS];
+
+       /* Underflow points. */
+       unsigned int underflow[NF_INET_NUMHOOKS];
+
+       /* Information about old entries: */
+       /* Number of counters (must be equal to current number of entries). */
+       unsigned int num_counters;
+       /* The old entries' counters. */
+       struct xt_counters *counters;
+
+       /* The entries (hang off end: not really an array). */
+       struct ip6t_entry entries[0];
+};
+
+/* The argument to IP6T_SO_GET_ENTRIES. */
+struct ip6t_get_entries {
+       /* Which table: user fills this in. */
+       char name[XT_TABLE_MAXNAMELEN];
+
+       /* User fills this in: total entry size. */
+       unsigned int size;
+
+       /* The entries. */
+       struct ip6t_entry entrytable[0];
+};
+
+/* Helper functions */
+static __inline__ struct xt_entry_target *
+ip6t_get_target(struct ip6t_entry *e)
+{
+       return (void *)e + e->target_offset;
+}
+
+/*
+ *     Main firewall chains definitions and global var's definitions.
+ */
+
+#endif /* _IP6_TABLES_H */
index 8a7ca5c6f9ae8a7d77ca50c096eb06f9e5112e35..a982b3c004395d27d6f6ce1d93f3ab3fc077a9a3 100644 (file)
@@ -27,6 +27,7 @@
 #define NETLINK_ECRYPTFS       19
 #define NETLINK_RDMA           20
 #define NETLINK_CRYPTO         21      /* Crypto layer */
+#define NETLINK_SMC            22      /* SMC monitoring */
 
 #define NETLINK_INET_DIAG      NETLINK_SOCK_DIAG
 
diff --git a/include/linux/param.h b/include/linux/param.h
new file mode 100644 (file)
index 0000000..092e92f
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _LINUX_PARAM_H
+#define _LINUX_PARAM_H
+
+#include <asm/param.h>
+
+#endif
index af17f3c75ed826b0134f0906e509ec1b1ab4b38f..7a69f2a4ca0c06a68487ff382c6b84f8acab323b 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/types.h>
 #include <linux/pkt_sched.h>
 
+#define TC_COOKIE_MAX_SIZE 16
 
 /* Action attributes */
 enum {
@@ -13,6 +14,7 @@ enum {
        TCA_ACT_INDEX,
        TCA_ACT_STATS,
        TCA_ACT_PAD,
+       TCA_ACT_COOKIE,
        __TCA_ACT_MAX
 };
 
@@ -101,8 +103,10 @@ enum {
 #define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
 
 /* tca flags definitions */
-#define TCA_CLS_FLAGS_SKIP_HW  (1 << 0)
-#define TCA_CLS_FLAGS_SKIP_SW  (1 << 1)
+#define TCA_CLS_FLAGS_SKIP_HW  (1 << 0) /* don't offload filter to HW */
+#define TCA_CLS_FLAGS_SKIP_SW  (1 << 1) /* don't use filter in SW */
+#define TCA_CLS_FLAGS_IN_HW    (1 << 2) /* filter is offloaded to HW */
+#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */
 
 /* U32 filters */
 
@@ -417,6 +421,17 @@ enum {
        TCA_FLOWER_KEY_ICMPV6_TYPE,     /* u8 */
        TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */
 
+       TCA_FLOWER_KEY_ARP_SIP,         /* be32 */
+       TCA_FLOWER_KEY_ARP_SIP_MASK,    /* be32 */
+       TCA_FLOWER_KEY_ARP_TIP,         /* be32 */
+       TCA_FLOWER_KEY_ARP_TIP_MASK,    /* be32 */
+       TCA_FLOWER_KEY_ARP_OP,          /* u8 */
+       TCA_FLOWER_KEY_ARP_OP_MASK,     /* u8 */
+       TCA_FLOWER_KEY_ARP_SHA,         /* ETH_ALEN */
+       TCA_FLOWER_KEY_ARP_SHA_MASK,    /* ETH_ALEN */
+       TCA_FLOWER_KEY_ARP_THA,         /* ETH_ALEN */
+       TCA_FLOWER_KEY_ARP_THA_MASK,    /* ETH_ALEN */
+
        __TCA_FLOWER_MAX,
 };
 
diff --git a/include/linux/posix_types.h b/include/linux/posix_types.h
new file mode 100644 (file)
index 0000000..988f76e
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _LINUX_POSIX_TYPES_H
+#define _LINUX_POSIX_TYPES_H
+
+#include <linux/stddef.h>
+
+/*
+ * This allows for 1024 file descriptors: if NR_OPEN is ever grown
+ * beyond that you'll have to change this too. But 1024 fd's seem to be
+ * enough even for such "real" unices like OSF/1, so hopefully this is
+ * one limit that doesn't have to be changed [again].
+ *
+ * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in
+ * <sys/time.h> (and thus <linux/time.h>) - but this is a more logical
+ * place for them. Solved by having dummy defines in <sys/time.h>.
+ */
+
+/*
+ * This macro may have been defined in <gnu/types.h>. But we always
+ * use the one here.
+ */
+#undef __FD_SETSIZE
+#define __FD_SETSIZE   1024
+
+typedef struct {
+       unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
+} __kernel_fd_set;
+
+/* Type of a signal handler.  */
+typedef void (*__kernel_sighandler_t)(int);
+
+/* Type of a SYSV IPC key.  */
+typedef int __kernel_key_t;
+typedef int __kernel_mqd_t;
+
+#include <asm/posix_types.h>
+
+#endif /* _LINUX_POSIX_TYPES_H */
index 78a70c274518ca3fc1eca3ff85c8f6c96e5f43d9..998ac8ee20e7fec90627b86576bacfec87c82244 100644 (file)
@@ -350,6 +350,7 @@ struct rtnexthop {
 #define RTNH_F_ONLINK          4       /* Gateway is forced on link    */
 #define RTNH_F_OFFLOAD         8       /* offloaded route */
 #define RTNH_F_LINKDOWN                16      /* carrier-down on nexthop */
+#define RTNH_F_UNRESOLVED      32      /* The entry is unresolved (ipmr) */
 
 #define RTNH_COMPARE_MASK      (RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD)
 
index eee08c066679ede2a328fee5ff67b8ed3a9e515e..62491a5cde1dd5a39f78324c6f7cf4cdb2d71fd4 100644 (file)
@@ -115,6 +115,10 @@ typedef __s32 sctp_assoc_t;
 #define SCTP_PR_SUPPORTED      113
 #define SCTP_DEFAULT_PRINFO    114
 #define SCTP_PR_ASSOC_STATUS   115
+#define SCTP_ENABLE_STREAM_RESET       118
+#define SCTP_RESET_STREAMS     119
+#define SCTP_RESET_ASSOC       120
+#define SCTP_ADD_STREAMS       121
 
 /* PR-SCTP policies */
 #define SCTP_PR_SCTP_NONE      0x0000
@@ -138,6 +142,15 @@ typedef __s32 sctp_assoc_t;
 #define SCTP_PR_RTX_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_RTX)
 #define SCTP_PR_PRIO_ENABLED(x)        (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_PRIO)
 
+/* For enable stream reset */
+#define SCTP_ENABLE_RESET_STREAM_REQ   0x01
+#define SCTP_ENABLE_RESET_ASSOC_REQ    0x02
+#define SCTP_ENABLE_CHANGE_ASSOC_REQ   0x04
+#define SCTP_ENABLE_STRRESET_MASK      0x07
+
+#define SCTP_STREAM_RESET_INCOMING     0x01
+#define SCTP_STREAM_RESET_OUTGOING     0x02
+
 /* These are bit fields for msghdr->msg_flags.  See section 5.1.  */
 /* On user space Linux, these live in <bits/socket.h> as an enum.  */
 enum sctp_msg_flags {
@@ -1002,4 +1015,17 @@ struct sctp_info {
        __u32   __reserved3;
 };
 
+struct sctp_reset_streams {
+       sctp_assoc_t srs_assoc_id;
+       uint16_t srs_flags;
+       uint16_t srs_number_streams;    /* 0 == ALL */
+       uint16_t srs_stream_list[];     /* list if srs_num_streams is not 0 */
+};
+
+struct sctp_add_streams {
+       sctp_assoc_t sas_assoc_id;
+       uint16_t sas_instrms;
+       uint16_t sas_outstrms;
+};
+
 #endif /* _SCTP_H */
diff --git a/include/linux/sockios.h b/include/linux/sockios.h
new file mode 100644 (file)
index 0000000..79d029d
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * INET                An implementation of the TCP/IP protocol suite for the LINUX
+ *             operating system.  INET is implemented using the  BSD Socket
+ *             interface as the means of communication with the user level.
+ *
+ *             Definitions of the socket-level I/O control calls.
+ *
+ * Version:    @(#)sockios.h   1.0.2   03/09/93
+ *
+ * Authors:    Ross Biro
+ *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
+ *
+ *             This program is free software; you can redistribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ */
+#ifndef _LINUX_SOCKIOS_H
+#define _LINUX_SOCKIOS_H
+
+#include <asm/sockios.h>
+
+/* Linux-specific socket ioctls */
+#define SIOCINQ                FIONREAD
+#define SIOCOUTQ       TIOCOUTQ        /* output queue size (not sent + not acked) */
+
+#define SOCK_IOC_TYPE  0x89
+
+/* Routing table calls. */
+#define SIOCADDRT      0x890B          /* add routing table entry      */
+#define SIOCDELRT      0x890C          /* delete routing table entry   */
+#define SIOCRTMSG      0x890D          /* unused                       */
+
+/* Socket configuration controls. */
+#define SIOCGIFNAME    0x8910          /* get iface name               */
+#define SIOCSIFLINK    0x8911          /* set iface channel            */
+#define SIOCGIFCONF    0x8912          /* get iface list               */
+#define SIOCGIFFLAGS   0x8913          /* get flags                    */
+#define SIOCSIFFLAGS   0x8914          /* set flags                    */
+#define SIOCGIFADDR    0x8915          /* get PA address               */
+#define SIOCSIFADDR    0x8916          /* set PA address               */
+#define SIOCGIFDSTADDR 0x8917          /* get remote PA address        */
+#define SIOCSIFDSTADDR 0x8918          /* set remote PA address        */
+#define SIOCGIFBRDADDR 0x8919          /* get broadcast PA address     */
+#define SIOCSIFBRDADDR 0x891a          /* set broadcast PA address     */
+#define SIOCGIFNETMASK 0x891b          /* get network PA mask          */
+#define SIOCSIFNETMASK 0x891c          /* set network PA mask          */
+#define SIOCGIFMETRIC  0x891d          /* get metric                   */
+#define SIOCSIFMETRIC  0x891e          /* set metric                   */
+#define SIOCGIFMEM     0x891f          /* get memory address (BSD)     */
+#define SIOCSIFMEM     0x8920          /* set memory address (BSD)     */
+#define SIOCGIFMTU     0x8921          /* get MTU size                 */
+#define SIOCSIFMTU     0x8922          /* set MTU size                 */
+#define SIOCSIFNAME    0x8923          /* set interface name */
+#define        SIOCSIFHWADDR   0x8924          /* set hardware address         */
+#define SIOCGIFENCAP   0x8925          /* get/set encapsulations       */
+#define SIOCSIFENCAP   0x8926          
+#define SIOCGIFHWADDR  0x8927          /* Get hardware address         */
+#define SIOCGIFSLAVE   0x8929          /* Driver slaving support       */
+#define SIOCSIFSLAVE   0x8930
+#define SIOCADDMULTI   0x8931          /* Multicast address lists      */
+#define SIOCDELMULTI   0x8932
+#define SIOCGIFINDEX   0x8933          /* name -> if_index mapping     */
+#define SIOGIFINDEX    SIOCGIFINDEX    /* misprint compatibility :-)   */
+#define SIOCSIFPFLAGS  0x8934          /* set/get extended flags set   */
+#define SIOCGIFPFLAGS  0x8935
+#define SIOCDIFADDR    0x8936          /* delete PA address            */
+#define        SIOCSIFHWBROADCAST      0x8937  /* set hardware broadcast addr  */
+#define SIOCGIFCOUNT   0x8938          /* get number of devices */
+
+#define SIOCGIFBR      0x8940          /* Bridging support             */
+#define SIOCSIFBR      0x8941          /* Set bridging options         */
+
+#define SIOCGIFTXQLEN  0x8942          /* Get the tx queue length      */
+#define SIOCSIFTXQLEN  0x8943          /* Set the tx queue length      */
+
+/* SIOCGIFDIVERT was:  0x8944          Frame diversion support */
+/* SIOCSIFDIVERT was:  0x8945          Set frame diversion options */
+
+#define SIOCETHTOOL    0x8946          /* Ethtool interface            */
+
+#define SIOCGMIIPHY    0x8947          /* Get address of MII PHY in use. */
+#define SIOCGMIIREG    0x8948          /* Read MII PHY register.       */
+#define SIOCSMIIREG    0x8949          /* Write MII PHY register.      */
+
+#define SIOCWANDEV     0x894A          /* get/set netdev parameters    */
+
+#define SIOCOUTQNSD    0x894B          /* output queue size (not sent only) */
+#define SIOCGSKNS      0x894C          /* get socket network namespace */
+
+/* ARP cache control calls. */
+                   /*  0x8950 - 0x8952  * obsolete calls, don't re-use */
+#define SIOCDARP       0x8953          /* delete ARP table entry       */
+#define SIOCGARP       0x8954          /* get ARP table entry          */
+#define SIOCSARP       0x8955          /* set ARP table entry          */
+
+/* RARP cache control calls. */
+#define SIOCDRARP      0x8960          /* delete RARP table entry      */
+#define SIOCGRARP      0x8961          /* get RARP table entry         */
+#define SIOCSRARP      0x8962          /* set RARP table entry         */
+
+/* Driver configuration calls */
+
+#define SIOCGIFMAP     0x8970          /* Get device parameters        */
+#define SIOCSIFMAP     0x8971          /* Set device parameters        */
+
+/* DLCI configuration calls */
+
+#define SIOCADDDLCI    0x8980          /* Create new DLCI device       */
+#define SIOCDELDLCI    0x8981          /* Delete DLCI device           */
+
+#define SIOCGIFVLAN    0x8982          /* 802.1Q VLAN support          */
+#define SIOCSIFVLAN    0x8983          /* Set 802.1Q VLAN options      */
+
+/* bonding calls */
+
+#define SIOCBONDENSLAVE        0x8990          /* enslave a device to the bond */
+#define SIOCBONDRELEASE 0x8991         /* release a slave from the bond*/
+#define SIOCBONDSETHWADDR      0x8992  /* set the hw addr of the bond  */
+#define SIOCBONDSLAVEINFOQUERY 0x8993   /* rtn info about slave state   */
+#define SIOCBONDINFOQUERY      0x8994  /* rtn info about bond state    */
+#define SIOCBONDCHANGEACTIVE   0x8995   /* update to a new active slave */
+                       
+/* bridge calls */
+#define SIOCBRADDBR     0x89a0         /* create new bridge device     */
+#define SIOCBRDELBR     0x89a1         /* remove bridge device         */
+#define SIOCBRADDIF    0x89a2          /* add interface to bridge      */
+#define SIOCBRDELIF    0x89a3          /* remove interface from bridge */
+
+/* hardware time stamping: parameters in linux/net_tstamp.h */
+#define SIOCSHWTSTAMP  0x89b0          /* set and get config           */
+#define SIOCGHWTSTAMP  0x89b1          /* get config                   */
+
+/* Device private ioctl calls */
+
+/*
+ *     These 16 ioctls are available to devices via the do_ioctl() device
+ *     vector. Each device should include this file and redefine these names
+ *     as their own. Because these are device dependent it is a good idea
+ *     _NOT_ to issue them to random objects and hope.
+ *
+ *     THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM
+ */
+#define SIOCDEVPRIVATE 0x89F0  /* to 89FF */
+
+/*
+ *     These 16 ioctl calls are protocol private
+ */
+#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */
+#endif /* _LINUX_SOCKIOS_H */
diff --git a/include/linux/stddef.h b/include/linux/stddef.h
new file mode 100644 (file)
index 0000000..4bb69de
--- /dev/null
@@ -0,0 +1,5 @@
+
+
+#ifndef __always_inline
+#define __always_inline __inline__
+#endif
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
new file mode 100644 (file)
index 0000000..41631d3
--- /dev/null
@@ -0,0 +1,932 @@
+/*
+ * sysctl.h: General linux system control interface
+ *
+ * Begun 24 March 1995, Stephen Tweedie
+ *
+ ****************************************************************
+ ****************************************************************
+ **
+ **  WARNING:
+ **  The values in this file are exported to user space via 
+ **  the sysctl() binary interface.  Do *NOT* change the
+ **  numbering of any existing values here, and do not change
+ **  any numbers within any one set of values.  If you have to
+ **  redefine an existing interface, use a new number for it.
+ **  The kernel will then return -ENOTDIR to any application using
+ **  the old binary interface.
+ **
+ ****************************************************************
+ ****************************************************************
+ */
+
+#ifndef _LINUX_SYSCTL_H
+#define _LINUX_SYSCTL_H
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+
+
+#define CTL_MAXNAME 10         /* how many path components do we allow in a
+                                  call to sysctl?   In other words, what is
+                                  the largest acceptable value for the nlen
+                                  member of a struct __sysctl_args to have? */
+
+struct __sysctl_args {
+       int *name;
+       int nlen;
+       void *oldval;
+       size_t *oldlenp;
+       void *newval;
+       size_t newlen;
+       unsigned long __unused[4];
+};
+
+/* Define sysctl names first */
+
+/* Top-level names: */
+
+enum
+{
+       CTL_KERN=1,             /* General kernel info and control */
+       CTL_VM=2,               /* VM management */
+       CTL_NET=3,              /* Networking */
+       CTL_PROC=4,             /* removal breaks strace(1) compilation */
+       CTL_FS=5,               /* Filesystems */
+       CTL_DEBUG=6,            /* Debugging */
+       CTL_DEV=7,              /* Devices */
+       CTL_BUS=8,              /* Busses */
+       CTL_ABI=9,              /* Binary emulation */
+       CTL_CPU=10,             /* CPU stuff (speed scaling, etc) */
+       CTL_ARLAN=254,          /* arlan wireless driver */
+       CTL_S390DBF=5677,       /* s390 debug */
+       CTL_SUNRPC=7249,        /* sunrpc debug */
+       CTL_PM=9899,            /* frv power management */
+       CTL_FRV=9898,           /* frv specific sysctls */
+};
+
+/* CTL_BUS names: */
+enum
+{
+       CTL_BUS_ISA=1           /* ISA */
+};
+
+/* /proc/sys/fs/inotify/ */
+enum
+{
+       INOTIFY_MAX_USER_INSTANCES=1,   /* max instances per user */
+       INOTIFY_MAX_USER_WATCHES=2,     /* max watches per user */
+       INOTIFY_MAX_QUEUED_EVENTS=3     /* max queued events per instance */
+};
+
+/* CTL_KERN names: */
+enum
+{
+       KERN_OSTYPE=1,          /* string: system version */
+       KERN_OSRELEASE=2,       /* string: system release */
+       KERN_OSREV=3,           /* int: system revision */
+       KERN_VERSION=4,         /* string: compile time info */
+       KERN_SECUREMASK=5,      /* struct: maximum rights mask */
+       KERN_PROF=6,            /* table: profiling information */
+       KERN_NODENAME=7,        /* string: hostname */
+       KERN_DOMAINNAME=8,      /* string: domainname */
+
+       KERN_PANIC=15,          /* int: panic timeout */
+       KERN_REALROOTDEV=16,    /* real root device to mount after initrd */
+
+       KERN_SPARC_REBOOT=21,   /* reboot command on Sparc */
+       KERN_CTLALTDEL=22,      /* int: allow ctl-alt-del to reboot */
+       KERN_PRINTK=23,         /* struct: control printk logging parameters */
+       KERN_NAMETRANS=24,      /* Name translation */
+       KERN_PPC_HTABRECLAIM=25, /* turn htab reclaimation on/off on PPC */
+       KERN_PPC_ZEROPAGED=26,  /* turn idle page zeroing on/off on PPC */
+       KERN_PPC_POWERSAVE_NAP=27, /* use nap mode for power saving */
+       KERN_MODPROBE=28,       /* string: modprobe path */
+       KERN_SG_BIG_BUFF=29,    /* int: sg driver reserved buffer size */
+       KERN_ACCT=30,           /* BSD process accounting parameters */
+       KERN_PPC_L2CR=31,       /* l2cr register on PPC */
+
+       KERN_RTSIGNR=32,        /* Number of rt sigs queued */
+       KERN_RTSIGMAX=33,       /* Max queuable */
+       
+       KERN_SHMMAX=34,         /* long: Maximum shared memory segment */
+       KERN_MSGMAX=35,         /* int: Maximum size of a messege */
+       KERN_MSGMNB=36,         /* int: Maximum message queue size */
+       KERN_MSGPOOL=37,        /* int: Maximum system message pool size */
+       KERN_SYSRQ=38,          /* int: Sysreq enable */
+       KERN_MAX_THREADS=39,    /* int: Maximum nr of threads in the system */
+       KERN_RANDOM=40,         /* Random driver */
+       KERN_SHMALL=41,         /* int: Maximum size of shared memory */
+       KERN_MSGMNI=42,         /* int: msg queue identifiers */
+       KERN_SEM=43,            /* struct: sysv semaphore limits */
+       KERN_SPARC_STOP_A=44,   /* int: Sparc Stop-A enable */
+       KERN_SHMMNI=45,         /* int: shm array identifiers */
+       KERN_OVERFLOWUID=46,    /* int: overflow UID */
+       KERN_OVERFLOWGID=47,    /* int: overflow GID */
+       KERN_SHMPATH=48,        /* string: path to shm fs */
+       KERN_HOTPLUG=49,        /* string: path to uevent helper (deprecated) */
+       KERN_IEEE_EMULATION_WARNINGS=50, /* int: unimplemented ieee instructions */
+       KERN_S390_USER_DEBUG_LOGGING=51,  /* int: dumps of user faults */
+       KERN_CORE_USES_PID=52,          /* int: use core or core.%pid */
+       KERN_TAINTED=53,        /* int: various kernel tainted flags */
+       KERN_CADPID=54,         /* int: PID of the process to notify on CAD */
+       KERN_PIDMAX=55,         /* int: PID # limit */
+       KERN_CORE_PATTERN=56,   /* string: pattern for core-file names */
+       KERN_PANIC_ON_OOPS=57,  /* int: whether we will panic on an oops */
+       KERN_HPPA_PWRSW=58,     /* int: hppa soft-power enable */
+       KERN_HPPA_UNALIGNED=59, /* int: hppa unaligned-trap enable */
+       KERN_PRINTK_RATELIMIT=60, /* int: tune printk ratelimiting */
+       KERN_PRINTK_RATELIMIT_BURST=61, /* int: tune printk ratelimiting */
+       KERN_PTY=62,            /* dir: pty driver */
+       KERN_NGROUPS_MAX=63,    /* int: NGROUPS_MAX */
+       KERN_SPARC_SCONS_PWROFF=64, /* int: serial console power-off halt */
+       KERN_HZ_TIMER=65,       /* int: hz timer on or off */
+       KERN_UNKNOWN_NMI_PANIC=66, /* int: unknown nmi panic flag */
+       KERN_BOOTLOADER_TYPE=67, /* int: boot loader type */
+       KERN_RANDOMIZE=68, /* int: randomize virtual address space */
+       KERN_SETUID_DUMPABLE=69, /* int: behaviour of dumps for setuid core */
+       KERN_SPIN_RETRY=70,     /* int: number of spinlock retries */
+       KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */
+       KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */
+       KERN_COMPAT_LOG=73,     /* int: print compat layer  messages */
+       KERN_MAX_LOCK_DEPTH=74, /* int: rtmutex's maximum lock depth */
+       KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
+       KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
+       KERN_PANIC_ON_WARN=77, /* int: call panic() in WARN() functions */
+};
+
+
+
+/* CTL_VM names: */
+enum
+{
+       VM_UNUSED1=1,           /* was: struct: Set vm swapping control */
+       VM_UNUSED2=2,           /* was; int: Linear or sqrt() swapout for hogs */
+       VM_UNUSED3=3,           /* was: struct: Set free page thresholds */
+       VM_UNUSED4=4,           /* Spare */
+       VM_OVERCOMMIT_MEMORY=5, /* Turn off the virtual memory safety limit */
+       VM_UNUSED5=6,           /* was: struct: Set buffer memory thresholds */
+       VM_UNUSED7=7,           /* was: struct: Set cache memory thresholds */
+       VM_UNUSED8=8,           /* was: struct: Control kswapd behaviour */
+       VM_UNUSED9=9,           /* was: struct: Set page table cache parameters */
+       VM_PAGE_CLUSTER=10,     /* int: set number of pages to swap together */
+       VM_DIRTY_BACKGROUND=11, /* dirty_background_ratio */
+       VM_DIRTY_RATIO=12,      /* dirty_ratio */
+       VM_DIRTY_WB_CS=13,      /* dirty_writeback_centisecs */
+       VM_DIRTY_EXPIRE_CS=14,  /* dirty_expire_centisecs */
+       VM_NR_PDFLUSH_THREADS=15, /* nr_pdflush_threads */
+       VM_OVERCOMMIT_RATIO=16, /* percent of RAM to allow overcommit in */
+       VM_PAGEBUF=17,          /* struct: Control pagebuf parameters */
+       VM_HUGETLB_PAGES=18,    /* int: Number of available Huge Pages */
+       VM_SWAPPINESS=19,       /* Tendency to steal mapped memory */
+       VM_LOWMEM_RESERVE_RATIO=20,/* reservation ratio for lower memory zones */
+       VM_MIN_FREE_KBYTES=21,  /* Minimum free kilobytes to maintain */
+       VM_MAX_MAP_COUNT=22,    /* int: Maximum number of mmaps/address-space */
+       VM_LAPTOP_MODE=23,      /* vm laptop mode */
+       VM_BLOCK_DUMP=24,       /* block dump mode */
+       VM_HUGETLB_GROUP=25,    /* permitted hugetlb group */
+       VM_VFS_CACHE_PRESSURE=26, /* dcache/icache reclaim pressure */
+       VM_LEGACY_VA_LAYOUT=27, /* legacy/compatibility virtual address space layout */
+       VM_SWAP_TOKEN_TIMEOUT=28, /* default time for token time out */
+       VM_DROP_PAGECACHE=29,   /* int: nuke lots of pagecache */
+       VM_PERCPU_PAGELIST_FRACTION=30,/* int: fraction of pages in each percpu_pagelist */
+       VM_ZONE_RECLAIM_MODE=31, /* reclaim local zone memory before going off node */
+       VM_MIN_UNMAPPED=32,     /* Set min percent of unmapped pages */
+       VM_PANIC_ON_OOM=33,     /* panic at out-of-memory */
+       VM_VDSO_ENABLED=34,     /* map VDSO into new processes? */
+       VM_MIN_SLAB=35,          /* Percent pages ignored by zone reclaim */
+};
+
+
+/* CTL_NET names: */
+enum
+{
+       NET_CORE=1,
+       NET_ETHER=2,
+       NET_802=3,
+       NET_UNIX=4,
+       NET_IPV4=5,
+       NET_IPX=6,
+       NET_ATALK=7,
+       NET_NETROM=8,
+       NET_AX25=9,
+       NET_BRIDGE=10,
+       NET_ROSE=11,
+       NET_IPV6=12,
+       NET_X25=13,
+       NET_TR=14,
+       NET_DECNET=15,
+       NET_ECONET=16,
+       NET_SCTP=17,
+       NET_LLC=18,
+       NET_NETFILTER=19,
+       NET_DCCP=20,
+       NET_IRDA=412,
+};
+
+/* /proc/sys/kernel/random */
+enum
+{
+       RANDOM_POOLSIZE=1,
+       RANDOM_ENTROPY_COUNT=2,
+       RANDOM_READ_THRESH=3,
+       RANDOM_WRITE_THRESH=4,
+       RANDOM_BOOT_ID=5,
+       RANDOM_UUID=6
+};
+
+/* /proc/sys/kernel/pty */
+enum
+{
+       PTY_MAX=1,
+       PTY_NR=2
+};
+
+/* /proc/sys/bus/isa */
+enum
+{
+       BUS_ISA_MEM_BASE=1,
+       BUS_ISA_PORT_BASE=2,
+       BUS_ISA_PORT_SHIFT=3
+};
+
+/* /proc/sys/net/core */
+enum
+{
+       NET_CORE_WMEM_MAX=1,
+       NET_CORE_RMEM_MAX=2,
+       NET_CORE_WMEM_DEFAULT=3,
+       NET_CORE_RMEM_DEFAULT=4,
+/* was NET_CORE_DESTROY_DELAY */
+       NET_CORE_MAX_BACKLOG=6,
+       NET_CORE_FASTROUTE=7,
+       NET_CORE_MSG_COST=8,
+       NET_CORE_MSG_BURST=9,
+       NET_CORE_OPTMEM_MAX=10,
+       NET_CORE_HOT_LIST_LENGTH=11,
+       NET_CORE_DIVERT_VERSION=12,
+       NET_CORE_NO_CONG_THRESH=13,
+       NET_CORE_NO_CONG=14,
+       NET_CORE_LO_CONG=15,
+       NET_CORE_MOD_CONG=16,
+       NET_CORE_DEV_WEIGHT=17,
+       NET_CORE_SOMAXCONN=18,
+       NET_CORE_BUDGET=19,
+       NET_CORE_AEVENT_ETIME=20,
+       NET_CORE_AEVENT_RSEQTH=21,
+       NET_CORE_WARNINGS=22,
+};
+
+/* /proc/sys/net/ethernet */
+
+/* /proc/sys/net/802 */
+
+/* /proc/sys/net/unix */
+
+enum
+{
+       NET_UNIX_DESTROY_DELAY=1,
+       NET_UNIX_DELETE_DELAY=2,
+       NET_UNIX_MAX_DGRAM_QLEN=3,
+};
+
+/* /proc/sys/net/netfilter */
+enum
+{
+       NET_NF_CONNTRACK_MAX=1,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT=2,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV=3,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED=4,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT=5,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT=6,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK=7,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT=8,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_CLOSE=9,
+       NET_NF_CONNTRACK_UDP_TIMEOUT=10,
+       NET_NF_CONNTRACK_UDP_TIMEOUT_STREAM=11,
+       NET_NF_CONNTRACK_ICMP_TIMEOUT=12,
+       NET_NF_CONNTRACK_GENERIC_TIMEOUT=13,
+       NET_NF_CONNTRACK_BUCKETS=14,
+       NET_NF_CONNTRACK_LOG_INVALID=15,
+       NET_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS=16,
+       NET_NF_CONNTRACK_TCP_LOOSE=17,
+       NET_NF_CONNTRACK_TCP_BE_LIBERAL=18,
+       NET_NF_CONNTRACK_TCP_MAX_RETRANS=19,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_CLOSED=20,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_WAIT=21,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_ECHOED=22,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_ESTABLISHED=23,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_SENT=24,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD=25,
+       NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_ACK_SENT=26,
+       NET_NF_CONNTRACK_COUNT=27,
+       NET_NF_CONNTRACK_ICMPV6_TIMEOUT=28,
+       NET_NF_CONNTRACK_FRAG6_TIMEOUT=29,
+       NET_NF_CONNTRACK_FRAG6_LOW_THRESH=30,
+       NET_NF_CONNTRACK_FRAG6_HIGH_THRESH=31,
+       NET_NF_CONNTRACK_CHECKSUM=32,
+};
+
+/* /proc/sys/net/ipv4 */
+enum
+{
+       /* v2.0 compatibile variables */
+       NET_IPV4_FORWARD=8,
+       NET_IPV4_DYNADDR=9,
+
+       NET_IPV4_CONF=16,
+       NET_IPV4_NEIGH=17,
+       NET_IPV4_ROUTE=18,
+       NET_IPV4_FIB_HASH=19,
+       NET_IPV4_NETFILTER=20,
+
+       NET_IPV4_TCP_TIMESTAMPS=33,
+       NET_IPV4_TCP_WINDOW_SCALING=34,
+       NET_IPV4_TCP_SACK=35,
+       NET_IPV4_TCP_RETRANS_COLLAPSE=36,
+       NET_IPV4_DEFAULT_TTL=37,
+       NET_IPV4_AUTOCONFIG=38,
+       NET_IPV4_NO_PMTU_DISC=39,
+       NET_IPV4_TCP_SYN_RETRIES=40,
+       NET_IPV4_IPFRAG_HIGH_THRESH=41,
+       NET_IPV4_IPFRAG_LOW_THRESH=42,
+       NET_IPV4_IPFRAG_TIME=43,
+       NET_IPV4_TCP_MAX_KA_PROBES=44,
+       NET_IPV4_TCP_KEEPALIVE_TIME=45,
+       NET_IPV4_TCP_KEEPALIVE_PROBES=46,
+       NET_IPV4_TCP_RETRIES1=47,
+       NET_IPV4_TCP_RETRIES2=48,
+       NET_IPV4_TCP_FIN_TIMEOUT=49,
+       NET_IPV4_IP_MASQ_DEBUG=50,
+       NET_TCP_SYNCOOKIES=51,
+       NET_TCP_STDURG=52,
+       NET_TCP_RFC1337=53,
+       NET_TCP_SYN_TAILDROP=54,
+       NET_TCP_MAX_SYN_BACKLOG=55,
+       NET_IPV4_LOCAL_PORT_RANGE=56,
+       NET_IPV4_ICMP_ECHO_IGNORE_ALL=57,
+       NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS=58,
+       NET_IPV4_ICMP_SOURCEQUENCH_RATE=59,
+       NET_IPV4_ICMP_DESTUNREACH_RATE=60,
+       NET_IPV4_ICMP_TIMEEXCEED_RATE=61,
+       NET_IPV4_ICMP_PARAMPROB_RATE=62,
+       NET_IPV4_ICMP_ECHOREPLY_RATE=63,
+       NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES=64,
+       NET_IPV4_IGMP_MAX_MEMBERSHIPS=65,
+       NET_TCP_TW_RECYCLE=66,
+       NET_IPV4_ALWAYS_DEFRAG=67,
+       NET_IPV4_TCP_KEEPALIVE_INTVL=68,
+       NET_IPV4_INET_PEER_THRESHOLD=69,
+       NET_IPV4_INET_PEER_MINTTL=70,
+       NET_IPV4_INET_PEER_MAXTTL=71,
+       NET_IPV4_INET_PEER_GC_MINTIME=72,
+       NET_IPV4_INET_PEER_GC_MAXTIME=73,
+       NET_TCP_ORPHAN_RETRIES=74,
+       NET_TCP_ABORT_ON_OVERFLOW=75,
+       NET_TCP_SYNACK_RETRIES=76,
+       NET_TCP_MAX_ORPHANS=77,
+       NET_TCP_MAX_TW_BUCKETS=78,
+       NET_TCP_FACK=79,
+       NET_TCP_REORDERING=80,
+       NET_TCP_ECN=81,
+       NET_TCP_DSACK=82,
+       NET_TCP_MEM=83,
+       NET_TCP_WMEM=84,
+       NET_TCP_RMEM=85,
+       NET_TCP_APP_WIN=86,
+       NET_TCP_ADV_WIN_SCALE=87,
+       NET_IPV4_NONLOCAL_BIND=88,
+       NET_IPV4_ICMP_RATELIMIT=89,
+       NET_IPV4_ICMP_RATEMASK=90,
+       NET_TCP_TW_REUSE=91,
+       NET_TCP_FRTO=92,
+       NET_TCP_LOW_LATENCY=93,
+       NET_IPV4_IPFRAG_SECRET_INTERVAL=94,
+       NET_IPV4_IGMP_MAX_MSF=96,
+       NET_TCP_NO_METRICS_SAVE=97,
+       NET_TCP_DEFAULT_WIN_SCALE=105,
+       NET_TCP_MODERATE_RCVBUF=106,
+       NET_TCP_TSO_WIN_DIVISOR=107,
+       NET_TCP_BIC_BETA=108,
+       NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
+       NET_TCP_CONG_CONTROL=110,
+       NET_TCP_ABC=111,
+       NET_IPV4_IPFRAG_MAX_DIST=112,
+       NET_TCP_MTU_PROBING=113,
+       NET_TCP_BASE_MSS=114,
+       NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115,
+       NET_TCP_DMA_COPYBREAK=116,
+       NET_TCP_SLOW_START_AFTER_IDLE=117,
+       NET_CIPSOV4_CACHE_ENABLE=118,
+       NET_CIPSOV4_CACHE_BUCKET_SIZE=119,
+       NET_CIPSOV4_RBM_OPTFMT=120,
+       NET_CIPSOV4_RBM_STRICTVALID=121,
+       NET_TCP_AVAIL_CONG_CONTROL=122,
+       NET_TCP_ALLOWED_CONG_CONTROL=123,
+       NET_TCP_MAX_SSTHRESH=124,
+       NET_TCP_FRTO_RESPONSE=125,
+};
+
+enum {
+       NET_IPV4_ROUTE_FLUSH=1,
+       NET_IPV4_ROUTE_MIN_DELAY=2, /* obsolete since 2.6.25 */
+       NET_IPV4_ROUTE_MAX_DELAY=3, /* obsolete since 2.6.25 */
+       NET_IPV4_ROUTE_GC_THRESH=4,
+       NET_IPV4_ROUTE_MAX_SIZE=5,
+       NET_IPV4_ROUTE_GC_MIN_INTERVAL=6,
+       NET_IPV4_ROUTE_GC_TIMEOUT=7,
+       NET_IPV4_ROUTE_GC_INTERVAL=8, /* obsolete since 2.6.38 */
+       NET_IPV4_ROUTE_REDIRECT_LOAD=9,
+       NET_IPV4_ROUTE_REDIRECT_NUMBER=10,
+       NET_IPV4_ROUTE_REDIRECT_SILENCE=11,
+       NET_IPV4_ROUTE_ERROR_COST=12,
+       NET_IPV4_ROUTE_ERROR_BURST=13,
+       NET_IPV4_ROUTE_GC_ELASTICITY=14,
+       NET_IPV4_ROUTE_MTU_EXPIRES=15,
+       NET_IPV4_ROUTE_MIN_PMTU=16,
+       NET_IPV4_ROUTE_MIN_ADVMSS=17,
+       NET_IPV4_ROUTE_SECRET_INTERVAL=18,
+       NET_IPV4_ROUTE_GC_MIN_INTERVAL_MS=19,
+};
+
+enum
+{
+       NET_PROTO_CONF_ALL=-2,
+       NET_PROTO_CONF_DEFAULT=-3
+
+       /* And device ifindices ... */
+};
+
+enum
+{
+       NET_IPV4_CONF_FORWARDING=1,
+       NET_IPV4_CONF_MC_FORWARDING=2,
+       NET_IPV4_CONF_PROXY_ARP=3,
+       NET_IPV4_CONF_ACCEPT_REDIRECTS=4,
+       NET_IPV4_CONF_SECURE_REDIRECTS=5,
+       NET_IPV4_CONF_SEND_REDIRECTS=6,
+       NET_IPV4_CONF_SHARED_MEDIA=7,
+       NET_IPV4_CONF_RP_FILTER=8,
+       NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE=9,
+       NET_IPV4_CONF_BOOTP_RELAY=10,
+       NET_IPV4_CONF_LOG_MARTIANS=11,
+       NET_IPV4_CONF_TAG=12,
+       NET_IPV4_CONF_ARPFILTER=13,
+       NET_IPV4_CONF_MEDIUM_ID=14,
+       NET_IPV4_CONF_NOXFRM=15,
+       NET_IPV4_CONF_NOPOLICY=16,
+       NET_IPV4_CONF_FORCE_IGMP_VERSION=17,
+       NET_IPV4_CONF_ARP_ANNOUNCE=18,
+       NET_IPV4_CONF_ARP_IGNORE=19,
+       NET_IPV4_CONF_PROMOTE_SECONDARIES=20,
+       NET_IPV4_CONF_ARP_ACCEPT=21,
+       NET_IPV4_CONF_ARP_NOTIFY=22,
+};
+
+/* /proc/sys/net/ipv4/netfilter */
+enum
+{
+       NET_IPV4_NF_CONNTRACK_MAX=1,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT=2,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV=3,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED=4,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT=5,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT=6,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK=7,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT=8,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE=9,
+       NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT=10,
+       NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM=11,
+       NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT=12,
+       NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT=13,
+       NET_IPV4_NF_CONNTRACK_BUCKETS=14,
+       NET_IPV4_NF_CONNTRACK_LOG_INVALID=15,
+       NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS=16,
+       NET_IPV4_NF_CONNTRACK_TCP_LOOSE=17,
+       NET_IPV4_NF_CONNTRACK_TCP_BE_LIBERAL=18,
+       NET_IPV4_NF_CONNTRACK_TCP_MAX_RETRANS=19,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_CLOSED=20,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_WAIT=21,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_ECHOED=22,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_ESTABLISHED=23,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_SENT=24,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD=25,
+       NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_ACK_SENT=26,
+       NET_IPV4_NF_CONNTRACK_COUNT=27,
+       NET_IPV4_NF_CONNTRACK_CHECKSUM=28,
+};
+/* /proc/sys/net/ipv6 */
+enum {
+       NET_IPV6_CONF=16,
+       NET_IPV6_NEIGH=17,
+       NET_IPV6_ROUTE=18,
+       NET_IPV6_ICMP=19,
+       NET_IPV6_BINDV6ONLY=20,
+       NET_IPV6_IP6FRAG_HIGH_THRESH=21,
+       NET_IPV6_IP6FRAG_LOW_THRESH=22,
+       NET_IPV6_IP6FRAG_TIME=23,
+       NET_IPV6_IP6FRAG_SECRET_INTERVAL=24,
+       NET_IPV6_MLD_MAX_MSF=25,
+};
+
+enum {
+       NET_IPV6_ROUTE_FLUSH=1,
+       NET_IPV6_ROUTE_GC_THRESH=2,
+       NET_IPV6_ROUTE_MAX_SIZE=3,
+       NET_IPV6_ROUTE_GC_MIN_INTERVAL=4,
+       NET_IPV6_ROUTE_GC_TIMEOUT=5,
+       NET_IPV6_ROUTE_GC_INTERVAL=6,
+       NET_IPV6_ROUTE_GC_ELASTICITY=7,
+       NET_IPV6_ROUTE_MTU_EXPIRES=8,
+       NET_IPV6_ROUTE_MIN_ADVMSS=9,
+       NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS=10
+};
+
+enum {
+       NET_IPV6_FORWARDING=1,
+       NET_IPV6_HOP_LIMIT=2,
+       NET_IPV6_MTU=3,
+       NET_IPV6_ACCEPT_RA=4,
+       NET_IPV6_ACCEPT_REDIRECTS=5,
+       NET_IPV6_AUTOCONF=6,
+       NET_IPV6_DAD_TRANSMITS=7,
+       NET_IPV6_RTR_SOLICITS=8,
+       NET_IPV6_RTR_SOLICIT_INTERVAL=9,
+       NET_IPV6_RTR_SOLICIT_DELAY=10,
+       NET_IPV6_USE_TEMPADDR=11,
+       NET_IPV6_TEMP_VALID_LFT=12,
+       NET_IPV6_TEMP_PREFERED_LFT=13,
+       NET_IPV6_REGEN_MAX_RETRY=14,
+       NET_IPV6_MAX_DESYNC_FACTOR=15,
+       NET_IPV6_MAX_ADDRESSES=16,
+       NET_IPV6_FORCE_MLD_VERSION=17,
+       NET_IPV6_ACCEPT_RA_DEFRTR=18,
+       NET_IPV6_ACCEPT_RA_PINFO=19,
+       NET_IPV6_ACCEPT_RA_RTR_PREF=20,
+       NET_IPV6_RTR_PROBE_INTERVAL=21,
+       NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN=22,
+       NET_IPV6_PROXY_NDP=23,
+       NET_IPV6_ACCEPT_SOURCE_ROUTE=25,
+       NET_IPV6_ACCEPT_RA_FROM_LOCAL=26,
+       __NET_IPV6_MAX
+};
+
+/* /proc/sys/net/ipv6/icmp */
+enum {
+       NET_IPV6_ICMP_RATELIMIT=1
+};
+
+/* /proc/sys/net/<protocol>/neigh/<dev> */
+enum {
+       NET_NEIGH_MCAST_SOLICIT=1,
+       NET_NEIGH_UCAST_SOLICIT=2,
+       NET_NEIGH_APP_SOLICIT=3,
+       NET_NEIGH_RETRANS_TIME=4,
+       NET_NEIGH_REACHABLE_TIME=5,
+       NET_NEIGH_DELAY_PROBE_TIME=6,
+       NET_NEIGH_GC_STALE_TIME=7,
+       NET_NEIGH_UNRES_QLEN=8,
+       NET_NEIGH_PROXY_QLEN=9,
+       NET_NEIGH_ANYCAST_DELAY=10,
+       NET_NEIGH_PROXY_DELAY=11,
+       NET_NEIGH_LOCKTIME=12,
+       NET_NEIGH_GC_INTERVAL=13,
+       NET_NEIGH_GC_THRESH1=14,
+       NET_NEIGH_GC_THRESH2=15,
+       NET_NEIGH_GC_THRESH3=16,
+       NET_NEIGH_RETRANS_TIME_MS=17,
+       NET_NEIGH_REACHABLE_TIME_MS=18,
+};
+
+/* /proc/sys/net/dccp */
+enum {
+       NET_DCCP_DEFAULT=1,
+};
+
+/* /proc/sys/net/ipx */
+enum {
+       NET_IPX_PPROP_BROADCASTING=1,
+       NET_IPX_FORWARDING=2
+};
+
+/* /proc/sys/net/llc */
+enum {
+       NET_LLC2=1,
+       NET_LLC_STATION=2,
+};
+
+/* /proc/sys/net/llc/llc2 */
+enum {
+       NET_LLC2_TIMEOUT=1,
+};
+
+/* /proc/sys/net/llc/station */
+enum {
+       NET_LLC_STATION_ACK_TIMEOUT=1,
+};
+
+/* /proc/sys/net/llc/llc2/timeout */
+enum {
+       NET_LLC2_ACK_TIMEOUT=1,
+       NET_LLC2_P_TIMEOUT=2,
+       NET_LLC2_REJ_TIMEOUT=3,
+       NET_LLC2_BUSY_TIMEOUT=4,
+};
+
+/* /proc/sys/net/appletalk */
+enum {
+       NET_ATALK_AARP_EXPIRY_TIME=1,
+       NET_ATALK_AARP_TICK_TIME=2,
+       NET_ATALK_AARP_RETRANSMIT_LIMIT=3,
+       NET_ATALK_AARP_RESOLVE_TIME=4
+};
+
+
+/* /proc/sys/net/netrom */
+enum {
+       NET_NETROM_DEFAULT_PATH_QUALITY=1,
+       NET_NETROM_OBSOLESCENCE_COUNT_INITIALISER=2,
+       NET_NETROM_NETWORK_TTL_INITIALISER=3,
+       NET_NETROM_TRANSPORT_TIMEOUT=4,
+       NET_NETROM_TRANSPORT_MAXIMUM_TRIES=5,
+       NET_NETROM_TRANSPORT_ACKNOWLEDGE_DELAY=6,
+       NET_NETROM_TRANSPORT_BUSY_DELAY=7,
+       NET_NETROM_TRANSPORT_REQUESTED_WINDOW_SIZE=8,
+       NET_NETROM_TRANSPORT_NO_ACTIVITY_TIMEOUT=9,
+       NET_NETROM_ROUTING_CONTROL=10,
+       NET_NETROM_LINK_FAILS_COUNT=11,
+       NET_NETROM_RESET=12
+};
+
+/* /proc/sys/net/ax25 */
+enum {
+       NET_AX25_IP_DEFAULT_MODE=1,
+       NET_AX25_DEFAULT_MODE=2,
+       NET_AX25_BACKOFF_TYPE=3,
+       NET_AX25_CONNECT_MODE=4,
+       NET_AX25_STANDARD_WINDOW=5,
+       NET_AX25_EXTENDED_WINDOW=6,
+       NET_AX25_T1_TIMEOUT=7,
+       NET_AX25_T2_TIMEOUT=8,
+       NET_AX25_T3_TIMEOUT=9,
+       NET_AX25_IDLE_TIMEOUT=10,
+       NET_AX25_N2=11,
+       NET_AX25_PACLEN=12,
+       NET_AX25_PROTOCOL=13,
+       NET_AX25_DAMA_SLAVE_TIMEOUT=14
+};
+
+/* /proc/sys/net/rose */
+enum {
+       NET_ROSE_RESTART_REQUEST_TIMEOUT=1,
+       NET_ROSE_CALL_REQUEST_TIMEOUT=2,
+       NET_ROSE_RESET_REQUEST_TIMEOUT=3,
+       NET_ROSE_CLEAR_REQUEST_TIMEOUT=4,
+       NET_ROSE_ACK_HOLD_BACK_TIMEOUT=5,
+       NET_ROSE_ROUTING_CONTROL=6,
+       NET_ROSE_LINK_FAIL_TIMEOUT=7,
+       NET_ROSE_MAX_VCS=8,
+       NET_ROSE_WINDOW_SIZE=9,
+       NET_ROSE_NO_ACTIVITY_TIMEOUT=10
+};
+
+/* /proc/sys/net/x25 */
+enum {
+       NET_X25_RESTART_REQUEST_TIMEOUT=1,
+       NET_X25_CALL_REQUEST_TIMEOUT=2,
+       NET_X25_RESET_REQUEST_TIMEOUT=3,
+       NET_X25_CLEAR_REQUEST_TIMEOUT=4,
+       NET_X25_ACK_HOLD_BACK_TIMEOUT=5,
+       NET_X25_FORWARD=6
+};
+
+/* /proc/sys/net/token-ring */
+enum
+{
+       NET_TR_RIF_TIMEOUT=1
+};
+
+/* /proc/sys/net/decnet/ */
+enum {
+       NET_DECNET_NODE_TYPE = 1,
+       NET_DECNET_NODE_ADDRESS = 2,
+       NET_DECNET_NODE_NAME = 3,
+       NET_DECNET_DEFAULT_DEVICE = 4,
+       NET_DECNET_TIME_WAIT = 5,
+       NET_DECNET_DN_COUNT = 6,
+       NET_DECNET_DI_COUNT = 7,
+       NET_DECNET_DR_COUNT = 8,
+       NET_DECNET_DST_GC_INTERVAL = 9,
+       NET_DECNET_CONF = 10,
+       NET_DECNET_NO_FC_MAX_CWND = 11,
+       NET_DECNET_MEM = 12,
+       NET_DECNET_RMEM = 13,
+       NET_DECNET_WMEM = 14,
+       NET_DECNET_DEBUG_LEVEL = 255
+};
+
+/* /proc/sys/net/decnet/conf/<dev> */
+enum {
+       NET_DECNET_CONF_LOOPBACK = -2,
+       NET_DECNET_CONF_DDCMP = -3,
+       NET_DECNET_CONF_PPP = -4,
+       NET_DECNET_CONF_X25 = -5,
+       NET_DECNET_CONF_GRE = -6,
+       NET_DECNET_CONF_ETHER = -7
+
+       /* ... and ifindex of devices */
+};
+
+/* /proc/sys/net/decnet/conf/<dev>/ */
+enum {
+       NET_DECNET_CONF_DEV_PRIORITY = 1,
+       NET_DECNET_CONF_DEV_T1 = 2,
+       NET_DECNET_CONF_DEV_T2 = 3,
+       NET_DECNET_CONF_DEV_T3 = 4,
+       NET_DECNET_CONF_DEV_FORWARDING = 5,
+       NET_DECNET_CONF_DEV_BLKSIZE = 6,
+       NET_DECNET_CONF_DEV_STATE = 7
+};
+
+/* /proc/sys/net/sctp */
+enum {
+       NET_SCTP_RTO_INITIAL = 1,
+       NET_SCTP_RTO_MIN     = 2,
+       NET_SCTP_RTO_MAX     = 3,
+       NET_SCTP_RTO_ALPHA   = 4,
+       NET_SCTP_RTO_BETA    = 5,
+       NET_SCTP_VALID_COOKIE_LIFE       =  6,
+       NET_SCTP_ASSOCIATION_MAX_RETRANS =  7,
+       NET_SCTP_PATH_MAX_RETRANS        =  8,
+       NET_SCTP_MAX_INIT_RETRANSMITS    =  9,
+       NET_SCTP_HB_INTERVAL             = 10,
+       NET_SCTP_PRESERVE_ENABLE         = 11,
+       NET_SCTP_MAX_BURST               = 12,
+       NET_SCTP_ADDIP_ENABLE            = 13,
+       NET_SCTP_PRSCTP_ENABLE           = 14,
+       NET_SCTP_SNDBUF_POLICY           = 15,
+       NET_SCTP_SACK_TIMEOUT            = 16,
+       NET_SCTP_RCVBUF_POLICY           = 17,
+};
+
+/* /proc/sys/net/bridge */
+enum {
+       NET_BRIDGE_NF_CALL_ARPTABLES = 1,
+       NET_BRIDGE_NF_CALL_IPTABLES = 2,
+       NET_BRIDGE_NF_CALL_IP6TABLES = 3,
+       NET_BRIDGE_NF_FILTER_VLAN_TAGGED = 4,
+       NET_BRIDGE_NF_FILTER_PPPOE_TAGGED = 5,
+};
+
+/* proc/sys/net/irda */
+enum {
+       NET_IRDA_DISCOVERY=1,
+       NET_IRDA_DEVNAME=2,
+       NET_IRDA_DEBUG=3,
+       NET_IRDA_FAST_POLL=4,
+       NET_IRDA_DISCOVERY_SLOTS=5,
+       NET_IRDA_DISCOVERY_TIMEOUT=6,
+       NET_IRDA_SLOT_TIMEOUT=7,
+       NET_IRDA_MAX_BAUD_RATE=8,
+       NET_IRDA_MIN_TX_TURN_TIME=9,
+       NET_IRDA_MAX_TX_DATA_SIZE=10,
+       NET_IRDA_MAX_TX_WINDOW=11,
+       NET_IRDA_MAX_NOREPLY_TIME=12,
+       NET_IRDA_WARN_NOREPLY_TIME=13,
+       NET_IRDA_LAP_KEEPALIVE_TIME=14,
+};
+
+
+/* CTL_FS names: */
+enum
+{
+       FS_NRINODE=1,   /* int:current number of allocated inodes */
+       FS_STATINODE=2,
+       FS_MAXINODE=3,  /* int:maximum number of inodes that can be allocated */
+       FS_NRDQUOT=4,   /* int:current number of allocated dquots */
+       FS_MAXDQUOT=5,  /* int:maximum number of dquots that can be allocated */
+       FS_NRFILE=6,    /* int:current number of allocated filedescriptors */
+       FS_MAXFILE=7,   /* int:maximum number of filedescriptors that can be allocated */
+       FS_DENTRY=8,
+       FS_NRSUPER=9,   /* int:current number of allocated super_blocks */
+       FS_MAXSUPER=10, /* int:maximum number of super_blocks that can be allocated */
+       FS_OVERFLOWUID=11,      /* int: overflow UID */
+       FS_OVERFLOWGID=12,      /* int: overflow GID */
+       FS_LEASES=13,   /* int: leases enabled */
+       FS_DIR_NOTIFY=14,       /* int: directory notification enabled */
+       FS_LEASE_TIME=15,       /* int: maximum time to wait for a lease break */
+       FS_DQSTATS=16,  /* disc quota usage statistics and control */
+       FS_XFS=17,      /* struct: control xfs parameters */
+       FS_AIO_NR=18,   /* current system-wide number of aio requests */
+       FS_AIO_MAX_NR=19,       /* system-wide maximum number of aio requests */
+       FS_INOTIFY=20,  /* inotify submenu */
+       FS_OCFS2=988,   /* ocfs2 */
+};
+
+/* /proc/sys/fs/quota/ */
+enum {
+       FS_DQ_LOOKUPS = 1,
+       FS_DQ_DROPS = 2,
+       FS_DQ_READS = 3,
+       FS_DQ_WRITES = 4,
+       FS_DQ_CACHE_HITS = 5,
+       FS_DQ_ALLOCATED = 6,
+       FS_DQ_FREE = 7,
+       FS_DQ_SYNCS = 8,
+       FS_DQ_WARNINGS = 9,
+};
+
+/* CTL_DEBUG names: */
+
+/* CTL_DEV names: */
+enum {
+       DEV_CDROM=1,
+       DEV_HWMON=2,
+       DEV_PARPORT=3,
+       DEV_RAID=4,
+       DEV_MAC_HID=5,
+       DEV_SCSI=6,
+       DEV_IPMI=7,
+};
+
+/* /proc/sys/dev/cdrom */
+enum {
+       DEV_CDROM_INFO=1,
+       DEV_CDROM_AUTOCLOSE=2,
+       DEV_CDROM_AUTOEJECT=3,
+       DEV_CDROM_DEBUG=4,
+       DEV_CDROM_LOCK=5,
+       DEV_CDROM_CHECK_MEDIA=6
+};
+
+/* /proc/sys/dev/parport */
+enum {
+       DEV_PARPORT_DEFAULT=-3
+};
+
+/* /proc/sys/dev/raid */
+enum {
+       DEV_RAID_SPEED_LIMIT_MIN=1,
+       DEV_RAID_SPEED_LIMIT_MAX=2
+};
+
+/* /proc/sys/dev/parport/default */
+enum {
+       DEV_PARPORT_DEFAULT_TIMESLICE=1,
+       DEV_PARPORT_DEFAULT_SPINTIME=2
+};
+
+/* /proc/sys/dev/parport/parport n */
+enum {
+       DEV_PARPORT_SPINTIME=1,
+       DEV_PARPORT_BASE_ADDR=2,
+       DEV_PARPORT_IRQ=3,
+       DEV_PARPORT_DMA=4,
+       DEV_PARPORT_MODES=5,
+       DEV_PARPORT_DEVICES=6,
+       DEV_PARPORT_AUTOPROBE=16
+};
+
+/* /proc/sys/dev/parport/parport n/devices/ */
+enum {
+       DEV_PARPORT_DEVICES_ACTIVE=-3,
+};
+
+/* /proc/sys/dev/parport/parport n/devices/device n */
+enum {
+       DEV_PARPORT_DEVICE_TIMESLICE=1,
+};
+
+/* /proc/sys/dev/mac_hid */
+enum {
+       DEV_MAC_HID_KEYBOARD_SENDS_LINUX_KEYCODES=1,
+       DEV_MAC_HID_KEYBOARD_LOCK_KEYCODES=2,
+       DEV_MAC_HID_MOUSE_BUTTON_EMULATION=3,
+       DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=4,
+       DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=5,
+       DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=6
+};
+
+/* /proc/sys/dev/scsi */
+enum {
+       DEV_SCSI_LOGGING_LEVEL=1,
+};
+
+/* /proc/sys/dev/ipmi */
+enum {
+       DEV_IPMI_POWEROFF_POWERCYCLE=1,
+};
+
+/* /proc/sys/abi */
+enum
+{
+       ABI_DEFHANDLER_COFF=1,  /* default handler for coff binaries */
+       ABI_DEFHANDLER_ELF=2,   /* default handler for ELF binaries */
+       ABI_DEFHANDLER_LCALL7=3,/* default handler for procs using lcall7 */
+       ABI_DEFHANDLER_LIBCSO=4,/* default handler for an libc.so ELF interp */
+       ABI_TRACE=5,            /* tracing flags */
+       ABI_FAKE_UTSNAME=6,     /* fake target utsname information */
+};
+
+
+#endif /* _LINUX_SYSCTL_H */
diff --git a/include/linux/sysinfo.h b/include/linux/sysinfo.h
new file mode 100644 (file)
index 0000000..934335a
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef _LINUX_SYSINFO_H
+#define _LINUX_SYSINFO_H
+
+#include <linux/types.h>
+
+#define SI_LOAD_SHIFT  16
+struct sysinfo {
+       __kernel_long_t uptime;         /* Seconds since boot */
+       __kernel_ulong_t loads[3];      /* 1, 5, and 15 minute load averages */
+       __kernel_ulong_t totalram;      /* Total usable main memory size */
+       __kernel_ulong_t freeram;       /* Available memory size */
+       __kernel_ulong_t sharedram;     /* Amount of shared memory */
+       __kernel_ulong_t bufferram;     /* Memory used by buffers */
+       __kernel_ulong_t totalswap;     /* Total swap space size */
+       __kernel_ulong_t freeswap;      /* swap space still available */
+       __u16 procs;                    /* Number of current processes */
+       __u16 pad;                      /* Explicit padding for m68k */
+       __kernel_ulong_t totalhigh;     /* Total high memory size */
+       __kernel_ulong_t freehigh;      /* Available high memory size */
+       __u32 mem_unit;                 /* Memory unit size in bytes */
+       char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)];   /* Padding: libc5 uses this.. */
+};
+
+#endif /* _LINUX_SYSINFO_H */
index 8ac8041ab5f134b74391f5470cef16f3f435ed1c..a11bb355dbfb2ba9b65a2e2b6c2eac9dc3b0e6c0 100644 (file)
@@ -21,7 +21,8 @@ enum {
        TCA_CSUM_UPDATE_FLAG_IGMP    = 4,
        TCA_CSUM_UPDATE_FLAG_TCP     = 8,
        TCA_CSUM_UPDATE_FLAG_UDP     = 16,
-       TCA_CSUM_UPDATE_FLAG_UDPLITE = 32
+       TCA_CSUM_UPDATE_FLAG_UDPLITE = 32,
+       TCA_CSUM_UPDATE_FLAG_SCTP    = 64,
 };
 
 struct tc_csum {
index cd18360eca249be09c6a649efcb53a147ed76fd2..7c2817866c97e2f72f3f72315e42a34443eff022 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <linux/types.h>
 #include <linux/pkt_cls.h>
+#include <linux/ife.h>
 
 #define TCA_ACT_IFE 25
 /* Flag bits for now just encoding/decoding; mutually exclusive */
@@ -28,13 +29,4 @@ enum {
 };
 #define TCA_IFE_MAX (__TCA_IFE_MAX - 1)
 
-#define IFE_META_SKBMARK 1
-#define IFE_META_HASHID 2
-#define        IFE_META_PRIO 3
-#define        IFE_META_QMAP 4
-#define        IFE_META_TCINDEX 5
-/*Can be overridden at runtime by module option*/
-#define        __IFE_META_MAX 6
-#define IFE_META_MAX (__IFE_META_MAX - 1)
-
 #endif
index 6389959a5157cf1f43338a3742093f66b14b564e..143d2b31a316624fbec24d40b7fb04da2b7eede5 100644 (file)
@@ -11,10 +11,41 @@ enum {
        TCA_PEDIT_TM,
        TCA_PEDIT_PARMS,
        TCA_PEDIT_PAD,
+       TCA_PEDIT_PARMS_EX,
+       TCA_PEDIT_KEYS_EX,
+       TCA_PEDIT_KEY_EX,
        __TCA_PEDIT_MAX
 };
 #define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1)
                                                                                 
+enum {
+       TCA_PEDIT_KEY_EX_HTYPE = 1,
+       TCA_PEDIT_KEY_EX_CMD = 2,
+       __TCA_PEDIT_KEY_EX_MAX
+};
+#define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1)
+
+ /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It
+  * means no specific header type - offset is relative to the network layer
+  */
+enum pedit_header_type {
+       TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0,
+       TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1,
+       TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2,
+       TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3,
+       TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4,
+       TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5,
+       __PEDIT_HDR_TYPE_MAX,
+};
+#define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1)
+
+enum pedit_cmd {
+       TCA_PEDIT_KEY_EX_CMD_SET = 0,
+       TCA_PEDIT_KEY_EX_CMD_ADD = 1,
+       __PEDIT_CMD_MAX,
+};
+#define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1)
+
 struct tc_pedit_key {
        __u32           mask;  /* AND */
        __u32           val;   /*XOR */
diff --git a/include/linux/tc_act/tc_sample.h b/include/linux/tc_act/tc_sample.h
new file mode 100644 (file)
index 0000000..edc9058
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef __LINUX_TC_SAMPLE_H
+#define __LINUX_TC_SAMPLE_H
+
+#include <linux/types.h>
+#include <linux/pkt_cls.h>
+#include <linux/if_ether.h>
+
+#define TCA_ACT_SAMPLE 26
+
+struct tc_sample {
+       tc_gen;
+};
+
+enum {
+       TCA_SAMPLE_UNSPEC,
+       TCA_SAMPLE_TM,
+       TCA_SAMPLE_PARMS,
+       TCA_SAMPLE_RATE,
+       TCA_SAMPLE_TRUNC_SIZE,
+       TCA_SAMPLE_PSAMPLE_GROUP,
+       TCA_SAMPLE_PAD,
+       __TCA_SAMPLE_MAX
+};
+#define TCA_SAMPLE_MAX (__TCA_SAMPLE_MAX - 1)
+
+#endif
diff --git a/include/linux/tc_act/tc_skbmod.h b/include/linux/tc_act/tc_skbmod.h
new file mode 100644 (file)
index 0000000..10fc07d
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016, Jamal Hadi Salim
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+*/
+
+#ifndef __LINUX_TC_SKBMOD_H
+#define __LINUX_TC_SKBMOD_H
+
+#include <linux/pkt_cls.h>
+
+#define TCA_ACT_SKBMOD 15
+
+#define SKBMOD_F_DMAC  0x1
+#define SKBMOD_F_SMAC  0x2
+#define SKBMOD_F_ETYPE 0x4
+#define SKBMOD_F_SWAPMAC 0x8
+
+struct tc_skbmod {
+       tc_gen;
+       __u64 flags;
+};
+
+enum {
+       TCA_SKBMOD_UNSPEC,
+       TCA_SKBMOD_TM,
+       TCA_SKBMOD_PARMS,
+       TCA_SKBMOD_DMAC,
+       TCA_SKBMOD_SMAC,
+       TCA_SKBMOD_ETYPE,
+       TCA_SKBMOD_PAD,
+       __TCA_SKBMOD_MAX
+};
+#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1)
+
+#endif
diff --git a/include/linux/tc_ematch/tc_em_text.h b/include/linux/tc_ematch/tc_em_text.h
deleted file mode 100644 (file)
index 5aac404..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __LINUX_TC_EM_TEXT_H
-#define __LINUX_TC_EM_TEXT_H
-
-#include <linux/types.h>
-#include <linux/pkt_cls.h>
-
-#define TC_EM_TEXT_ALGOSIZ     16
-
-struct tcf_em_text {
-       char            algo[TC_EM_TEXT_ALGOSIZ];
-       __u16           from_offset;
-       __u16           to_offset;
-       __u16           pattern_len;
-       __u8            from_layer:4;
-       __u8            to_layer:4;
-       __u8            pad;
-};
-
-#endif
index 646c488f97c8dedb582ad8a8b38be5206ae05217..d34fb5c5aa75360cf5914e9041914611d54ada00 100644 (file)
@@ -116,6 +116,7 @@ enum {
 #define TCP_SAVE_SYN           27      /* Record SYN headers for new connections */
 #define TCP_SAVED_SYN          28      /* Get SYN headers recorded for connection */
 #define TCP_REPAIR_WINDOW      29      /* Get/set window parameters */
+#define TCP_FASTOPEN_CONNECT   30      /* Attempt FastOpen with connect */
 
 struct tcp_repair_opt {
        __u32   opt_code;
@@ -226,6 +227,8 @@ enum {
        TCP_NLA_BUSY,           /* Time (usec) busy sending data */
        TCP_NLA_RWND_LIMITED,   /* Time (usec) limited by receive window */
        TCP_NLA_SNDBUF_LIMITED, /* Time (usec) limited by send buffer */
+       TCP_NLA_DATA_SEGS_OUT,  /* Data pkts sent including retransmission */
+       TCP_NLA_TOTAL_RETRANS,  /* Data pkts retransmitted */
 };
 
 /* for TCP_MD5SIG socket option */
index 400430084808b827cd709de532710eaa03cdefa4..924fb5cf1d46877da54a569bfa459e3e78cc2d25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * include/uapi/linux/tipc.h: Header for TIPC socket interface
  *
- * Copyright (c) 2003-2006, Ericsson AB
+ * Copyright (c) 2003-2006, 2015-2016 Ericsson AB
  * Copyright (c) 2005, 2010-2011, Wind River Systems
  * All rights reserved.
  *
@@ -220,7 +220,7 @@ struct sockaddr_tipc {
 #define TIPC_DESTNAME  3       /* destination name */
 
 /*
- * TIPC-specific socket option values
+ * TIPC-specific socket option names
  */
 
 #define TIPC_IMPORTANCE                127     /* Default: TIPC_LOW_IMPORTANCE */
@@ -229,6 +229,8 @@ struct sockaddr_tipc {
 #define TIPC_CONN_TIMEOUT      130     /* Default: 8000 (ms)  */
 #define TIPC_NODE_RECVQ_DEPTH  131     /* Default: none (read only) */
 #define TIPC_SOCK_RECVQ_DEPTH  132     /* Default: none (read only) */
+#define TIPC_MCAST_BROADCAST    133     /* Default: TIPC selects. No arg */
+#define TIPC_MCAST_REPLICAST    134     /* Default: TIPC selects. No arg */
 
 /*
  * Maximum sizes of TIPC bearer-related names (including terminating NULL)
index d2d4202660ebba0f7372a81a4e850ca6a887b5e9..a17ff355548898149ae3686c45e890c537dd9068 100644 (file)
@@ -22,7 +22,8 @@
 static void print_explain(FILE *f)
 {
        fprintf(f,
-               "Usage: ... bridge [ forward_delay FORWARD_DELAY ]\n"
+               "Usage: ... bridge [ fdb_flush ]\n"
+               "                  [ forward_delay FORWARD_DELAY ]\n"
                "                  [ hello_time HELLO_TIME ]\n"
                "                  [ max_age MAX_AGE ]\n"
                "                  [ ageing_time AGEING_TIME ]\n"
@@ -33,6 +34,7 @@ static void print_explain(FILE *f)
                "                  [ vlan_filtering VLAN_FILTERING ]\n"
                "                  [ vlan_protocol VLAN_PROTOCOL ]\n"
                "                  [ vlan_default_pvid VLAN_DEFAULT_PVID ]\n"
+               "                  [ vlan_stats_enabled VLAN_STATS_ENABLED ]\n"
                "                  [ mcast_snooping MULTICAST_SNOOPING ]\n"
                "                  [ mcast_router MULTICAST_ROUTER ]\n"
                "                  [ mcast_query_use_ifaddr MCAST_QUERY_USE_IFADDR ]\n"
@@ -47,6 +49,9 @@ static void print_explain(FILE *f)
                "                  [ mcast_query_interval QUERY_INTERVAL ]\n"
                "                  [ mcast_query_response_interval QUERY_RESPONSE_INTERVAL ]\n"
                "                  [ mcast_startup_query_interval STARTUP_QUERY_INTERVAL ]\n"
+               "                  [ mcast_stats_enabled MCAST_STATS_ENABLED ]\n"
+               "                  [ mcast_igmp_version IGMP_VERSION ]\n"
+               "                  [ mcast_mld_version MLD_VERSION ]\n"
                "                  [ nf_call_iptables NF_CALL_IPTABLES ]\n"
                "                  [ nf_call_ip6tables NF_CALL_IP6TABLES ]\n"
                "                  [ nf_call_arptables NF_CALL_ARPTABLES ]\n"
@@ -145,6 +150,8 @@ static int bridge_parse_opt(struct link_util *lu, int argc, char **argv,
                        if (len < 0)
                                return -1;
                        addattr_l(n, 1024, IFLA_BR_GROUP_ADDR, llabuf, len);
+               } else if (matches(*argv, "fdb_flush") == 0) {
+                       addattr(n, 1024, IFLA_BR_FDB_FLUSH);
                } else if (matches(*argv, "vlan_default_pvid") == 0) {
                        __u16 default_pvid;
 
@@ -154,6 +161,14 @@ static int bridge_parse_opt(struct link_util *lu, int argc, char **argv,
 
                        addattr16(n, 1024, IFLA_BR_VLAN_DEFAULT_PVID,
                                  default_pvid);
+               } else if (matches(*argv, "vlan_stats_enabled") == 0) {
+                       __u8 vlan_stats_enabled;
+
+                       NEXT_ARG();
+                       if (get_u8(&vlan_stats_enabled, *argv, 0))
+                               invarg("invalid vlan_stats_enabled", *argv);
+                       addattr8(n, 1024, IFLA_BR_VLAN_STATS_ENABLED,
+                                 vlan_stats_enabled);
                } else if (matches(*argv, "mcast_router") == 0) {
                        __u8 mcast_router;
 
@@ -287,6 +302,30 @@ static int bridge_parse_opt(struct link_util *lu, int argc, char **argv,
 
                        addattr64(n, 1024, IFLA_BR_MCAST_STARTUP_QUERY_INTVL,
                                  mcast_startup_query_intvl);
+               } else if (matches(*argv, "mcast_stats_enabled") == 0) {
+                       __u8 mcast_stats_enabled;
+
+                       NEXT_ARG();
+                       if (get_u8(&mcast_stats_enabled, *argv, 0))
+                               invarg("invalid mcast_stats_enabled", *argv);
+                       addattr8(n, 1024, IFLA_BR_MCAST_STATS_ENABLED,
+                                 mcast_stats_enabled);
+               } else if (matches(*argv, "mcast_igmp_version") == 0) {
+                       __u8 igmp_version;
+
+                       NEXT_ARG();
+                       if (get_u8(&igmp_version, *argv, 0))
+                               invarg("invalid mcast_igmp_version", *argv);
+                       addattr8(n, 1024, IFLA_BR_MCAST_IGMP_VERSION,
+                                 igmp_version);
+               } else if (matches(*argv, "mcast_mld_version") == 0) {
+                       __u8 mld_version;
+
+                       NEXT_ARG();
+                       if (get_u8(&mld_version, *argv, 0))
+                               invarg("invalid mcast_mld_version", *argv);
+                       addattr8(n, 1024, IFLA_BR_MCAST_MLD_VERSION,
+                                 mld_version);
                } else if (matches(*argv, "nf_call_iptables") == 0) {
                        __u8 nf_call_ipt;
 
@@ -439,6 +478,10 @@ static void bridge_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
                fprintf(f, "vlan_default_pvid %u ",
                        rta_getattr_u16(tb[IFLA_BR_VLAN_DEFAULT_PVID]));
 
+       if (tb[IFLA_BR_VLAN_STATS_ENABLED])
+               fprintf(f, "vlan_stats_enabled %u ",
+                       rta_getattr_u8(tb[IFLA_BR_VLAN_STATS_ENABLED]));
+
        if (tb[IFLA_BR_GROUP_FWD_MASK])
                fprintf(f, "group_fwd_mask %#x ",
                        rta_getattr_u16(tb[IFLA_BR_GROUP_FWD_MASK]));
@@ -508,6 +551,18 @@ static void bridge_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
                fprintf(f, "mcast_startup_query_interval %llu ",
                        rta_getattr_u64(tb[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]));
 
+       if (tb[IFLA_BR_MCAST_STATS_ENABLED])
+               fprintf(f, "mcast_stats_enabled %u ",
+                       rta_getattr_u8(tb[IFLA_BR_MCAST_STATS_ENABLED]));
+
+       if (tb[IFLA_BR_MCAST_IGMP_VERSION])
+               fprintf(f, "mcast_igmp_version %u ",
+                       rta_getattr_u8(tb[IFLA_BR_MCAST_IGMP_VERSION]));
+
+       if (tb[IFLA_BR_MCAST_MLD_VERSION])
+               fprintf(f, "mcast_mld_version %u ",
+                       rta_getattr_u8(tb[IFLA_BR_MCAST_MLD_VERSION]));
+
        if (tb[IFLA_BR_NF_CALL_IPTABLES])
                fprintf(f, "nf_call_iptables %u ",
                        rta_getattr_u8(tb[IFLA_BR_NF_CALL_IPTABLES]));
index fbb3f06e8ff764bf983aad81ab334c0a97b35b3d..6353fc533bf9f33ba67edf1ce49d8d8ab3cfed0e 100644 (file)
 static void print_explain(FILE *f)
 {
        fprintf(f,
-               "Usage: ... bridge_slave [ state STATE ] [ priority PRIO ] [cost COST ]\n"
+               "Usage: ... bridge_slave [ fdb_flush ]\n"
+               "                        [ state STATE ]\n"
+               "                        [ priority PRIO ]\n"
+               "                        [ cost COST ]\n"
                "                        [ guard {on | off} ]\n"
                "                        [ hairpin {on | off} ]\n"
                "                        [ fastleave {on | off} ]\n"
@@ -217,7 +220,9 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
        __u32 cost;
 
        while (argc > 0) {
-               if (matches(*argv, "state") == 0) {
+               if (matches(*argv, "fdb_flush") == 0) {
+                       addattr(n, 1024, IFLA_BRPORT_FLUSH);
+               } else if (matches(*argv, "state") == 0) {
                        NEXT_ARG();
                        if (get_u8(&state, *argv, 0))
                                invarg("state is invalid", *argv);
index 512afcd2086eb6b4706fc1860dbdfc05e9f2d581..593ce3a1bd95457033e55669ffdce707da8317e7 100644 (file)
@@ -159,6 +159,8 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
                        nh = RTNH_NEXT(nh);
                }
        }
+       fprintf(fp, " State: %s",
+               r->rtm_flags & RTNH_F_UNRESOLVED ? "unresolved" : "resolved");
        if (show_stats && tb[RTA_MFC_STATS]) {
                struct rta_mfc_stats *mfcs = RTA_DATA(tb[RTA_MFC_STATS]);
 
index 52dbdc7dea36b572cc4c74f766b0fa1e7e8ba712..83037c8a4824f44d57b69224fd39a83fb72637dd 100644 (file)
@@ -448,6 +448,8 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
                fprintf(fp, "notify ");
        if (r->rtm_flags & RTNH_F_LINKDOWN)
                fprintf(fp, "linkdown ");
+       if (r->rtm_flags & RTNH_F_UNRESOLVED)
+               fprintf(fp, "unresolved ");
        if (tb[RTA_MARK]) {
                unsigned int mark = *(unsigned int *)RTA_DATA(tb[RTA_MARK]);
 
index bc2fc8139c686b4b574f25d48726c92c679ff127..0ccc7312a84c65f848924c5cc4bdd991145cc5c8 100644 (file)
@@ -16,8 +16,8 @@ MAN8PAGES = $(TARGETS) ip.8 arpd.8 lnstat.8 routel.8 rtacct.8 rtmon.8 rtpr.8 ss.
        tc-basic.8 tc-cgroup.8 tc-flow.8 tc-flower.8 tc-fw.8 tc-route.8 \
        tc-tcindex.8 tc-u32.8 tc-matchall.8 \
        tc-connmark.8 tc-csum.8 tc-mirred.8 tc-nat.8 tc-pedit.8 tc-police.8 \
-       tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8  tc-ife.8 \
-       tc-tunnel_key.8 \
+       tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8 tc-ife.8 \
+       tc-tunnel_key.8 tc-sample.8 \
        devlink.8 devlink-dev.8 devlink-monitor.8 devlink-port.8 devlink-sb.8 \
        ifstat.8
 
index 469bb43c3ba76fb1e81191924844466e2a56cfc0..116034dc620a63c9d283479f74c84c92a8c1cb2b 100644 (file)
@@ -1429,6 +1429,8 @@ the following additional arguments are supported:
 
 .B "ip link set type bridge_slave"
 [
+.B fdb_flush
+] [
 .BI state " STATE"
 ] [
 .BI priority " PRIO"
@@ -1459,6 +1461,9 @@ the following additional arguments are supported:
 
 .in +8
 .sp
+.B fdb_flush
+- flush bridge slave's fdb dynamic entries
+
 .BI state " STATE"
 - Set port state.
 .I STATE
index 68e5610513a514fe13d90b6a31ffb81cf8beedd3..718301ded069bc0dc0026b3eef34af2ece76380f 100644 (file)
@@ -19,6 +19,7 @@ csum - checksum update action
 .BR tcp " |"
 .BR udp " |"
 .BR udplite " |"
+.BR sctp " |"
 .IR SWEETS " }"
 
 .ti -8
@@ -43,9 +44,11 @@ IGMP header
 TCP header
 .RB ( tcp ),
 UDP header
-.RB ( udp ") or"
+.RB ( udp ),
 UDPLite header
-.RB ( udplite ).
+.RB ( udplite ") or"
+SCTP header
+.RB ( sctp ).
 .TP
 .B SWEETS
 These are merely syntactic sugar and ignored internally.
index c5ddf3cbb14d924936133a63060f3513828d86f1..fc5bac503324b90c7428a7023c9f0c8271c0f7c0 100644 (file)
@@ -22,7 +22,7 @@ flower \- flow based traffic control filter
 .BR skip_sw " | " skip_hw
 .R " | { "
 .BR dst_mac " | " src_mac " } "
-.IR mac_address " | "
+.IR MASKED_LLADDR " | "
 .B vlan_id
 .IR VID " | "
 .B vlan_prio
@@ -31,16 +31,28 @@ flower \- flow based traffic control filter
 .IR ETH_TYPE " } | "
 .BR ip_proto " { " tcp " | " udp " | " sctp " | " icmp " | " icmpv6 " | "
 .IR IP_PROTO " } | { "
-.BR dst_ip " | " src_ip " } "
-.IR ipv4_address " | " ipv6_address " } | { "
+.BR dst_ip " | " src_ip " } "
+.IR PREFIX " | { "
 .BR dst_port " | " src_port " } "
 .IR port_number " } | "
+.B type
+.IR MASKED_TYPE " | "
+.B code
+.IR MASKED_CODE " | { "
+.BR arp_tip " | " arp_sip " } "
+.IR IPV4_PREFIX " | "
+.BR arp_op " { " request " | " reply " | "
+.IR OP " } | { "
+.BR arp_tha " | " arp_sha " } "
+.IR MASKED_LLADDR " | "
 .B enc_key_id
 .IR KEY-ID " | {"
 .BR enc_dst_ip " | " enc_src_ip " } { "
 .IR ipv4_address " | " ipv6_address " } | "
 .B enc_dst_port
-.IR UDP-PORT " | "
+.IR port_number " | "
+.BR ip_flags
+.IR IP_FLAGS
 .SH DESCRIPTION
 The
 .B flower
@@ -74,10 +86,15 @@ filter, or TC offload is not enabled for the interface, operation will fail.
 .BI skip_hw
 Do not process filter by hardware.
 .TP
-.BI dst_mac " mac_address"
+.BI dst_mac " MASKED_LLADDR"
 .TQ
-.BI src_mac " mac_address"
-Match on source or destination MAC address.
+.BI src_mac " MASKED_LLADDR"
+Match on source or destination MAC address.  A mask may be optionally
+provided to limit the bits of the address which are matched. A mask is
+provided by following the address with a slash and then the mask. It may be
+provided in LLADDR format, in which case it is a bitwise mask, or as a
+number of high bits to match. If the mask is missing then a match on all
+bits is assumed.
 .TP
 .BI vlan_id " VID"
 Match on vlan tag id.
@@ -103,14 +120,14 @@ may be
 .BR tcp ", " udp ", " sctp ", " icmp ", " icmpv6
 or an unsigned 8bit value in hexadecimal format.
 .TP
-.BI dst_ip " ADDRESS"
+.BI dst_ip " PREFIX"
 .TQ
-.BI src_ip " ADDRESS"
+.BI src_ip " PREFIX"
 Match on source or destination IP address.
-.I ADDRESS
-must be a valid IPv4 or IPv6 address, depending on
-.BR protocol
-option of tc filter.
+.I PREFIX
+must be a valid IPv4 or IPv6 address, depending on the \fBprotocol\fR
+option to tc filter, optionally followed by a slash and the prefix length.
+If the prefix is missing, \fBtc\fR assumes a full-length host match.
 .TP
 .BI dst_port " NUMBER"
 .TQ
@@ -119,33 +136,76 @@ Match on layer 4 protocol source or destination port number. Only available for
 .BR ip_proto " values " udp ", " tcp  " and " sctp
 which have to be specified in beforehand.
 .TP
-.BI type " NUMBER"
+.BI type " MASKED_TYPE"
 .TQ
-.BI code " NUMBER"
-Match on ICMP type or code. Only available for
+.BI code " MASKED_CODE"
+Match on ICMP type or code. A mask may be optionally provided to limit the
+bits of the address which are matched. A mask is provided by following the
+address with a slash and then the mask. The mask must be as a number which
+represents a bitwise mask If the mask is missing then a match on all bits
+is assumed.  Only available for
 .BR ip_proto " values " icmp  " and " icmpv6
 which have to be specified in beforehand.
 .TP
+.BI arp_tip " IPV4_PREFIX"
+.TQ
+.BI arp_sip " IPV4_PREFIX"
+Match on ARP or RARP sender or target IP address.
+.I IPV4_PREFIX
+must be a valid IPv4 address optionally followed by a slash and the prefix
+length. If the prefix is missing, \fBtc\fR assumes a full-length host
+match.
+.TP
+.BI arp_op " ARP_OP"
+Match on ARP or RARP operation.
+.I ARP_OP
+may be
+.BR request ", " reply
+or an integer value 0, 1 or 2.  A mask may be optionally provided to limit
+the bits of the operation which are matched. A mask is provided by
+following the address with a slash and then the mask. It may be provided as
+an unsigned 8 bit value representing a bitwise mask. If the mask is missing
+then a match on all bits is assumed.
+.TP
+.BI arp_sha " MASKED_LLADDR"
+.TQ
+.BI arp_tha " MASKED_LLADDR"
+Match on ARP or RARP sender or target MAC address.  A mask may be optionally
+provided to limit the bits of the address which are matched. A mask is
+provided by following the address with a slash and then the mask. It may be
+provided in LLADDR format, in which case it is a bitwise mask, or as a
+number of high bits to match. If the mask is missing then a match on all
+bits is assumed.
+.TP
 .BI enc_key_id " NUMBER"
 .TQ
-.BI enc_dst_ip " ADDRESS"
+.BI enc_dst_ip " PREFIX"
 .TQ
-.BI enc_src_ip " ADDRESS"
+.BI enc_src_ip " PREFIX"
 .TQ
 .BI enc_dst_port " NUMBER"
 Match on IP tunnel metadata. Key id
 .I NUMBER
 is a 32 bit tunnel key id (e.g. VNI for VXLAN tunnel).
-.I ADDRESS
-must be a valid IPv4 or IPv6 address. Dst port
+.I PREFIX
+must be a valid IPv4 or IPv6 address optionally followed by a slash and the
+prefix length. If the prefix is missing, \fBtc\fR assumes a full-length
+host match.  Dst port
 .I NUMBER
 is a 16 bit UDP dst port.
+.TP
+.BI ip_flags " IP_FLAGS"
+.I IP_FLAGS
+may be either
+.BR frag " or " nofrag
+to match on fragmented packets or not respectively.
 .SH NOTES
 As stated above where applicable, matches of a certain layer implicitly depend
 on the matches of the next lower layer. Precisely, layer one and two matches
 (\fBindev\fR,  \fBdst_mac\fR and \fBsrc_mac\fR)
 have no dependency, layer three matches
-(\fBip_proto\fR, \fBdst_ip\fR and \fBsrc_ip\fR)
+(\fBip_proto\fR, \fBdst_ip\fR, \fBsrc_ip\fR, \fBarp_tip\fR, \fBarp_sip\fR,
+\fBarp_op\fR, \fBarp_tha\fR, \fBarp_sha\fR and \fBip_flags\fR)
 depend on the
 .B protocol
 option of tc filter, layer four port matches
index 5aa11dab905d091d266c89af71affd6565f34e9f..53b2194e023a1700e04a6356066b3c5603fd2d6d 100644 (file)
@@ -71,6 +71,16 @@ that replaces the root qdisc on device
 where the second command attaches a matchall filters on it that mirrors the
 packets to device eth2.
 
+To sample one of every 100 packets flowing into interface eth0 to psample group
+12:
+.RS
+.EX
+
+tc qdisc add dev eth0 handle ffff: ingress
+tc filter add dev eth0 parent ffff: matchall \\
+     action sample rate 100 group 12
+.EE
+.RE
 
 .EE
 .SH SEE ALSO
diff --git a/man/man8/tc-sample.8 b/man/man8/tc-sample.8
new file mode 100644 (file)
index 0000000..3e03eba
--- /dev/null
@@ -0,0 +1,125 @@
+.TH "Packet sample action in tc" 8 "31 Jan 2017" "iproute2" "Linux"
+
+.SH NAME
+sample - packet sampling tc action
+.SH SYNOPSIS
+.in +8
+.ti -8
+
+.BR tc " ... " "action sample rate"
+.I RATE
+.BR "group"
+.I GROUP
+.RB "[ " trunc
+.IR SIZE " ] "
+.RB "[ " index
+.IR INDEX " ] "
+.ti -8
+
+.BR tc " ... " "action sample index "
+.I INDEX
+.ti -8
+
+.SH DESCRIPTION
+The
+.B sample
+action allows sampling packets matching classifier.
+
+The packets are chosen randomly according to the
+.B rate
+parameter, and are sampled using the
+.B psample
+generic netlink channel. The user can also specify packet truncation to save
+user-kernel traffic. Each sample includes some informative metadata about the
+original packet, which is sent using netlink attributes, alongside the original
+packet data.
+
+The user can either specify the sample action parameters as presented in the
+first form above, or use an existing sample action using its index, as presented
+in the second form.
+
+.SH SAMPLED PACKETS METADATA FIELDS
+The metadata are delivered to userspace applications using the
+.B psample
+generic netlink channel, where each sample includes the following netlink
+attributes:
+.TP
+.BI PSAMPLE_ATTR_IIFINDEX
+The input interface index of the packet, if there is one.
+.TP
+.BI PSAMPLE_ATTR_OIFINDEX
+The output interface index of the packet. This field is not relevant on ingress
+sampling
+.TP
+.BI PSAMPLE_ATTR_ORIGSIZE
+The size of the original packet (before truncation)
+.TP
+.BI PSAMPLE_ATTR_SAMPLE_GROUP
+The
+.B psample
+group the packet was sent to
+.TP
+.BI PSAMPLE_ATTR_GROUP_SEQ
+A sequence number of the sampled packet. This number is incremented with each
+sampled packet of the current
+.B psample
+group
+.TP
+.BI PSAMPLE_ATTR_SAMPLE_RATE
+The rate the packet was sampled with
+.RE
+
+.SH OPTIONS
+.TP
+.BI rate " RATE"
+The packet sample rate.
+.I "RATE"
+is the expected ratio between observed packets and sampled packets. For example,
+.I "RATE"
+of 100 will lead to an average of one sampled packet out of every 100 observed.
+.TP
+.BI trunc " SIZE"
+Upon set, defines the maximum size of the sampled packets, and causes truncation
+if needed
+.TP
+.BI group " GROUP"
+The
+.B psample
+group the packet will be sent to. The
+.B psample
+module defines the concept of groups, which allows the user to match specific
+sampled packets in the case of multiple sampling rules, thus identify only the
+packets that came from a specific rule.
+.TP
+.BI index " INDEX"
+Is a unique ID for an action. When creating new action instance, this parameter
+allows to set the new action index. When using existing action, this parameter
+allows to specify the existing action index.  The index must 32bit unsigned
+integer greater than zero.
+.SH EXAMPLES
+Sample one of every 100 packets flowing into interface eth0 to psample group 12:
+
+.RS
+.EX
+tc qdisc add dev eth0 handle ffff: ingress
+tc filter add dev eth0 parent ffff: matchall \\
+     action sample rate 100 group 12 index 19
+.EE
+.RE
+
+Use the same action instance to sample eth1 too:
+
+.RS
+.EX
+tc qdisc add dev eth1 handle ffff: ingress
+tc filter add dev eth1 parent ffff: matchall \\
+     action sample index 19
+.EE
+.RE
+
+.EE
+.RE
+.SH SEE ALSO
+.BR tc (8),
+.BR tc-matchall (8)
+.BR psample (1)
index 7fd0c4ad8f897ae82a64d0929efe74825b78c03d..6dd984f071854383647f4e40e74a0bd19eeca5ad 100644 (file)
@@ -51,6 +51,7 @@ TCMODULES += m_vlan.o
 TCMODULES += m_connmark.o
 TCMODULES += m_bpf.o
 TCMODULES += m_tunnel_key.o
+TCMODULES += m_sample.o
 TCMODULES += p_ip.o
 TCMODULES += p_icmp.o
 TCMODULES += p_tcp.o
index 145a85666c4e6f0890ecea5de499e793216e9eac..6bd03f2b8e4b54e2c27bd58a2a1eea5e8fa904bf 100644 (file)
@@ -15,6 +15,7 @@
 #include <syslog.h>
 #include <string.h>
 #include <net/if.h>
+#include <linux/if_arp.h>
 #include <linux/if_ether.h>
 #include <linux/ip.h>
 #include <linux/tc_act/tc_vlan.h>
 #include "tc_util.h"
 #include "rt_names.h"
 
+enum flower_matching_flags {
+       FLOWER_IP_FLAGS,
+};
+
 enum flower_endpoint {
        FLOWER_ENDPOINT_SRC,
        FLOWER_ENDPOINT_DST
@@ -45,20 +50,27 @@ static void explain(void)
                "                       vlan_id VID |\n"
                "                       vlan_prio PRIORITY |\n"
                "                       vlan_ethtype [ ipv4 | ipv6 | ETH-TYPE ] |\n"
-               "                       dst_mac MAC-ADDR |\n"
-               "                       src_mac MAC-ADDR |\n"
+               "                       dst_mac MASKED-LLADDR |\n"
+               "                       src_mac MASKED-LLADDR |\n"
                "                       ip_proto [tcp | udp | sctp | icmp | icmpv6 | IP-PROTO ] |\n"
-               "                       dst_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
-               "                       src_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
+               "                       dst_ip PREFIX |\n"
+               "                       src_ip PREFIX |\n"
                "                       dst_port PORT-NUMBER |\n"
                "                       src_port PORT-NUMBER |\n"
-               "                       type ICMP-TYPE |\n"
-               "                       code ICMP-CODE |\n"
+               "                       type MASKED-ICMP-TYPE |\n"
+               "                       code MASKED-ICMP-CODE |\n"
+               "                       arp_tip IPV4-PREFIX |\n"
+               "                       arp_sip IPV4-PREFIX |\n"
+               "                       arp_op [ request | reply | OP ] |\n"
+               "                       arp_tha MASKED-LLADDR |\n"
+               "                       arp_sha MASKED-LLADDR |\n"
                "                       enc_dst_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
                "                       enc_src_ip [ IPV4-ADDR | IPV6-ADDR ] |\n"
                "                       enc_key_id [ KEY-ID ] |\n"
-               "                       enc_dst_port [ UDP-PORT ] }\n"
+               "                       ip_flags IP-FLAGS | \n"
+               "                       enc_dst_port [ port_number ] }\n"
                "       FILTERID := X:Y:Z\n"
+               "       MASKED_LLADDR := { LLADDR | LLADDR/MASK | LLADDR/BITS }\n"
                "       ACTION-SPEC := ... look at individual actions\n"
                "\n"
                "NOTE: CLASSID, IP-PROTO are parsed as hexadecimal input.\n"
@@ -69,16 +81,44 @@ static void explain(void)
 static int flower_parse_eth_addr(char *str, int addr_type, int mask_type,
                                 struct nlmsghdr *n)
 {
-       int ret;
-       char addr[ETH_ALEN];
+       int ret, err = -1;
+       char addr[ETH_ALEN], *slash;
+
+       slash = strchr(str, '/');
+       if (slash)
+               *slash = '\0';
 
        ret = ll_addr_a2n(addr, sizeof(addr), str);
        if (ret < 0)
-               return -1;
+               goto err;
        addattr_l(n, MAX_MSG, addr_type, addr, sizeof(addr));
-       memset(addr, 0xff, ETH_ALEN);
+
+       if (slash) {
+               unsigned bits;
+
+               if (!get_unsigned(&bits, slash + 1, 10)) {
+                       uint64_t mask;
+
+                       /* Extra 16 bit shift to push mac address into
+                        * high bits of uint64_t
+                        */
+                       mask = htonll(0xffffffffffffULL << (16 + 48 - bits));
+                       memcpy(addr, &mask, ETH_ALEN);
+               } else {
+                       ret = ll_addr_a2n(addr, sizeof(addr), slash + 1);
+                       if (ret < 0)
+                               goto err;
+               }
+       } else {
+               memset(addr, 0xff, ETH_ALEN);
+       }
        addattr_l(n, MAX_MSG, mask_type, addr, sizeof(addr));
-       return 0;
+
+       err = 0;
+err:
+       if (slash)
+               *slash = '/';
+       return err;
 }
 
 static int flower_parse_vlan_eth_type(char *str, __be16 eth_type, int type,
@@ -100,6 +140,59 @@ static int flower_parse_vlan_eth_type(char *str, __be16 eth_type, int type,
        return 0;
 }
 
+struct flag_to_string {
+       int flag;
+       enum flower_matching_flags type;
+       char *string;
+};
+
+static struct flag_to_string flags_str[] = {
+       { TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOWER_IP_FLAGS, "frag" },
+};
+
+static int flower_parse_matching_flags(char *str,
+                                      enum flower_matching_flags type,
+                                      __u32 *mtf, __u32 *mtf_mask)
+{
+       char *token;
+       bool no;
+       bool found;
+       int i;
+
+       token = strtok(str, "/");
+
+       while (token) {
+               if (!strncmp(token, "no", 2)) {
+                       no = true;
+                       token += 2;
+               } else
+                       no = false;
+
+               found = false;
+               for (i = 0; i < ARRAY_SIZE(flags_str); i++) {
+                       if (type != flags_str[i].type)
+                               continue;
+
+                       if (!strcmp(token, flags_str[i].string)) {
+                               if (no)
+                                       *mtf &= ~flags_str[i].flag;
+                               else
+                                       *mtf |= flags_str[i].flag;
+
+                               *mtf_mask |= flags_str[i].flag;
+                               found = true;
+                               break;
+                       }
+               }
+               if (!found)
+                       return -1;
+
+               token = strtok(NULL, "/");
+       }
+
+       return 0;
+}
+
 static int flower_parse_ip_proto(char *str, __be16 eth_type, int type,
                                 __u8 *p_ip_proto, struct nlmsghdr *n)
 {
@@ -137,27 +230,16 @@ err:
        return -1;
 }
 
-static int flower_parse_ip_addr(char *str, __be16 eth_type,
-                               int addr4_type, int mask4_type,
-                               int addr6_type, int mask6_type,
-                               struct nlmsghdr *n)
+static int __flower_parse_ip_addr(char *str, int family,
+                                 int addr4_type, int mask4_type,
+                                 int addr6_type, int mask6_type,
+                                 struct nlmsghdr *n)
 {
        int ret;
        inet_prefix addr;
-       int family;
        int bits;
        int i;
 
-       if (eth_type == htons(ETH_P_IP)) {
-               family = AF_INET;
-       } else if (eth_type == htons(ETH_P_IPV6)) {
-               family = AF_INET6;
-       } else if (!eth_type) {
-               family = AF_UNSPEC;
-       } else {
-               return -1;
-       }
-
        ret = get_prefix(&addr, str, family);
        if (ret)
                return -1;
@@ -190,6 +272,126 @@ static int flower_parse_ip_addr(char *str, __be16 eth_type,
        return 0;
 }
 
+static int flower_parse_ip_addr(char *str, __be16 eth_type,
+                               int addr4_type, int mask4_type,
+                               int addr6_type, int mask6_type,
+                               struct nlmsghdr *n)
+{
+       int family;
+
+       if (eth_type == htons(ETH_P_IP)) {
+               family = AF_INET;
+       } else if (eth_type == htons(ETH_P_IPV6)) {
+               family = AF_INET6;
+       } else if (!eth_type) {
+               family = AF_UNSPEC;
+       } else {
+               return -1;
+       }
+
+       return __flower_parse_ip_addr(str, family, addr4_type, addr6_type,
+                                     mask4_type, mask6_type, n);
+}
+
+static bool flower_eth_type_arp(__be16 eth_type)
+{
+       return eth_type == htons(ETH_P_ARP) || eth_type == htons(ETH_P_RARP);
+}
+
+static int flower_parse_arp_ip_addr(char *str, __be16 eth_type,
+                                   int addr_type, int mask_type,
+                                   struct nlmsghdr *n)
+{
+       if (!flower_eth_type_arp(eth_type))
+               return -1;
+
+       return __flower_parse_ip_addr(str, AF_INET, addr_type, mask_type,
+                                     TCA_FLOWER_UNSPEC, TCA_FLOWER_UNSPEC, n);
+}
+
+static int flower_parse_u8(char *str, int value_type, int mask_type,
+                          int (*value_from_name)(const char *str,
+                                                __u8 *value),
+                          bool (*value_validate)(__u8 value),
+                          struct nlmsghdr *n)
+{
+       char *slash;
+       int ret, err = -1;
+       __u8 value, mask;
+
+       slash = strchr(str, '/');
+       if (slash)
+               *slash = '\0';
+
+       ret = value_from_name ? value_from_name(str, &value) : -1;
+       if (ret < 0) {
+               ret = get_u8(&value, str, 10);
+               if (ret)
+                       goto err;
+       }
+
+       if (value_validate && !value_validate(value))
+               goto err;
+
+       if (slash) {
+               ret = get_u8(&mask, slash + 1, 10);
+               if (ret)
+                       goto err;
+       }
+       else {
+               mask = UINT8_MAX;
+       }
+
+       addattr8(n, MAX_MSG, value_type, value);
+       addattr8(n, MAX_MSG, mask_type, mask);
+
+       err = 0;
+err:
+       if (slash)
+               *slash = '/';
+       return err;
+}
+
+static const char *flower_print_arp_op_to_name(__u8 op)
+{
+       switch (op) {
+       case ARPOP_REQUEST:
+               return "request";
+       case ARPOP_REPLY:
+               return "reply";
+       default:
+               return NULL;
+       }
+}
+
+static int flower_arp_op_from_name(const char *name, __u8 *op)
+{
+       if (!strcmp(name, "request"))
+               *op = ARPOP_REQUEST;
+       else if (!strcmp(name, "reply"))
+               *op = ARPOP_REPLY;
+       else
+               return -1;
+
+       return 0;
+}
+
+static bool flow_arp_op_validate(__u8 op)
+{
+       return !op || op == ARPOP_REQUEST || op == ARPOP_REPLY;
+}
+
+static int flower_parse_arp_op(char *str, __be16 eth_type,
+                              int op_type, int mask_type,
+                              struct nlmsghdr *n)
+{
+       if (!flower_eth_type_arp(eth_type))
+               return -1;
+
+       return flower_parse_u8(str, op_type, mask_type, flower_arp_op_from_name,
+                              flow_arp_op_validate, n);
+}
+
 static int flower_icmp_attr_type(__be16 eth_type, __u8 ip_proto,
                                 enum flower_icmp_field field)
 {
@@ -205,24 +407,32 @@ static int flower_icmp_attr_type(__be16 eth_type, __u8 ip_proto,
        return -1;
 }
 
+static int flower_icmp_attr_mask_type(__be16 eth_type, __u8 ip_proto,
+                                     enum flower_icmp_field field)
+{
+       if (eth_type == htons(ETH_P_IP) && ip_proto == IPPROTO_ICMP)
+               return field == FLOWER_ICMP_FIELD_CODE ?
+                       TCA_FLOWER_KEY_ICMPV4_CODE_MASK :
+                       TCA_FLOWER_KEY_ICMPV4_TYPE_MASK;
+       else if (eth_type == htons(ETH_P_IPV6) && ip_proto == IPPROTO_ICMPV6)
+               return field == FLOWER_ICMP_FIELD_CODE ?
+                       TCA_FLOWER_KEY_ICMPV6_CODE_MASK :
+                       TCA_FLOWER_KEY_ICMPV6_TYPE_MASK;
+
+       return -1;
+}
+
 static int flower_parse_icmp(char *str, __u16 eth_type, __u8 ip_proto,
                             enum flower_icmp_field field, struct nlmsghdr *n)
 {
-       int ret;
-       int type;
-       uint8_t value;
-
-       type = flower_icmp_attr_type(eth_type, ip_proto, field);
-       if (type < 0)
-               return -1;
+       int value_type, mask_type;
 
-       ret = get_u8(&value, str, 10);
-       if (ret)
+       value_type = flower_icmp_attr_type(eth_type, ip_proto, field);
+       mask_type = flower_icmp_attr_mask_type(eth_type, ip_proto, field);
+       if (value_type < 0 || mask_type < 0)
                return -1;
 
-       addattr8(n, MAX_MSG, type, value);
-
-       return 0;
+       return flower_parse_u8(str, value_type, mask_type, NULL, NULL, n);
 }
 
 static int flower_port_attr_type(__u8 ip_proto, enum flower_endpoint endpoint)
@@ -300,6 +510,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
        __be16 vlan_ethtype = 0;
        __u8 ip_proto = 0xff;
        __u32 flags = 0;
+       __u32 mtf = 0;
+       __u32 mtf_mask = 0;
 
        if (handle) {
                ret = get_u32(&t->tcm_handle, handle, 0);
@@ -329,6 +541,16 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
                                return -1;
                        }
                        addattr_l(n, MAX_MSG, TCA_FLOWER_CLASSID, &handle, 4);
+               } else if (matches(*argv, "ip_flags") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_matching_flags(*argv,
+                                                         FLOWER_IP_FLAGS,
+                                                         &mtf,
+                                                         &mtf_mask);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"ip_flags\"\n");
+                               return -1;
+                       }
                } else if (matches(*argv, "skip_hw") == 0) {
                        flags |= TCA_CLS_FLAGS_SKIP_HW;
                } else if (matches(*argv, "skip_sw") == 0) {
@@ -465,6 +687,59 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
                                fprintf(stderr, "Illegal \"icmp code\"\n");
                                return -1;
                        }
+               } else if (matches(*argv, "arp_tip") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_arp_ip_addr(*argv, vlan_ethtype ?
+                                                      vlan_ethtype : eth_type,
+                                                      TCA_FLOWER_KEY_ARP_TIP,
+                                                      TCA_FLOWER_KEY_ARP_TIP_MASK,
+                                                      n);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"arp_tip\"\n");
+                               return -1;
+                       }
+               } else if (matches(*argv, "arp_sip") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_arp_ip_addr(*argv, vlan_ethtype ?
+                                                      vlan_ethtype : eth_type,
+                                                      TCA_FLOWER_KEY_ARP_SIP,
+                                                      TCA_FLOWER_KEY_ARP_SIP_MASK,
+                                                      n);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"arp_sip\"\n");
+                               return -1;
+                       }
+               } else if (matches(*argv, "arp_op") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_arp_op(*argv, vlan_ethtype ?
+                                                 vlan_ethtype : eth_type,
+                                                 TCA_FLOWER_KEY_ARP_OP,
+                                                 TCA_FLOWER_KEY_ARP_OP_MASK,
+                                                 n);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"arp_op\"\n");
+                               return -1;
+                       }
+               } else if (matches(*argv, "arp_tha") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_eth_addr(*argv,
+                                                   TCA_FLOWER_KEY_ARP_THA,
+                                                   TCA_FLOWER_KEY_ARP_THA_MASK,
+                                                   n);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"arp_tha\"\n");
+                               return -1;
+                       }
+               } else if (matches(*argv, "arp_sha") == 0) {
+                       NEXT_ARG();
+                       ret = flower_parse_eth_addr(*argv,
+                                                   TCA_FLOWER_KEY_ARP_SHA,
+                                                   TCA_FLOWER_KEY_ARP_SHA_MASK,
+                                                   n);
+                       if (ret < 0) {
+                               fprintf(stderr, "Illegal \"arp_sha\"\n");
+                               return -1;
+                       }
                } else if (matches(*argv, "enc_dst_ip") == 0) {
                        NEXT_ARG();
                        ret = flower_parse_ip_addr(*argv, 0,
@@ -529,6 +804,16 @@ parse_done:
        if (ret)
                return ret;
 
+       if (mtf_mask) {
+               ret = addattr32(n, MAX_MSG, TCA_FLOWER_KEY_FLAGS, htonl(mtf));
+               if (ret)
+                       return ret;
+
+               ret = addattr32(n, MAX_MSG, TCA_FLOWER_KEY_FLAGS_MASK, htonl(mtf_mask));
+               if (ret)
+                       return ret;
+       }
+
        if (eth_type != htons(ETH_P_ALL)) {
                ret = addattr16(n, MAX_MSG, TCA_FLOWER_KEY_ETH_TYPE, eth_type);
                if (ret)
@@ -598,6 +883,10 @@ static void flower_print_eth_type(FILE *f, __be16 *p_eth_type,
                fprintf(f, "ipv4");
        else if (eth_type == htons(ETH_P_IPV6))
                fprintf(f, "ipv6");
+       else if (eth_type == htons(ETH_P_ARP))
+               fprintf(f, "arp");
+       else if (eth_type == htons(ETH_P_RARP))
+               fprintf(f, "rarp");
        else
                fprintf(f, "%04x", ntohs(eth_type));
        *p_eth_type = eth_type;
@@ -628,6 +917,39 @@ static void flower_print_ip_proto(FILE *f, __u8 *p_ip_proto,
        *p_ip_proto = ip_proto;
 }
 
+static void flower_print_matching_flags(FILE *f, char *name,
+                                       enum flower_matching_flags type,
+                                       struct rtattr *attr,
+                                       struct rtattr *mask_attr)
+{
+       int i;
+       int count = 0;
+       __u32 mtf;
+       __u32 mtf_mask;
+
+       if (!mask_attr || RTA_PAYLOAD(mask_attr) != 4)
+               return;
+
+       mtf = ntohl(rta_getattr_u32(attr));
+       mtf_mask = ntohl(rta_getattr_u32(mask_attr));
+
+       for (i = 0; i < ARRAY_SIZE(flags_str); i++) {
+               if (type != flags_str[i].type)
+                       continue;
+               if (mtf_mask & flags_str[i].flag) {
+                       if (++count == 1)
+                               fprintf(f, "\n  %s ", name);
+                       else
+                               fprintf(f, "/");
+
+                       if (mtf & flags_str[i].flag)
+                               fprintf(f, "%s", flags_str[i].string);
+                       else
+                               fprintf(f, "no%s", flags_str[i].string);
+               }
+       }
+}
+
 static void flower_print_ip_addr(FILE *f, char *name, __be16 eth_type,
                                 struct rtattr *addr4_attr,
                                 struct rtattr *mask4_attr,
@@ -664,6 +986,13 @@ static void flower_print_ip_addr(FILE *f, char *name, __be16 eth_type,
        else if (bits < len * 8)
                fprintf(f, "/%d", bits);
 }
+static void flower_print_ip4_addr(FILE *f, char *name,
+                                 struct rtattr *addr_attr,
+                                 struct rtattr *mask_attr)
+{
+       return flower_print_ip_addr(f, name, htons(ETH_P_IP),
+                                   addr_attr, mask_attr, 0, 0);
+}
 
 static void flower_print_port(FILE *f, char *name, struct rtattr *attr)
 {
@@ -678,19 +1007,48 @@ static void flower_print_key_id(FILE *f, const char *name,
                fprintf(f, "\n  %s %d", name, rta_getattr_be32(attr));
 }
 
-static void flower_print_icmp(FILE *f, char *name, struct rtattr *attr)
+static void flower_print_masked_u8(FILE *f, const char *name,
+                                  struct rtattr *attr,
+                                  struct rtattr *mask_attr,
+                                  const char *(*value_to_str)(__u8 value))
 {
-       if (attr)
-               fprintf(f, "\n  %s %d", name, rta_getattr_u8(attr));
+       const char *value_str = NULL;
+       __u8 value, mask;
+
+       if (!attr)
+               return;
+
+       value = rta_getattr_u8(attr);
+       mask = mask_attr ? rta_getattr_u8(mask_attr) : UINT8_MAX;
+       if (mask == UINT8_MAX && value_to_str)
+               value_str = value_to_str(value);
+
+       fprintf(f, "\n  %s ", name);
+
+       if (value_str)
+               fputs(value_str, f);
+       else
+               fprintf(f, "%d", value);
+
+       if (mask != UINT8_MAX)
+               fprintf(f, "/%d", mask);
+}
+
+static void flower_print_arp_op(FILE *f, const char *name,
+                               struct rtattr *op_attr,
+                               struct rtattr *mask_attr)
+{
+       flower_print_masked_u8(f, name, op_attr, mask_attr,
+                              flower_print_arp_op_to_name);
 }
 
 static int flower_print_opt(struct filter_util *qu, FILE *f,
                            struct rtattr *opt, __u32 handle)
 {
        struct rtattr *tb[TCA_FLOWER_MAX + 1];
+       int nl_type, nl_mask_type;
        __be16 eth_type = 0;
        __u8 ip_proto = 0xff;
-       int nl_type;
 
        if (!opt)
                return 0;
@@ -752,12 +1110,32 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
        if (nl_type >= 0)
                flower_print_port(f, "src_port", tb[nl_type]);
 
-       nl_type = flower_icmp_attr_type(eth_type, ip_proto, false);
-       if (nl_type >= 0)
-               flower_print_icmp(f, "icmp_type", tb[nl_type]);
-       nl_type = flower_icmp_attr_type(eth_type, ip_proto, true);
-       if (nl_type >= 0)
-               flower_print_icmp(f, "icmp_code", tb[nl_type]);
+       nl_type = flower_icmp_attr_type(eth_type, ip_proto,
+                                       FLOWER_ICMP_FIELD_TYPE);
+       nl_mask_type = flower_icmp_attr_mask_type(eth_type, ip_proto,
+                                                 FLOWER_ICMP_FIELD_TYPE);
+       if (nl_type >= 0 && nl_mask_type >= 0)
+               flower_print_masked_u8(f, "icmp_type", tb[nl_type],
+                                      tb[nl_mask_type], NULL);
+
+       nl_type = flower_icmp_attr_type(eth_type, ip_proto,
+                                       FLOWER_ICMP_FIELD_CODE);
+       nl_mask_type = flower_icmp_attr_mask_type(eth_type, ip_proto,
+                                                 FLOWER_ICMP_FIELD_CODE);
+       if (nl_type >= 0 && nl_mask_type >= 0)
+               flower_print_masked_u8(f, "icmp_code", tb[nl_type],
+                                      tb[nl_mask_type], NULL);
+
+       flower_print_ip4_addr(f, "arp_sip", tb[TCA_FLOWER_KEY_ARP_SIP],
+                            tb[TCA_FLOWER_KEY_ARP_SIP_MASK]);
+       flower_print_ip4_addr(f, "arp_tip", tb[TCA_FLOWER_KEY_ARP_TIP],
+                            tb[TCA_FLOWER_KEY_ARP_TIP_MASK]);
+       flower_print_arp_op(f, "arp_op", tb[TCA_FLOWER_KEY_ARP_OP],
+                           tb[TCA_FLOWER_KEY_ARP_OP_MASK]);
+       flower_print_eth_addr(f, "arp_sha", tb[TCA_FLOWER_KEY_ARP_SHA],
+                             tb[TCA_FLOWER_KEY_ARP_SHA_MASK]);
+       flower_print_eth_addr(f, "arp_tha", tb[TCA_FLOWER_KEY_ARP_THA],
+                             tb[TCA_FLOWER_KEY_ARP_THA_MASK]);
 
        flower_print_ip_addr(f, "enc_dst_ip",
                             tb[TCA_FLOWER_KEY_ENC_IPV4_DST_MASK] ?
@@ -781,6 +1159,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
        flower_print_port(f, "enc_dst_port",
                          tb[TCA_FLOWER_KEY_ENC_UDP_DST_PORT]);
 
+       flower_print_matching_flags(f, "ip_flags",
+                                   FLOWER_IP_FLAGS,
+                                   tb[TCA_FLOWER_KEY_FLAGS],
+                                   tb[TCA_FLOWER_KEY_FLAGS_MASK]);
+
        if (tb[TCA_FLOWER_FLAGS]) {
                __u32 flags = rta_getattr_u32(tb[TCA_FLOWER_FLAGS]);
 
index d5b1af6fbb6cb0801c375972f754b0947e2eafa7..0ee8cad3fbe4cbf4afdfaf4bf08c493145219fbd 100644 (file)
@@ -24,7 +24,7 @@ explain(void)
 {
        fprintf(stderr, "Usage: ... csum <UPDATE>\n"
                        "Where: UPDATE := <TARGET> [<UPDATE>]\n"
-                       "       TARGET := { ip4h | icmp | igmp | tcp | udp | udplite | <SWEETS> }\n"
+                       "       TARGET := { ip4h | icmp | igmp | tcp | udp | udplite | sctp | <SWEETS> }\n"
                        "       SWEETS := { and | or | \'+\' }\n");
 }
 
@@ -65,6 +65,9 @@ parse_csum_args(int *argc_p, char ***argv_p, struct tc_csum *sel)
                else if (matches(*argv, "udplite") == 0)
                        sel->update_flags |= TCA_CSUM_UPDATE_FLAG_UDPLITE;
 
+               else if (matches(*argv, "sctp") == 0)
+                       sel->update_flags |= TCA_CSUM_UPDATE_FLAG_SCTP;
+
                else if ((matches(*argv, "and") == 0) ||
                         (matches(*argv, "or") == 0) ||
                         (matches(*argv, "+") == 0))
@@ -160,6 +163,7 @@ print_csum(struct action_util *au, FILE *f, struct rtattr *arg)
        char *uflag_4 = "";
        char *uflag_5 = "";
        char *uflag_6 = "";
+       char *uflag_7 = "";
 
        int uflag_count = 0;
 
@@ -191,13 +195,14 @@ print_csum(struct action_util *au, FILE *f, struct rtattr *arg)
        CSUM_UFLAG_BUFFER(uflag_4, TCA_CSUM_UPDATE_FLAG_TCP, "tcp");
        CSUM_UFLAG_BUFFER(uflag_5, TCA_CSUM_UPDATE_FLAG_UDP, "udp");
        CSUM_UFLAG_BUFFER(uflag_6, TCA_CSUM_UPDATE_FLAG_UDPLITE, "udplite");
+       CSUM_UFLAG_BUFFER(uflag_7, TCA_CSUM_UPDATE_FLAG_SCTP, "sctp");
        if (!uflag_count) {
                uflag_1 = "?empty";
        }
 
-       fprintf(f, "csum (%s%s%s%s%s%s) action %s\n",
+       fprintf(f, "csum (%s%s%s%s%s%s%s) action %s\n",
                uflag_1, uflag_2, uflag_3,
-               uflag_4, uflag_5, uflag_6,
+               uflag_4, uflag_5, uflag_6, uflag_7,
                action_n2a(sel->action));
        fprintf(f, "\tindex %u ref %d bind %d", sel->index, sel->refcnt,
                sel->bindcnt);
diff --git a/tc/m_sample.c b/tc/m_sample.c
new file mode 100644 (file)
index 0000000..9291109
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+ * m_sample.c          ingress/egress packet sampling module
+ *
+ *             This program is free software; you can distribute it and/or
+ *             modify it under the terms of the GNU General Public License
+ *             as published by the Free Software Foundation; either version
+ *             2 of the License, or (at your option) any later version.
+ *
+ * Authors:    Yotam Gigi <yotamg@mellanox.com>
+ *
+ */
+
+#include <stdio.h>
+#include "utils.h"
+#include "tc_util.h"
+#include "tc_common.h"
+#include <linux/tc_act/tc_sample.h>
+
+static void explain(void)
+{
+       fprintf(stderr, "Usage: sample SAMPLE_CONF\n");
+       fprintf(stderr, "where:\n");
+       fprintf(stderr, "\tSAMPLE_CONF := SAMPLE_PARAMS | SAMPLE_INDEX\n");
+       fprintf(stderr, "\tSAMPLE_PARAMS := rate RATE group GROUP [trunc SIZE] [SAMPLE_INDEX]\n");
+       fprintf(stderr, "\tSAMPLE_INDEX := index INDEX\n");
+       fprintf(stderr, "\tRATE := The ratio of packets observed at the data source to the samples generated.\n");
+       fprintf(stderr, "\tGROUP := the psample sampling group\n");
+       fprintf(stderr, "\tSIZE := the truncation size\n");
+       fprintf(stderr, "\tINDEX := integer index of the sample action\n");
+}
+
+static void usage(void)
+{
+       explain();
+       exit(-1);
+}
+
+static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
+                       int tca_id, struct nlmsghdr *n)
+{
+       struct tc_sample p = { 0 };
+       bool trunc_set = false;
+       bool group_set = false;
+       bool rate_set = false;
+       char **argv = *argv_p;
+       struct rtattr *tail;
+       int argc = *argc_p;
+       __u32 trunc;
+       __u32 group;
+       __u32 rate;
+
+       if (argc <= 1) {
+               fprintf(stderr, "sample bad argument count %d\n", argc);
+               usage();
+               return -1;
+       }
+
+       if (matches(*argv, "sample") == 0) {
+               NEXT_ARG();
+       } else {
+               fprintf(stderr, "sample bad argument %s\n", *argv);
+               return -1;
+       }
+
+       while (argc > 0) {
+               if (matches(*argv, "rate") == 0) {
+                       NEXT_ARG();
+                       if (get_unsigned(&rate, *argv, 10) != 0) {
+                               fprintf(stderr, "Illegal rate %s\n", *argv);
+                               usage();
+                               return -1;
+                       }
+                       rate_set = true;
+               } else if (matches(*argv, "group") == 0) {
+                       NEXT_ARG();
+                       if (get_unsigned(&group, *argv, 10) != 0) {
+                               fprintf(stderr, "Illegal group num %s\n",
+                                       *argv);
+                               usage();
+                               return -1;
+                       }
+                       group_set = true;
+               } else if (matches(*argv, "trunc") == 0) {
+                       NEXT_ARG();
+                       if (get_unsigned(&trunc, *argv, 10) != 0) {
+                               fprintf(stderr, "Illegal truncation size %s\n",
+                                       *argv);
+                               usage();
+                               return -1;
+                       }
+                       trunc_set = true;
+               } else if (matches(*argv, "help") == 0) {
+                       usage();
+               } else {
+                       break;
+               }
+
+               NEXT_ARG_FWD();
+       }
+
+       p.action = TC_ACT_PIPE;
+       if (argc && !action_a2n(*argv, &p.action, false))
+               NEXT_ARG_FWD();
+
+       if (argc) {
+               if (matches(*argv, "index") == 0) {
+                       NEXT_ARG();
+                       if (get_u32(&p.index, *argv, 10)) {
+                               fprintf(stderr, "sample: Illegal \"index\"\n");
+                               return -1;
+                       }
+                       NEXT_ARG_FWD();
+               }
+       }
+
+       if (!p.index && !group_set) {
+               fprintf(stderr, "param \"group\" not set\n");
+               usage();
+       }
+
+       if (!p.index && !rate_set) {
+               fprintf(stderr, "param \"rate\" not set\n");
+               usage();
+       }
+
+       tail = NLMSG_TAIL(n);
+       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       addattr_l(n, MAX_MSG, TCA_SAMPLE_PARMS, &p, sizeof(p));
+       if (rate_set)
+               addattr32(n, MAX_MSG, TCA_SAMPLE_RATE, rate);
+       if (group_set)
+               addattr32(n, MAX_MSG, TCA_SAMPLE_PSAMPLE_GROUP, group);
+       if (trunc_set)
+               addattr32(n, MAX_MSG, TCA_SAMPLE_TRUNC_SIZE, trunc);
+
+       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+
+       *argc_p = argc;
+       *argv_p = argv;
+       return 0;
+}
+
+static int print_sample(struct action_util *au, FILE *f, struct rtattr *arg)
+{
+       struct rtattr *tb[TCA_SAMPLE_MAX + 1];
+       struct tc_sample *p;
+
+       if (arg == NULL)
+               return -1;
+
+       parse_rtattr_nested(tb, TCA_SAMPLE_MAX, arg);
+
+       if (!tb[TCA_SAMPLE_PARMS] || !tb[TCA_SAMPLE_RATE] ||
+           !tb[TCA_SAMPLE_PSAMPLE_GROUP]) {
+               fprintf(f, "[NULL sample parameters]");
+               return -1;
+       }
+       p = RTA_DATA(tb[TCA_SAMPLE_PARMS]);
+
+       fprintf(f, "sample rate 1/%d group %d",
+               rta_getattr_u32(tb[TCA_SAMPLE_RATE]),
+               rta_getattr_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]));
+
+       if (tb[TCA_SAMPLE_TRUNC_SIZE])
+               fprintf(f, " trunc_size %d",
+                       rta_getattr_u32(tb[TCA_SAMPLE_TRUNC_SIZE]));
+
+       fprintf(f, "\n\tindex %d ref %d bind %d", p->index, p->refcnt,
+               p->bindcnt);
+
+       if (show_stats) {
+               if (tb[TCA_SAMPLE_TM]) {
+                       struct tcf_t *tm = RTA_DATA(tb[TCA_SAMPLE_TM]);
+
+                       print_tm(f, tm);
+               }
+       }
+       fprintf(f, "\n");
+       return 0;
+}
+
+struct action_util sample_action_util = {
+       .id = "sample",
+       .parse_aopt = parse_sample,
+       .print_aopt = print_sample,
+};