From patchwork Sat Jan 6 05:47:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yang, Yi" X-Patchwork-Id: 856345 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=) 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 3zD9l96BrHz9sNV for ; Sat, 6 Jan 2018 16:56:21 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 3282BCA0; Sat, 6 Jan 2018 05:53:50 +0000 (UTC) X-Original-To: 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 1D097C46 for ; Sat, 6 Jan 2018 05:53:47 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 0936AA7 for ; Sat, 6 Jan 2018 05:53:45 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jan 2018 21:53:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,320,1511856000"; d="scan'208";a="192824650" Received: from unknown (HELO localhost.localdomain.bj.intel.com) ([10.240.224.185]) by fmsmga006.fm.intel.com with ESMTP; 05 Jan 2018 21:53:43 -0800 From: Yi Yang To: dev@openvswitch.org Date: Sat, 6 Jan 2018 13:47:54 +0800 Message-Id: <1515217674-66361-5-git-send-email-yi.y.yang@intel.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1515217674-66361-1-git-send-email-yi.y.yang@intel.com> References: <1515217674-66361-1-git-send-email-yi.y.yang@intel.com> X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v7 4/4] nsh: add dec_nsh_ttl action 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: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org NSH ttl is a 6-bit field ranged from 0 to 63, it should be decremented by 1 every hop, if it is 0 or it is so after decremented, the packet should be dropped and a packet-in message is sent to main controller. Signed-off-by: Yi Yang --- include/openvswitch/ofp-actions.h | 1 + lib/ofp-actions.c | 49 +++++++++++++++++++++++++++++++++++++++ ofproto/ofproto-dpif-xlate.c | 31 +++++++++++++++++++++++++ tests/nsh.at | 6 ++--- utilities/ovs-ofctl.8.in | 13 ++++++++++- 5 files changed, 96 insertions(+), 4 deletions(-) diff --git a/include/openvswitch/ofp-actions.h b/include/openvswitch/ofp-actions.h index 3d97755..c82dae0 100644 --- a/include/openvswitch/ofp-actions.h +++ b/include/openvswitch/ofp-actions.h @@ -93,6 +93,7 @@ struct vl_mff_map; OFPACT(DEC_MPLS_TTL, ofpact_null, ofpact, "dec_mpls_ttl") \ OFPACT(PUSH_MPLS, ofpact_push_mpls, ofpact, "push_mpls") \ OFPACT(POP_MPLS, ofpact_pop_mpls, ofpact, "pop_mpls") \ + OFPACT(DEC_NSH_TTL, ofpact_null, ofpact, "dec_nsh_ttl") \ \ /* Generic encap & decap */ \ OFPACT(ENCAP, ofpact_encap, props, "encap") \ diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index 4918498..7acf05f 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -350,6 +350,9 @@ enum ofp_raw_action_type { /* NX1.3+(47): struct nx_action_decap, ... */ NXAST_RAW_DECAP, + /* NX1.3+(48): void. */ + NXAST_RAW_DEC_NSH_TTL, + /* ## ------------------ ## */ /* ## Debugging actions. ## */ /* ## ------------------ ## */ @@ -482,6 +485,7 @@ ofpact_next_flattened(const struct ofpact *ofpact) case OFPACT_NAT: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: return ofpact_next(ofpact); case OFPACT_CLONE: @@ -4332,6 +4336,39 @@ format_DECAP(const struct ofpact_decap *a, ds_put_format(s, "%s)%s", colors.paren, colors.end); } +/* Action dec_nsh_ttl */ + +static enum ofperr +decode_NXAST_RAW_DEC_NSH_TTL(struct ofpbuf *out) +{ + ofpact_put_DEC_NSH_TTL(out); + return 0; +} + +static void +encode_DEC_NSH_TTL(const struct ofpact_null *null OVS_UNUSED, + enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out) +{ + put_NXAST_DEC_NSH_TTL(out); +} + +static char * OVS_WARN_UNUSED_RESULT +parse_DEC_NSH_TTL(char *arg OVS_UNUSED, + const struct ofputil_port_map *port_map OVS_UNUSED, + struct ofpbuf *ofpacts, + enum ofputil_protocol *usable_protocols OVS_UNUSED) +{ + ofpact_put_DEC_NSH_TTL(ofpacts); + return NULL; +} + +static void +format_DEC_NSH_TTL(const struct ofpact_null *a OVS_UNUSED, + const struct ofputil_port_map *port_map OVS_UNUSED, struct ds *s) +{ + ds_put_format(s, "%sdec_nsh_ttl%s", colors.special, colors.end); +} + /* Action structures for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE, and * NXAST_RESUBMIT_TABLE_CT. @@ -7115,6 +7152,7 @@ ofpact_is_set_or_move_action(const struct ofpact *a) case OFPACT_SET_VLAN_VID: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: return true; case OFPACT_BUNDLE: case OFPACT_CLEAR_ACTIONS: @@ -7192,6 +7230,7 @@ ofpact_is_allowed_in_actions_set(const struct ofpact *a) case OFPACT_STRIP_VLAN: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: return true; /* In general these actions are excluded because they are not part of @@ -7305,6 +7344,7 @@ ofpacts_execute_action_set(struct ofpbuf *action_list, ofpacts_copy_last(action_list, action_set, OFPACT_PUSH_VLAN); ofpacts_copy_last(action_list, action_set, OFPACT_DEC_TTL); ofpacts_copy_last(action_list, action_set, OFPACT_DEC_MPLS_TTL); + ofpacts_copy_last(action_list, action_set, OFPACT_DEC_NSH_TTL); ofpacts_copy_all(action_list, action_set, ofpact_is_set_or_move_action); ofpacts_copy_last(action_list, action_set, OFPACT_SET_QUEUE); @@ -7446,6 +7486,7 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type) case OFPACT_NAT: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: default: return OVSINST_OFPIT11_APPLY_ACTIONS; } @@ -8132,6 +8173,13 @@ ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a, } return 0; + case OFPACT_DEC_NSH_TTL: + if ((flow->packet_type != htonl(PT_NSH)) && + (flow->dl_type != htons(ETH_TYPE_NSH))) { + inconsistent_match(usable_protocols); + } + return 0; + default: OVS_NOT_REACHED(); } @@ -8627,6 +8675,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port) case OFPACT_NAT: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: default: return false; } diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index bf8b060..989d51e 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -4795,6 +4795,28 @@ compose_set_mpls_tc_action(struct xlate_ctx *ctx, uint8_t tc) } } +static bool +compose_dec_nsh_ttl_action(struct xlate_ctx *ctx) +{ + struct flow *flow = &ctx->xin->flow; + + if ((flow->packet_type == htonl(PT_NSH)) || + (flow->dl_type == htons(ETH_TYPE_NSH))) { + ctx->wc->masks.nsh.ttl = 0xff; + if (flow->nsh.ttl > 1) { + flow->nsh.ttl--; + return false; + } else { + execute_controller_action(ctx, UINT16_MAX, OFPR_INVALID_TTL, 0, + NULL, 0); + } + } + + /* Stop processing for current table. */ + xlate_report(ctx, OFT_WARN, "NSH decrement TTL exception"); + return true; +} + static void compose_set_mpls_ttl_action(struct xlate_ctx *ctx, uint8_t ttl) { @@ -5349,6 +5371,7 @@ reversible_actions(const struct ofpact *ofpacts, size_t ofpacts_len) case OFPACT_OUTPUT_TRUNC: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: return false; } } @@ -5576,6 +5599,7 @@ freeze_unroll_actions(const struct ofpact *a, const struct ofpact *end, case OFPACT_OUTPUT: case OFPACT_CONTROLLER: case OFPACT_DEC_MPLS_TTL: + case OFPACT_DEC_NSH_TTL: case OFPACT_DEC_TTL: /* These actions may generate asynchronous messages, which include * table ID and flow cookie information. */ @@ -6123,6 +6147,7 @@ recirc_for_mpls(const struct ofpact *a, struct xlate_ctx *ctx) case OFPACT_CLONE: case OFPACT_ENCAP: case OFPACT_DECAP: + case OFPACT_DEC_NSH_TTL: case OFPACT_UNROLL_XLATE: case OFPACT_CT: case OFPACT_CT_CLEAR: @@ -6448,6 +6473,12 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, } break; + case OFPACT_DEC_NSH_TTL: + if (compose_dec_nsh_ttl_action(ctx)) { + return; + } + break; + case OFPACT_DEC_TTL: wc->masks.nw_ttl = 0xff; if (compose_dec_ttl(ctx, ofpact_get_DEC_TTL(a))) { diff --git a/tests/nsh.at b/tests/nsh.at index 6177cea..e6a8345 100644 --- a/tests/nsh.at +++ b/tests/nsh.at @@ -542,7 +542,7 @@ AT_DATA([br-in2.txt], [dnl table=2,packet_type=(1,0x894f),nsh_spi=0x1020,nsh_si=255,actions=encap(ethernet),set_field:77:88:99:aa:bb:cc->dl_dst,goto_table:4 table=2,packet_type=(1,0x894f),nsh_spi=0x1020,nsh_si=254,actions=output:2010 table=4,dl_type=0x894f,dl_dst=11:22:33:44:55:66,actions=set_field:254->nsh_si,decap(),resubmit(,2) - table=4,dl_type=0x894f,dl_dst=77:88:99:aa:bb:cc,actions=set_field:254->nsh_si,decap(),resubmit(,2) + table=4,dl_type=0x894f,dl_dst=77:88:99:aa:bb:cc,actions=dec_nsh_ttl,decap(),resubmit(,2) ]) # br-in3 is SFC classifier (table 1) and final SFF (tables 2,3) @@ -607,7 +607,7 @@ AT_CHECK([ table=2, packet_type=(1,0x894f),nsh_spi=0x3020,nsh_si=254 actions=output:2030 table=2, packet_type=(1,0x894f),nsh_spi=0x3020,nsh_si=255 actions=encap(ethernet),set_field:11:22:33:44:55:66->eth_dst,goto_table:4 table=4, dl_dst=11:22:33:44:55:66,dl_type=0x894f actions=set_field:254->nsh_si,decap(),resubmit(,2) - table=4, dl_dst=77:88:99:aa:bb:cc,dl_type=0x894f actions=set_field:254->nsh_si,decap(),resubmit(,2) + table=4, dl_dst=77:88:99:aa:bb:cc,dl_type=0x894f actions=dec_nsh_ttl,decap(),resubmit(,2) ip,in_port=30 actions=decap(),goto_table:1 n_packets=2, n_bytes=216, packet_type=(1,0x894f),in_port=3010 actions=goto_table:2 packet_type=(1,0x800),in_port=30 actions=goto_table:1 @@ -661,7 +661,7 @@ AT_CHECK([ table=2, n_packets=2, n_bytes=216, packet_type=(1,0x894f),nsh_spi=0x3020,nsh_si=255 actions=encap(ethernet),set_field:11:22:33:44:55:66->eth_dst,goto_table:4 table=2, packet_type=(1,0x894f),nsh_spi=0x1020,nsh_si=254 actions=output:2010 table=2, packet_type=(1,0x894f),nsh_spi=0x1020,nsh_si=255 actions=encap(ethernet),set_field:77:88:99:aa:bb:cc->eth_dst,goto_table:4 - table=4, dl_dst=77:88:99:aa:bb:cc,dl_type=0x894f actions=set_field:254->nsh_si,decap(),resubmit(,2) + table=4, dl_dst=77:88:99:aa:bb:cc,dl_type=0x894f actions=dec_nsh_ttl,decap(),resubmit(,2) table=4, n_packets=2, n_bytes=216, dl_dst=11:22:33:44:55:66,dl_type=0x894f actions=set_field:254->nsh_si,decap(),resubmit(,2) ip,in_port=30 actions=decap(),goto_table:1 n_packets=2, n_bytes=216, packet_type=(1,0x894f),in_port=3010 actions=goto_table:2 diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in index 5cdf48c..95344c7 100644 --- a/utilities/ovs-ofctl.8.in +++ b/utilities/ovs-ofctl.8.in @@ -1280,6 +1280,15 @@ Processing the current set of actions then stops. However, if the current set of actions was reached through ``resubmit'' then remaining actions in outer levels resume processing. . +.IP \fBdec_nsh_ttl\fR +Decrement TTL of the outer NSH header of a packet. If the TTL +is initially zero or decrementing would make it so, no decrement occurs. +Instead, a ``packet-in'' message with reason code \fBOFPR_INVALID_TTL\fR +is sent to the main controller (id zero), if it has enabled receiving them. +Processing the current set of actions then stops. However, if the current +set of actions was reached through ``resubmit'' then remaining actions in +outer levels resume processing. +. .IP \fBnote:\fR[\fIhh\fR]... Does nothing at all. Any number of bytes represented as hex digits \fIhh\fR may be included. Pairs of hex digits may be separated by @@ -1587,6 +1596,8 @@ the action set, the one written later replaces the earlier action: \fBdec_ttl\fR .IQ \fBdec_mpls_ttl\fR +.IQ +\fBdec_nsh_ttl\fR . .IP 7. \fBload\fR @@ -1647,7 +1658,7 @@ not visible.) .RE .IP Only the actions listed above may be written to the action set. -\fBencap\fR and \fBdecap\fR actions are nonstandard. +\fBencap\fR, \fBdecap\fR and \fBdec_nsh_ttl\fR actions are nonstandard. . .IP \fBwrite_metadata\fB:\fIvalue\fR[/\fImask\fR] Updates the metadata field for the flow. If \fImask\fR is omitted, the