summaryrefslogtreecommitdiffstats
path: root/src/scripts/vnet
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2020-10-08 08:10:34 +0000
committerDamjan Marion <dmarion@me.com>2020-10-08 13:06:01 +0000
commit533bf08cf491a9b74cf761abf05709248a80b274 (patch)
treeeb4d067136f9f5389fd47f44acbe12ce504e52b8 /src/scripts/vnet
parent0c25492eb42645f43e3fbbcf7407462429a03c65 (diff)
gre: MPLS over GRE does not select correct fixup function
Type: fix Signed-off-by: Neale Ranns <nranns@cisco.com> Change-Id: I9eff41407b0f172f2b567e6a4ea1c48be8df883a
Diffstat (limited to 'src/scripts/vnet')
-rw-r--r--src/scripts/vnet/mpls-to-dot1ad53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/scripts/vnet/mpls-to-dot1ad b/src/scripts/vnet/mpls-to-dot1ad
new file mode 100644
index 00000000000..93d3a701595
--- /dev/null
+++ b/src/scripts/vnet/mpls-to-dot1ad
@@ -0,0 +1,53 @@
+
+create packet-generator interface pg0
+create packet-generator interface pg1
+
+set int ip address pg0 192.168.0.1/24
+
+set int state pg0 up
+set int state pg1 up
+set int mac address pg1 00:00:00:00:00:11
+create sub-interface pg1 12 dot1ad 32 inner-dot1q 33
+set int state pg1.12 up
+set int l2 tag-rewrite pg1.12 pop 2
+
+set ip neighbor pg0 192.168.0.2 1:2:3:4:5:6 static
+
+create gre tunnel dst 192.168.0.2 src 192.168.0.1
+set int state gre0 up
+set int ip addr gre0 1.1.1.1/30
+
+mpls table 0
+mpls tunnel add l2-only via 1.1.1.2 gre0 out-labels 33
+set int state mpls-tunnel0 up
+set int mpls gre0 enable
+
+set int l2 xconnect pg1.12 mpls-tunnel0
+set int l2 xconnect mpls-tunnel0 pg1.12
+
+mpls local-label add eos 33 via l2-input-on mpls-tunnel0
+
+trace add pg-input 100
+
+packet-generator new {
+ name g2v
+ limit 1
+ node ip4-input
+ interface pg0
+ data {
+ hex 0x4500002000000000fe2f3b5bc0a80002c0a800010000884700021140000000000011005056b77c83010203040506
+ }
+}
+
+packet-generator new {
+ name v2g
+ limit 1
+ node ethernet-input
+ interface pg1.12
+ data {
+ hex 0x000000000011005056b77c8388a80020810000210102030405060708
+ }
+}
+
+pack en g2v
+sh trace
* Keyword.Declaration */ .highlight .kn { color: #f92672 } /* Keyword.Namespace */ .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ .highlight .kr { color: #66d9ef } /* Keyword.Reserved */ .highlight .kt { color: #66d9ef } /* Keyword.Type */ .highlight .ld { color: #e6db74 } /* Literal.Date */ .highlight .m { color: #ae81ff } /* Literal.Number */ .highlight .s { color: #e6db74 } /* Literal.String */ .highlight .na { color: #a6e22e } /* Name.Attribute */ .highlight .nb { color: #f8f8f2 } /* Name.Builtin */ .highlight .nc { color: #a6e22e } /* Name.Class */ .highlight .no { color: #66d9ef } /* Name.Constant */ .highlight .nd { color: #a6e22e } /* Name.Decorator */ .highlight .ni { color: #f8f8f2 } /* Name.Entity */ .highlight .ne { color: #a6e22e } /* Name.Exception */ .highlight .nf { color: #a6e22e } /* Name.Function */ .highlight .nl { color: #f8f8f2 } /* Name.Label */ .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ .highlight .nx { color: #a6e22e } /* Name.Other */ .highlight .py { color: #f8f8f2 } /* Name.Property */ .highlight .nt { color: #f92672 } /* Name.Tag */ .highlight .nv { color: #f8f8f2 } /* Name.Variable */ .highlight .ow { color: #f92672 } /* Operator.Word */ .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ .highlight .mb { color: #ae81ff } /* Literal.Number.Bin */ .highlight .mf { color: #ae81ff } /* Literal.Number.Float */ .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ .highlight .sa { color: #e6db74 } /* Literal.String.Affix */ .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ .highlight .sc { color: #e6db74 } /* Literal.String.Char */ .highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */ .highlight .sd { color: #e6db74 } /* Literal.String.Doc */ .highlight .s2 { color: #e6db74 } /* Literal.String.Double */ .highlight .se { color: #ae81ff } /* Literal.String.Escape */ .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ .highlight .si { color: #e6db74 } /* Literal.String.Interpol */ .highlight .sx { color: #e6db74 } /* Literal.String.Other */ .highlight .sr { color: #e6db74 } /* Literal.String.Regex */ .highlight .s1 { color: #e6db74 } /* Literal.String.Single */ .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #a6e22e } /* Name.Function.Magic */ .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ .highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } @media (prefers-color-scheme: light) { .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*
 * Copyright (c) 2015 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __included_ipfix_packet_h__
#define __included_ipfix_packet_h__

#include <vnet/flow/ipfix_info_elements.h>

/* From RFC-7011:
 * https://tools.ietf.org/html/rfc7011
 */

typedef struct {
  u32 version_length;
  u32 export_time;
  u32 sequence_number;
  u32 domain_id;
} ipfix_message_header_t;

static inline u32 version_length (u16 length)
{
  return clib_host_to_net_u32 (0x000a0000 | length);
}


/*
 *   The Field Specifier format is shown in Figure G.
 *
 *     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
 *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *     |E|  Information Element ident. |        Field Length           |
 *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *     |                      Enterprise Number                        |
 *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *
 *                     Figure G: Field Specifier Format
 *
 *   Where:
 *
 *   E
 *
 *      Enterprise bit.  This is the first bit of the Field Specifier.  If
 *      this bit is zero, the Information Element identifier identifies an
 *      Information Element in [IANA-IPFIX], and the four-octet Enterprise
 *      Number field MUST NOT be present.  If this bit is one, the
 *      Information Element identifier identifies an enterprise-specific
 *      Information Element, and the Enterprise Number field MUST be
 *      present.
 */

typedef struct {
  u32 e_id_length;
  u32 enterprise;
} ipfix_enterprise_field_specifier_t;

typedef struct {
  u32 e_id_length;
} ipfix_field_specifier_t;

static inline u32 ipfix_e_id_length (int e, u16 id, u16 length)
{
  u32 value;
  value = (e<<31) | ((id&0x7FFF) <<16) | length;
  return clib_host_to_net_u32 (value);
}

/* 
 *   Every Set contains a common header.  This header is defined in
 *   Figure I.
 *
 *      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
 *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *     |          Set ID               |          Length               |
 *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *
 *                        Figure I: Set Header Format
 *
 *   Each Set Header field is exported in network format.  The fields are
 *   defined as follows:
 *
 *   Set ID
 *
 *      Identifies the Set.  A value of 2 is reserved for Template Sets.
 *      A value of 3 is reserved for Options Template Sets.  Values from 4
 *      to 255 are reserved for future use.  Values 256 and above are used
 *      for Data Sets.  The Set ID values of 0 and 1 are not used, for
 *      historical reasons [RFC3954].
 *
 *   Length
 *
 *      Total length of the Set, in octets, including the Set Header, all
 *      records, and the optional padding.  Because an individual Set MAY
 *      contain multiple records, the Length value MUST be used to
 *      determine the position of the next Set.
 */

typedef struct {
  u32 set_id_length;
} ipfix_set_header_t;

static inline u32 ipfix_set_id_length (u16 set_id, u16 length)
{
  return clib_host_to_net_u32 ((set_id<<16) | length);
}

/* 
 *   The format of the Template Record is shown in Figure J.  It consists
 *   of a Template Record Header and one or more Field Specifiers.  Field
 *   Specifiers are defined in Figure G above.
 *
 *           +--------------------------------------------------+
 *           | Template Record Header                           |
 *           +--------------------------------------------------+
 *           | Field Specifier                                  |
 *           +--------------------------------------------------+
 *           | Field Specifier                                  |
 *           +--------------------------------------------------+
 *            ...
 *           +--------------------------------------------------+
 *           | Field Specifier                                  |
 *           +--------------------------------------------------+
 *
 *                     Figure J: Template Record Format
 *
 *   The format of the Template Record Header is shown in Figure K.
 *
 *     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
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *    |      Template ID (> 255)      |         Field Count           |
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *
 *                  Figure K: Template Record Header Format
 *
 *   The Template Record Header Field definitions are as follows:
 *
 *   Template ID
 *
 *      Each Template Record is given a unique Template ID in the range
 *      256 to 65535.  This uniqueness is local to the Transport Session
 *      and Observation Domain that generated the Template ID.  Since
 *      Template IDs are used as Set IDs in the Sets they describe (see
 *      Section 3.4.3), values 0-255 are reserved for special Set types
 *      (e.g., Template Sets themselves), and Templates and Options
 *      Templates (see Section 3.4.2) cannot share Template IDs within a
 *      Transport Session and Observation Domain.  There are no
 *      constraints regarding the order of the Template ID allocation.  As
 *      Exporting Processes are free to allocate Template IDs as they see
 *      fit, Collecting Processes MUST NOT assume incremental Template
 *      IDs, or anything about the contents of a Template based on its
 *      Template ID alone.
 *
 *   Field Count
 *
 *      Number of fields in this Template Record.
 */

typedef struct {
  u32 id_count;
} ipfix_template_header_t;

static inline u32 ipfix_id_count (u16 id, u16 count)
{
  return clib_host_to_net_u32 ((id<<16) | count);
}

/* Template packet */
typedef struct {
  ipfix_message_header_t h;
  ipfix_set_header_t s;
  ipfix_template_header_t t;
  ipfix_field_specifier_t fields[0];
} ipfix_template_packet_t;

#endif /* __included_ipfix_packet_h__ */