From patchwork Mon May 15 17:04:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi-Hung Wei X-Patchwork-Id: 762638 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 3wRRmZ1Lfzz9ryT for ; Tue, 16 May 2017 03:05:50 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="rLFJn5Zg"; dkim-atps=neutral Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id BA702B77; Mon, 15 May 2017 17:05:11 +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 07AFC955 for ; Mon, 15 May 2017 17:05:08 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 362AE24C for ; Mon, 15 May 2017 17:05:08 +0000 (UTC) Received: by mail-pf0-f196.google.com with SMTP id w69so16418271pfk.1 for ; Mon, 15 May 2017 10:05:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xO+u7Dyv9JYJ7/CN7fDbLmVTmANuNN47/j+MjDwnqdo=; b=rLFJn5ZgjFRkcFhmP7XWPGS7swQs2lEGMwD/aRbF9VF5kLREMrJFUdpJI3pssuzwFo fnYbTwk8KkU43D7ELg5fVsGgxu5DN9mgF8rmJgiTYUJqca42pElzZZ9LNGOM7HJEUvhq GASH6DGpCp6MPdaFcQGjsZbsFdDMAFsjG/x0w3IIi1rpKXVpVv6fZb57K1+6Jytc07IJ Yg/ZvVT79s3Ww82MbZxApksNNTp/CP5/pUaD1ibqH09ySqO5L+f4d+MA//KZNhAtUogi 5xZqwWgZh+p/HytPTzmPX/aIUUoFZ/msJM1CuIKzgf2v5x+MxxDmGhHvZ7L71256K6v4 WWew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xO+u7Dyv9JYJ7/CN7fDbLmVTmANuNN47/j+MjDwnqdo=; b=llYabwF2RN2YpeIutVZTHEIU1MMFdwJiNUYhElheMuDOuL9Z5IQxTmIPLTb9dSbZyD XAm9LZbLMSiT2MEvSsomzEABib92Ygon6eabV9NFiRZji5ybBnrbErkpQXEJknHvHs5Z HMjZ8ThnTus5Wu0DUeO8AQBrfaHBs11EB3MpGfNMqLVs85m7pH1JtVaGizpws6rVhPHK s4Mn9+Tcyj6CwztLHaeJQjhRjt+jLN0SiHy0UroVxX6E4ZW8IpZZqRroV7+7jpsDw8GR QxHjGKhpdumkTDMGfqDTtYQEGwDTRZnxqk1vlGCnWHxvRgYlRulk5D7jKuXa0C8CbheS 0Drg== X-Gm-Message-State: AODbwcBWDqnJRMXrCCgUz1fOzWNiQauxi992hcODJkMHOfayYkW2iSVY 8/GrDvwTrYBKPQ== X-Received: by 10.99.44.83 with SMTP id s80mr7505083pgs.95.1494867907671; Mon, 15 May 2017 10:05:07 -0700 (PDT) Received: from vm-01.vmware.com ([208.91.2.1]) by smtp.gmail.com with ESMTPSA id k86sm4725447pfk.125.2017.05.15.10.05.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 May 2017 10:05:07 -0700 (PDT) From: Yi-Hung Wei To: dev@openvswitch.org Date: Mon, 15 May 2017 10:04:55 -0700 Message-Id: <1494867899-87288-2-git-send-email-yihung.wei@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1494867899-87288-1-git-send-email-yihung.wei@gmail.com> References: <1494867899-87288-1-git-send-email-yihung.wei@gmail.com> X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE 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 1/5] ofp-util: Add flow metadata to ofputil_packet_out 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 This patch adds flow metadata to ofputil_packet_out. It does not make any functional change. The flow metadata will be useful to support new packet-out message format in OpenFlow 1.5. Signed-off-by: Yi-Hung Wei --- include/openvswitch/ofp-util.h | 2 +- lib/learning-switch.c | 3 ++- lib/ofp-parse.c | 14 ++++++++------ lib/ofp-print.c | 4 ++-- lib/ofp-util.c | 23 +++++++++++++++-------- ofproto/ofproto.c | 8 +++++--- ovn/controller/ofctrl.c | 2 +- ovn/controller/pinctrl.c | 6 +++--- utilities/ovs-ofctl.c | 4 +++- 9 files changed, 40 insertions(+), 26 deletions(-) diff --git a/include/openvswitch/ofp-util.h b/include/openvswitch/ofp-util.h index f37d181599b2..a0a61cfac23a 100644 --- a/include/openvswitch/ofp-util.h +++ b/include/openvswitch/ofp-util.h @@ -526,7 +526,7 @@ struct ofputil_packet_out { const void *packet; /* Packet data, if buffer_id == UINT32_MAX. */ size_t packet_len; /* Length of packet data in bytes. */ uint32_t buffer_id; /* Buffer id or UINT32_MAX if no buffer. */ - ofp_port_t in_port; /* Packet's input port. */ + struct match flow_metadata; /* Packet's input port and other metadata. */ struct ofpact *ofpacts; /* Actions. */ size_t ofpacts_len; /* Size of ofpacts in bytes. */ }; diff --git a/lib/learning-switch.c b/lib/learning-switch.c index 77155d04fcc0..4ff4e0db38be 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -570,7 +570,8 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh) po.packet = NULL; po.packet_len = 0; } - po.in_port = pi.flow_metadata.flow.in_port.ofp_port; + match_set_in_port(&po.flow_metadata, + pi.flow_metadata.flow.in_port.ofp_port); po.ofpacts = ofpacts.data; po.ofpacts_len = ofpacts.size; diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index c8cac5b4765c..7b0d23feb0c3 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -621,8 +621,8 @@ parse_ofp_packet_out_str__(struct ofputil_packet_out *po, char *string, *po = (struct ofputil_packet_out) { .buffer_id = UINT32_MAX, - .in_port = OFPP_CONTROLLER, }; + match_set_in_port(&po->flow_metadata, OFPP_CONTROLLER); act_str = extract_actions(string); @@ -633,19 +633,21 @@ parse_ofp_packet_out_str__(struct ofputil_packet_out *po, char *string, } if (!strcmp(name, "in_port")) { - if (!ofputil_port_from_string(value, &po->in_port)) { + ofp_port_t in_port; + if (!ofputil_port_from_string(value, &in_port)) { error = xasprintf("%s is not a valid OpenFlow port", value); goto out; } - if (ofp_to_u16(po->in_port) > ofp_to_u16(OFPP_MAX) - && po->in_port != OFPP_LOCAL - && po->in_port != OFPP_NONE - && po->in_port != OFPP_CONTROLLER) { + if (ofp_to_u16(in_port) > ofp_to_u16(OFPP_MAX) + && in_port != OFPP_LOCAL + && in_port != OFPP_NONE + && in_port != OFPP_CONTROLLER) { error = xasprintf( "%s is not a valid OpenFlow port for PACKET_OUT", value); goto out; } + match_set_in_port(&po->flow_metadata, in_port); } else if (!strcmp(name, "packet")) { const char *error_msg = eth_from_hex(value, &packet); if (error_msg) { diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 7ca953100539..98cbf9c4b13c 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -247,8 +247,8 @@ ofp_print_packet_out(struct ds *string, const struct ofp_header *oh, return; } - ds_put_cstr(string, " in_port="); - ofputil_format_port(po.in_port, string); + ds_put_char(string, ' '); + match_format(&po.flow_metadata, string, OFP_DEFAULT_PRIORITY); ds_put_cstr(string, " actions="); ofpacts_format(po.ofpacts, po.ofpacts_len, string); diff --git a/lib/ofp-util.c b/lib/ofp-util.c index bdf89b6c3017..f79be7389585 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -4204,15 +4204,18 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po, enum ofpraw raw = ofpraw_pull_assert(&b); ofpbuf_clear(ofpacts); + match_init_catchall(&po->flow_metadata); if (raw == OFPRAW_OFPT11_PACKET_OUT) { enum ofperr error; + ofp_port_t in_port; const struct ofp11_packet_out *opo = ofpbuf_pull(&b, sizeof *opo); po->buffer_id = ntohl(opo->buffer_id); - error = ofputil_port_from_ofp11(opo->in_port, &po->in_port); + error = ofputil_port_from_ofp11(opo->in_port, &in_port); if (error) { return error; } + match_set_in_port(&po->flow_metadata, in_port); error = ofpacts_pull_openflow_actions(&b, ntohs(opo->actions_len), oh->version, NULL, NULL, @@ -4225,7 +4228,7 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po, const struct ofp10_packet_out *opo = ofpbuf_pull(&b, sizeof *opo); po->buffer_id = ntohl(opo->buffer_id); - po->in_port = u16_to_ofp(ntohs(opo->in_port)); + match_set_in_port(&po->flow_metadata, u16_to_ofp(ntohs(opo->in_port))); error = ofpacts_pull_openflow_actions(&b, ntohs(opo->actions_len), oh->version, NULL, NULL, @@ -4237,11 +4240,13 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po, OVS_NOT_REACHED(); } - if (ofp_to_u16(po->in_port) >= ofp_to_u16(OFPP_MAX) - && po->in_port != OFPP_LOCAL - && po->in_port != OFPP_NONE && po->in_port != OFPP_CONTROLLER) { + if (ofp_to_u16(po->flow_metadata.flow.in_port.ofp_port) >= + ofp_to_u16(OFPP_MAX) + && po->flow_metadata.flow.in_port.ofp_port != OFPP_LOCAL + && po->flow_metadata.flow.in_port.ofp_port != OFPP_NONE + && po->flow_metadata.flow.in_port.ofp_port != OFPP_CONTROLLER) { VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out has bad input port %#"PRIx32, - po->in_port); + po->flow_metadata.flow.in_port.ofp_port); return OFPERR_OFPBRC_BAD_PORT; } @@ -7051,7 +7056,8 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po, opo = msg->msg; opo->buffer_id = htonl(po->buffer_id); - opo->in_port = htons(ofp_to_u16(po->in_port)); + opo->in_port = + htons(ofp_to_u16(po->flow_metadata.flow.in_port.ofp_port)); opo->actions_len = htons(msg->size - actions_ofs); break; } @@ -7071,7 +7077,8 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po, ofp_version); opo = msg->msg; opo->buffer_id = htonl(po->buffer_id); - opo->in_port = ofputil_port_to_ofp11(po->in_port); + opo->in_port = + ofputil_port_to_ofp11(po->flow_metadata.flow.in_port.ofp_port); opo->actions_len = htons(len); break; } diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index d5410fd1b20f..2020fe85df7a 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -3459,8 +3459,10 @@ ofproto_packet_out_init(struct ofproto *ofproto, enum ofperr error; struct match match; - if (ofp_to_u16(po->in_port) >= ofproto->max_ports - && ofp_to_u16(po->in_port) < ofp_to_u16(OFPP_MAX)) { + if (ofp_to_u16(po->flow_metadata.flow.in_port.ofp_port) >= + ofproto->max_ports + && ofp_to_u16(po->flow_metadata.flow.in_port.ofp_port) < + ofp_to_u16(OFPP_MAX)) { return OFPERR_OFPBRC_BAD_PORT; } @@ -3475,7 +3477,7 @@ ofproto_packet_out_init(struct ofproto *ofproto, /* Store struct flow. */ opo->flow = xmalloc(sizeof *opo->flow); flow_extract(opo->packet, opo->flow); - opo->flow->in_port.ofp_port = po->in_port; + opo->flow->in_port.ofp_port = po->flow_metadata.flow.in_port.ofp_port; /* Check actions like for flow mods. We pass a 'table_id' of 0 to * ofproto_check_consistency(), which isn't strictly correct because these diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c index 417fdc9f52b2..804b162b51b1 100644 --- a/ovn/controller/ofctrl.c +++ b/ovn/controller/ofctrl.c @@ -1165,10 +1165,10 @@ ofctrl_inject_pkt(const struct ovsrec_bridge *br_int, const char *flow_s, .packet = dp_packet_data(&packet), .packet_len = dp_packet_size(&packet), .buffer_id = UINT32_MAX, - .in_port = uflow.in_port.ofp_port, .ofpacts = ofpacts.data, .ofpacts_len = ofpacts.size, }; + match_set_in_port(&po.flow_metadata, uflow.in_port.ofp_port); enum ofputil_protocol proto = ofputil_protocol_from_ofp_version(version); queue_msg(ofputil_encode_packet_out(&po, proto)); dp_packet_uninit(&packet); diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c index 9ad413376736..edc0e2b174d1 100644 --- a/ovn/controller/pinctrl.c +++ b/ovn/controller/pinctrl.c @@ -183,10 +183,10 @@ pinctrl_handle_arp(const struct flow *ip_flow, const struct match *md, .packet = dp_packet_data(&packet), .packet_len = dp_packet_size(&packet), .buffer_id = UINT32_MAX, - .in_port = OFPP_CONTROLLER, .ofpacts = ofpacts.data, .ofpacts_len = ofpacts.size, }; + match_set_in_port(&po.flow_metadata, OFPP_CONTROLLER); enum ofputil_protocol proto = ofputil_protocol_from_ofp_version(version); queue_msg(ofputil_encode_packet_out(&po, proto)); @@ -1382,10 +1382,10 @@ send_garp(struct garp_data *garp, long long int current_time) .packet = dp_packet_data(&packet), .packet_len = dp_packet_size(&packet), .buffer_id = UINT32_MAX, - .in_port = OFPP_CONTROLLER, .ofpacts = ofpacts.data, .ofpacts_len = ofpacts.size, }; + match_set_in_port(&po.flow_metadata, OFPP_CONTROLLER); enum ofputil_protocol proto = ofputil_protocol_from_ofp_version(version); queue_msg(ofputil_encode_packet_out(&po, proto)); dp_packet_uninit(&packet); @@ -1781,10 +1781,10 @@ pinctrl_handle_nd_na(const struct flow *ip_flow, const struct match *md, .packet = dp_packet_data(&packet), .packet_len = dp_packet_size(&packet), .buffer_id = UINT32_MAX, - .in_port = OFPP_CONTROLLER, .ofpacts = ofpacts.data, .ofpacts_len = ofpacts.size, }; + match_set_in_port(&po.flow_metadata, OFPP_CONTROLLER); queue_msg(ofputil_encode_packet_out(&po, proto)); diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 1a5e2345b7d4..17ee64649f7f 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -2078,6 +2078,7 @@ ofctl_packet_out(struct ovs_cmdl_context *ctx) struct ofpbuf *opo; char *error; + match_init_catchall(&po.flow_metadata); /* Use the old syntax when more than 4 arguments are given. */ if (ctx->argc > 4) { struct ofpbuf ofpacts; @@ -2091,7 +2092,8 @@ ofctl_packet_out(struct ovs_cmdl_context *ctx) } po.buffer_id = UINT32_MAX; - po.in_port = str_to_port_no(ctx->argv[1], ctx->argv[2]); + match_set_in_port(&po.flow_metadata, + str_to_port_no(ctx->argv[1], ctx->argv[2])); po.ofpacts = ofpacts.data; po.ofpacts_len = ofpacts.size;