From patchwork Fri Jul 21 13:08:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Mikl=C3=B3s_Pelyva?= X-Patchwork-Id: 792110 X-Patchwork-Delegate: blp@nicira.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ericsson.onmicrosoft.com header.i=@ericsson.onmicrosoft.com header.b="hZ+0WFjm"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xDWLP68xnz9sNx for ; Fri, 21 Jul 2017 23:09:01 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 512E4B93; Fri, 21 Jul 2017 13:08:57 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id E8281B5F for ; Fri, 21 Jul 2017 13:08:55 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from sesbmg22.ericsson.net (sesbmg22.ericsson.net [193.180.251.48]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 16C8D167 for ; Fri, 21 Jul 2017 13:08:51 +0000 (UTC) X-AuditID: c1b4fb30-aeec49c000001664-16-5971fce2929f Received: from ESESSHC002.ericsson.se (Unknown_Domain [153.88.183.24]) by sesbmg22.ericsson.net (Symantec Mail Security) with SMTP id E7.C3.05732.2ECF1795; Fri, 21 Jul 2017 15:08:50 +0200 (CEST) Received: from EUR03-VE1-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.24) with Microsoft SMTP Server (TLS) id 14.3.352.0; Fri, 21 Jul 2017 15:08:36 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.onmicrosoft.com; s=selector1-ericsson-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=VFL7k70ZGUVXhoTI0wo0XYBk9c35CMcCOSSit3MFK2w=; b=hZ+0WFjmrm7193iFCDfQ7IAyiEBt//pqrtjKs7oRHvOl4QASlia9QRsOOweeMe4hoeZGFep/7TXHGEj+xTFfXo+DMEct18jLCWKw868+1P4PTFZy8KPIJoAgWxSM6s0XXD20yfYZFX0siNmf8pz10hGM9wCMQ6IRrX4RaMHE85U= Received: from VI1PR07MB1391.eurprd07.prod.outlook.com (10.164.92.157) by VI1PR07MB3295.eurprd07.prod.outlook.com (10.175.243.153) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1282.4; Fri, 21 Jul 2017 13:08:35 +0000 Received: from VI1PR07MB1391.eurprd07.prod.outlook.com ([fe80::35f5:f3e1:a5a9:8596]) by VI1PR07MB1391.eurprd07.prod.outlook.com ([fe80::35f5:f3e1:a5a9:8596%14]) with mapi id 15.01.1282.011; Fri, 21 Jul 2017 13:08:34 +0000 From: =?iso-8859-1?Q?Mikl=F3s_Pelyva?= To: "'ovs-dev@openvswitch.org'" Thread-Topic: [PATCH] tunnel: ToS and TTL inheritance for MPLS tunneled traffic Thread-Index: AdMCIYkz4MLd7l3mTnuts+W6MNp/5Q== Date: Fri, 21 Jul 2017 13:08:34 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=miklos.pelyva@ericsson.com; x-originating-ip: [192.176.1.84] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR07MB3295; 7:hTNoQ+PIOZlSEy1B5Fqlt0R8jVufobuw1LGzQPomWBszgVZs/qvRn74FX5LjrCEzNi9WkOJZr48cSieLSQWew3uAcGfv1FzLTAvbcX2jAPKaPRRTDfJokfFOdVtRlg/8Y0MxI+ng+7vG14GrrYBTZTRNatu8UCkx2l8AL/7euwin6e2x5FgcWVd1P3AnSnCsWynNHW2Tg3nXriZz3ytQXyq+s4SJu8SEv7TvqTS2YroORUZe6qtneEHXpKsyf0SbcAKvqqycuB1LpneTTTBMJXqyxn4QYo1z7vtVk/yjFhAfDSFlpgeTyJ2gBW2ntkEyXW5ipT8lkaF8Y/JZvu5rlHgOOq5bcc0NSaa+2LhRLSD6651BIG4zEPTiJDo7Hqgr7UdlWrCuIwmZNp6NX32uVGd9TYz2bF26Ym3c9yyX2UXLWjy4OzX9840aQHqeCy4QTFrn2p+ZrISeXsP/IfGkjVi4D7DOFVdahdjskr04S1O6W9dahUwQvnXcuNVbMwjV31ofgO1dLkji4F0Cp0YeY9xa7pRTLSFKrsfWCrVn5uFP70NFLpMJNgwrL1IcfNaH1SeFbC9U4v0gM3Mh3VwciNm42GBH5Blxt49D1YxGBk7YpGV11iGtaPkhgbC7LhKZYVCWCHiFEFxAL1611uA1AP/I4Q1sNPMVmGAwCIX6js42e8n45V1HZFmrc/hTmHqcGaSEujG9Y01ZwoIg4xNzwGpAkxhc5/nNhY8mDUeQ+Ws4eRX4Fj5wSReWsVQpIKiR/avPJH51eW+KG9pce62HJ0WNSPVjxGg+KV5MEa9OhJQ= x-ms-office365-filtering-correlation-id: 5a26ae4a-546d-499c-2551-08d4d039980c x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:VI1PR07MB3295; x-ms-traffictypediagnostic: VI1PR07MB3295: x-exchange-antispam-report-test: UriScan:(37575265505322)(26388249023172)(21748063052155)(151999592597050); x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6041248)(20161123558100)(20161123562025)(20161123555025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR07MB3295; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR07MB3295; x-forefront-prvs: 0375972289 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(39850400002)(39410400002)(39450400003)(39840400002)(39400400002)(199003)(189002)(8936002)(74316002)(8676002)(50986999)(102836003)(110136004)(54356999)(478600001)(105586002)(33656002)(53946003)(25786009)(81156014)(790700001)(53936002)(54896002)(81166006)(6306002)(9686003)(6116002)(106356001)(16200700003)(38730400002)(7736002)(2906002)(3846002)(3660700001)(101416001)(6916009)(3280700002)(99286003)(55016002)(6436002)(6506006)(14454004)(97736004)(86362001)(189998001)(68736007)(2900100001)(5660300001)(66066001)(7696004)(5250100002)(575784001)(218113003)(491001)(579004)(559001)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR07MB3295; H:VI1PR07MB1391.eurprd07.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; received-spf: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Jul 2017 13:08:34.7317 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB3295 X-OriginatorOrg: ericsson.com X-Brightmail-Tracker: H4sIAAAAAAAAA02Se0hTcRTH+e0+vA4Xt6V51AU5qNRyLZFQeoqJVgT1R6WV2MybDnWbuyYZ BEualS9MlNQMV1qp+ICSsmVW84GWmkqIT4j5mEt6G2q+crtX8L/P+Z4H33M4FCY2EO6UUpXM aFWKBCkpxIvCX4KveTEpQm4qh4AHvy3oMAqbHFxBJ9E54f4YJkGZwmh3H7wojKvO8dDUTZFX Sz6m6tBcHpmBHCmg/aHHOIjbWEy3IJhPj81AwlVuR5BWqXewBTidjcF83iTBZe4JYMYygbhg DMHE216BrZ+kg6Hi9YKdnelA6EqrI2y8iT4GfTUrGKefgl+jPwiOZXBrts3OOL0NWgeK7J5E 9AUYLpix64jeDLMfqu0zMdoVhsZLBZxvGsobP2Ecu4B1bJmvj4T+fwV8zVb4mqnj99wCfaWZ dtNAfyEhK7+Bbz4B+t4pns0CMDYFc+wDOVVLfHM8tLe2EGvclttJcoNMBFQu9vNFEvh7v0zA JfJIqP+egbizMvC0Ro+4U7jD6Oc7PEtgauQNkYu8itdtx7Eanrf/xIrt19gIHUXjOKfLYKAg n+R4Jzx5OI1x7AuFyyZ8vW5ADlXIhWXY6MRYPz8Zo1VeYlm1SqZikp+h1b95X78gb0BWS5AJ 0RSSOon6/iRFiAlFCpuaaEJAYVJnkXhmVRLFKFKvMVp1lPZKAsOakAeFS11FQU094WI6VpHM xDOMhtGuZQWUo7sOZZcVHr/sEXW9cS6yqBmvfZcbvOTaeTPd2km5xGed7y5hQ930jGGYcFLK uwJJzV3qm7E4ZJe6y1Dv7eDpaG72wmrDhAOafTuU0y88JfOSs+XbzQdOW+TdOuurR5VDG0aq ZQEdFXL/EIP3oQVvYzR54+jj0Ntte4/MnjFofExuUpyNU+zxwbSs4j+8oyIMMwMAAA== X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, HTML_MESSAGE, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org X-Content-Filtered-By: Mailman/MimeDel 2.1.12 Subject: [ovs-dev] [PATCH] tunnel: ToS and TTL inheritance for MPLS tunneled traffic X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org When a new outermost MPLS label is added to 'flow' the 'flow''s Ethernet type is changed to 'mpls_eth_type'. After the new label is set, the 'flow''s MPLS stack is updated, and the L3/4 fields are cleared to mark them invalid. This results in loosing the values of the 'nw_tos' and the 'nw_ttl' fields from the struct 'flow'. Hence, it is impossible to use the ToS and TTL 'inherit' feature in case of MPLS tunneled traffic, because currently the values to be inherited are coming from the cleared (invalidated) variables of struct 'flow'. To support inheriting the ToS field to the outer tunnel header even in the presence of an MPLS shim header, this patch introduces a new variable in the context structure, called 'latest_nw_tos', which is used for storing the up-to-date 'nw_tos' value during the flow translation, and is referred in the 'tnl_port_send()' function. Besides, for every MPLS packet the MPLS TTL field is copied to the TTL field of the outer tunnel header, if inheritance is configured. Two new unit tests are created for checking the ToS and TTL inheritance for IP, and non-IP packets sent over MPLS over IP tunnels. The ECN inheritance is not applied in that case, because the related RFC 5129 does not describe an individual way, just options for ECN in MPLS. Signed-off-by: Miklos Pelyva Signed-off-by: Jan Scheurich Co-authored-by: Jan Scheurich --- lib/flow.h | 5 +++++ ofproto/ofproto-dpif-xlate.c | 22 +++++++++++++++++++--- ofproto/tunnel.c | 10 +++++++++- ofproto/tunnel.h | 2 +- tests/tunnel.at | 36 +++++++++++++++++++++++++++++++++++- 5 files changed, 69 insertions(+), 6 deletions(-) diff --git a/lib/flow.h b/lib/flow.h index 9297842..5da893e 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -996,6 +996,11 @@ static inline bool is_ip_any(const struct flow *flow) return dl_type_is_ip_any(get_dl_type(flow)); } +static inline bool is_mpls_any(const struct flow *flow) +{ + return eth_type_mpls(flow->dl_type); +} + static inline bool is_ip_proto(const struct flow *flow, uint8_t ip_proto, struct flow_wildcards *wc) { diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 7f7adb2..3405f07 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -367,6 +367,11 @@ struct xlate_ctx { * the MPLS label stack that was originally present. */ bool was_mpls; + /* Latest IP ToS, an always up to date representation of nw_tos during the + * lifetime of the ctx. Every time nw_tos is modified, it should be updated + * for possible inheritance configurations. UINT16_MAX means undefined. */ + uint16_t latest_nw_tos; + /* True if conntrack has been performed on this packet during processing * on the current bridge. This is used to determine whether conntrack * state from the datapath should be honored after thawing. */ @@ -3753,6 +3758,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, wc->masks.nw_tos |= IP_DSCP_MASK; flow->nw_tos &= ~IP_DSCP_MASK; flow->nw_tos |= dscp; + ctx->latest_nw_tos = flow->nw_tos; } } @@ -3763,7 +3769,8 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, * matches, while explicit set actions on tunnel metadata are. */ flow_tnl = flow->tunnel; - odp_port = tnl_port_send(xport->ofport, flow, ctx->wc); + odp_port = tnl_port_send(xport->ofport, flow, ctx->latest_nw_tos, + ctx->wc); if (odp_port == ODPP_NONE) { xlate_report(ctx, OFT_WARN, "Tunneling decided against output"); goto out; /* restore flow_nw_tos */ @@ -3863,7 +3870,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, out: /* Restore flow */ memcpy(flow->vlans, flow_vlans, sizeof flow->vlans); - flow->nw_tos = flow_nw_tos; + ctx->latest_nw_tos = flow->nw_tos = flow_nw_tos; flow->dl_dst = flow_dl_dst; flow->dl_src = flow_dl_src; flow->packet_type = flow_packet_type; @@ -5215,7 +5222,7 @@ xlate_sample_action(struct xlate_ctx *ctx, if (xport && xport->is_tunnel) { struct flow *flow = &ctx->xin->flow; - tnl_port_send(xport->ofport, flow, ctx->wc); + tnl_port_send(xport->ofport, flow, ctx->latest_nw_tos, ctx->wc); if (!ovs_native_tunneling_is_on(ctx->xbridge->ofproto)) { struct flow_tnl flow_tnl = flow->tunnel; @@ -5964,6 +5971,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, wc->masks.nw_tos |= IP_DSCP_MASK; flow->nw_tos &= ~IP_DSCP_MASK; flow->nw_tos |= ofpact_get_SET_IP_DSCP(a)->dscp; + ctx->latest_nw_tos = flow->nw_tos; } break; @@ -5972,6 +5980,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, wc->masks.nw_tos |= IP_ECN_MASK; flow->nw_tos &= ~IP_ECN_MASK; flow->nw_tos |= ofpact_get_SET_IP_ECN(a)->ecn; + ctx->latest_nw_tos = flow->nw_tos; } break; @@ -6043,6 +6052,12 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, mf_set_flow_value_masked(mf, set_field->value, ofpact_set_field_mask(set_field), flow); + if (!strcmp(mf->name, "nw_tos") || + !strcmp(mf->name, "ip_dscp") || + !strcmp(mf->name, "ip_ecn") || + !strcmp(mf->name, "nw_ecn")) { + ctx->latest_nw_tos = flow->nw_tos; + } } else { xlate_report(ctx, OFT_WARN, "unmet prerequisites for %s, set_field ignored", @@ -6530,6 +6545,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) .paused_flow = &paused_flow, .was_mpls = false, + .latest_nw_tos = is_ip_any(flow) ? flow->nw_tos : UINT16_MAX, .conntracked = false, .ct_nat_action = NULL, diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index c6856a0..220ecd1 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -395,7 +395,8 @@ tnl_wc_init(struct flow *flow, struct flow_wildcards *wc) * shouldn't occur. */ odp_port_t tnl_port_send(const struct ofport_dpif *ofport, struct flow *flow, - struct flow_wildcards *wc) OVS_EXCLUDED(rwlock) + uint16_t latest_nw_tos, struct flow_wildcards *wc) + OVS_EXCLUDED(rwlock) { const struct netdev_tunnel_config *cfg; struct tnl_port *tnl_port; @@ -440,6 +441,10 @@ tnl_port_send(const struct ofport_dpif *ofport, struct flow *flow, if (cfg->ttl_inherit && is_ip_any(flow)) { wc->masks.nw_ttl = 0xff; flow->tunnel.ip_ttl = flow->nw_ttl; + } else if (cfg->ttl_inherit && is_mpls_any(flow)) { + /* The outer TTL must be determined from the MPLS TTL field, when + * inheritance is configured and MPLS tunneled traffic is present. */ + flow->tunnel.ip_ttl = mpls_lse_to_ttl(flow->mpls_lse[0]); } else { flow->tunnel.ip_ttl = cfg->ttl; } @@ -447,6 +452,9 @@ tnl_port_send(const struct ofport_dpif *ofport, struct flow *flow, if (cfg->tos_inherit && is_ip_any(flow)) { wc->masks.nw_tos |= IP_DSCP_MASK; flow->tunnel.ip_tos = flow->nw_tos & IP_DSCP_MASK; + } else if (cfg->tos_inherit && latest_nw_tos != UINT16_MAX) { + wc->masks.nw_tos |= IP_DSCP_MASK; + flow->tunnel.ip_tos = latest_nw_tos & IP_DSCP_MASK; } else { flow->tunnel.ip_tos = cfg->tos; } diff --git a/ofproto/tunnel.h b/ofproto/tunnel.h index b0ec67c..b6265f4 100644 --- a/ofproto/tunnel.h +++ b/ofproto/tunnel.h @@ -42,7 +42,7 @@ const struct ofport_dpif *tnl_port_receive(const struct flow *); void tnl_wc_init(struct flow *, struct flow_wildcards *); bool tnl_process_ecn(struct flow *); odp_port_t tnl_port_send(const struct ofport_dpif *, struct flow *, - struct flow_wildcards *wc); + uint16_t, struct flow_wildcards *wc); /* Returns true if 'flow' should be submitted to tnl_port_receive(). */ static inline bool diff --git a/tests/tunnel.at b/tests/tunnel.at index 447c720..3f2fdd3 100644 --- a/tests/tunnel.at +++ b/tests/tunnel.at @@ -201,7 +201,7 @@ OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \ options:remote_ip=1.1.1.1 options:tos=inherit \ options:ttl=inherit ofport_request=1 \ -- add-port br0 p2 -- set Interface p2 type=dummy \ - ofport_request=2 ofport_request=2]) + ofport_request=2]) AT_DATA([flows.txt], [dnl actions=output:1 ]) @@ -235,6 +235,40 @@ AT_CHECK([tail -1 stdout], [0], OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([tunnel - MPLS over L3 tunnel - ToS and TTL inheritance]) +OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \ + options:packet_type=legacy_l3 options:remote_ip=1.1.1.1 \ + options:tos=inherit options:ttl=inherit \ + ofport_request=1 \ + -- add-port br0 p2 -- set Interface p2 type=dummy \ + ofport_request=2]) +AT_DATA([flows.txt], [dnl +action=push_mpls:0x8847,1 +]) + +OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP +AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) + +AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl + br0 65534/100: (dummy-internal) + p1 1/1: (gre: packet_type=legacy_l3, remote_ip=1.1.1.1, tos=inherit, ttl=inherit) + p2 2/2: (dummy) +]) + +dnl Basic +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=4,ttl=144,frag=no),tcp(src=8,dst=9)'], [0], [stdout]) +AT_CHECK([tail -1 stdout], [0], + [Datapath actions: set(tunnel(dst=1.1.1.1,tos=0x4,ttl=144,flags(df))),pop_eth,push_mpls(label=0,tc=1,ttl=144,bos=1,eth_type=0x8847),1 +]) + +dnl non-IP +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0806),arp(sip=1.2.3.4,tip=5.6.7.8,op=1,sha=00:0f:10:11:12:13,tha=00:14:15:16:17:18)'], [0], [stdout]) +AT_CHECK([tail -1 stdout], [0], + [Datapath actions: set(tunnel(dst=1.1.1.1,ttl=64,flags(df))),pop_eth,push_mpls(label=0,tc=0,ttl=64,bos=1,eth_type=0x8847),1 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([tunnel - set_tunnel]) OVS_VSWITCHD_START([dnl add-port br0 p1 -- set Interface p1 type=gre options:key=flow \ -- 1.9.1