X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fgre%2Fpacket.h;h=bbd67d565c553c89ad424d4c7d389ef56cb43186;hb=dc8d35036f1d06193035ff4b6f161f2c1c17c35a;hp=cc2ccda9effa3e6c0e188daef073cc59f135497c;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/gre/packet.h b/src/vnet/gre/packet.h index cc2ccda9eff..bbd67d565c5 100644 --- a/src/vnet/gre/packet.h +++ b/src/vnet/gre/packet.h @@ -24,15 +24,18 @@ _ (0x86DD, ip6) \ _ (0x6558, teb) \ _ (0x0806, arp) \ _ (0x8847, mpls_unicast) \ +_ (0x88BE, erspan) \ _ (0x894F, nsh) -typedef enum { +typedef enum +{ #define _(n,f) GRE_PROTOCOL_##f = n, foreach_gre_protocol #undef _ } gre_protocol_t; -typedef struct { +typedef struct +{ /* flags and version */ u16 flags_and_version; /* unimplemented at the moment */ @@ -52,4 +55,120 @@ typedef struct { u16 protocol; } gre_header_t; +/* From draft-foschiano-erspan-03.txt + + Different frame variants known as "ERSPAN Types" can be + distinguished based on the GRE "Protocol Type" field value: Type I + and II's value is 0x88BE while Type III's is 0x22EB [ETYPES]. + + GRE header for ERSPAN Type II encapsulation (8 octets [34:41]) + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|0|0|1|0|00000|000000000|00000| Protocol Type for ERSPAN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Sequence Number (increments per packet per session) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Note that in the above GRE header [RFC1701] out of the C, R, K, S, + s, Recur, Flags, Version fields only S (bit 03) may be set to 1. The + other fields are always set to zero. + + ERSPAN Type II's frame format also adds a special 8-octet ERSPAN + "feature" header on top of the MAC/IPv4/GRE headers to enclose the + raw mirrored frames. + + The ERSPAN Type II feature header is described below: + + ERSPAN Type II header (8 octets [42:49]) + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Ver | VLAN | COS | En|T| Session ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Reserved | Index | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + The various fields of the above header are described in this table: + + Field Position Length Definition + [octet:bit] (bits) + + Ver [42:0] 4 ERSPAN Encapsulation version. + This indicates the version of + the ERSPAN encapsulation + specification. Set to 0x1 for + Type II. + + VLAN [42:4] 12 Original VLAN of the frame, + mirrored from the source. + If the En field is set to 11, + the value of VLAN is undefined. + + COS [44:0] 3 Original class of service of the + frame, mirrored from the source. + + En [44:3] 2 The trunk encapsulation type + associated with the ERSPAN source + port for ingress ERSPAN traffic. + + The possible values are: + 00-originally without VLAN tag + 01-originally ISL encapsulated + 10-originally 802.1Q encapsulated + 11-VLAN tag preserved in frame. + + T [44:5] 1 This bit indicates that the frame + copy encapsulated in the ERSPAN + packet has been truncated. This + occurs if the ERSPAN encapsulated + frame exceeds the configured MTU. + + Session ID [44:6] 10 Identification associated with + (ERSPAN ID) each ERSPAN session. Must be + unique between the source and the + receiver(s). (See section below.) + + Reserved [46:0] 12 All bits are set to zero + + Index [47:4] 20 A 20 bit index/port number + associated with the ERSPAN + traffic's port and + direction (ingress/egress). N.B.: + This field is platform dependent. +*/ + +/* *INDENT-OFF* */ +typedef CLIB_PACKED (struct { + u32 seq_num; + union + { + struct + { + u16 ver_vlan; + u16 cos_en_t_session; + u32 res_index; + } t2; + u64 t2_u64; + }; +}) erspan_t2_t; + +typedef CLIB_PACKED (struct { + gre_header_t gre; + erspan_t2_t erspan; +}) erspan_t2_header_t; + +/* *INDENT-ON* */ + +/* u64 template for ERSPAN type 2 header with both EN bits set */ +#define ERSPAN_HDR2 0x1000180000000000ul + #endif /* included_vnet_gre_packet_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */