On Wed, 9 Aug 2017 13:34:42 -0700 William Tu <u9012...@gmail.com> wrote:
> The patch adds ERSPAN type II tunnel support. The implementation > is based on the draft at https://tools.ietf.org/html/draft-foschiano-erspan-01 > One of the purposes is for Linux box to be able to receive ERSPAN > monitoring traffic sent from the Cisco switch, by creating a ERSPAN > tunnel device. In addition, the patch also adds ERSPAN TX, so traffic > can also be encapsulated into ERSPAN and sent out. > > The implementation reuses the key as ERSPAN session ID, and > field 'erspan' as ERSPAN Index fields: > ./ip link add dev ers11 type erspan seq key 100 erspan 123 \ > local 172.16.1.200 remote 172.16.1.100 > > Signed-off-by: William Tu <u9012...@gmail.com> > Cc: Stephen Hemminger <step...@networkplumber.org> > Cc: Alexey Kuznetsov <kuz...@ms2.inr.ac.ru> > --- > include/linux/if_tunnel.h | 1 + > ip/link_gre.c | 26 +++++++++++++++++++++++++- > 2 files changed, 26 insertions(+), 1 deletion(-) > > diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h > index 7375335a0773..21834cac4c0d 100644 > --- a/include/linux/if_tunnel.h > +++ b/include/linux/if_tunnel.h > @@ -134,6 +134,7 @@ enum { > IFLA_GRE_COLLECT_METADATA, > IFLA_GRE_IGNORE_DF, > IFLA_GRE_FWMARK, > + IFLA_GRE_ERSPAN_INDEX, > __IFLA_GRE_MAX, > }; > > diff --git a/ip/link_gre.c b/ip/link_gre.c > index c2ec5f26902f..c28fac1eb5de 100644 > --- a/ip/link_gre.c > +++ b/ip/link_gre.c > @@ -26,7 +26,7 @@ > static void print_usage(FILE *f) > { > fprintf(f, > - "Usage: ... { gre | gretap } [ remote ADDR ]\n" > + "Usage: ... { gre | gretap | erspan } [ remote ADDR ]\n" > " [ local ADDR ]\n" > " [ [i|o]seq ]\n" > " [ [i|o]key KEY ]\n" > @@ -44,6 +44,7 @@ static void print_usage(FILE *f) > " [ [no]encap-csum6 ]\n" > " [ [no]encap-remcsum ]\n" > " [ fwmark MARK ]\n" > + " [ erspan IDX ]\n" > "\n" > "Where: ADDR := { IP_ADDRESS | any }\n" > " TOS := { NUMBER | inherit }\n" > @@ -96,6 +97,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, > char **argv, > __u8 metadata = 0; > __u8 ignore_df = 0; > __u32 fwmark = 0; > + __u32 erspan_idx = 0; > > if (!(n->nlmsg_flags & NLM_F_CREATE)) { > if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { > @@ -172,6 +174,9 @@ get_failed: > > if (greinfo[IFLA_GRE_FWMARK]) > fwmark = rta_getattr_u32(greinfo[IFLA_GRE_FWMARK]); > + > + if (greinfo[IFLA_GRE_ERSPAN_INDEX]) > + erspan_idx = > rta_getattr_u32(greinfo[IFLA_GRE_ERSPAN_INDEX]); > } > > while (argc > 0) { > @@ -328,6 +333,10 @@ get_failed: > NEXT_ARG(); > if (get_u32(&fwmark, *argv, 0)) > invarg("invalid fwmark\n", *argv); > + } else if (strcmp(*argv, "erspan") == 0) { > + NEXT_ARG(); > + if (get_u32(&erspan_idx, *argv, 0)) > + invarg("invalid erspan index\n", *argv); > } else > usage(); > argc--; argv++; > @@ -359,6 +368,7 @@ get_failed: > addattr_l(n, 1024, IFLA_GRE_TTL, &ttl, 1); > addattr_l(n, 1024, IFLA_GRE_TOS, &tos, 1); > addattr32(n, 1024, IFLA_GRE_FWMARK, fwmark); > + addattr32(n, 1024, IFLA_GRE_ERSPAN_INDEX, htonl(erspan_idx)); If erspan_idx is zero, then you probably shouldn't send it to kernel. Also you need to update manual pages.