From patchwork Mon Oct 29 12:49:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 990185 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; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="REWGiaIG"; 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 42kDz80vSNz9s3Z for ; Mon, 29 Oct 2018 23:52:52 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id BD10E2CB1; Mon, 29 Oct 2018 12:50:06 +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 9A6C92C75 for ; Mon, 29 Oct 2018 12:50:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 7BE867C3 for ; Mon, 29 Oct 2018 12:50:03 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20181029125002euoutp017d3e89b949f93501057706a0f1287c97~iFUN9K60w3146231462euoutp01d; Mon, 29 Oct 2018 12:50:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20181029125002euoutp017d3e89b949f93501057706a0f1287c97~iFUN9K60w3146231462euoutp01d DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1540817402; bh=mvM0z7UVhXTNtjAi52SaebJl8HC7vo0EjxJPG8xVNFs=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=REWGiaIGZ1h8u5Ok6lG49HlXDO8W7xvLVAWsnJvGYO5yfQUSMhv9eSmy43mjTrWIK daMfGb3rLlYYd2umliX6rEWm2C7RDZ4nfhjY8AXMAAzbRF18zm2WijwVLgoE4YDcPh 7WjAG5Sv6Gl7TG2EagWmW9segitB6j7Xcw2VnwYc= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181029125001eucas1p16d6229f12af9f6f2b4956a8366d64ef9~iFUNjNyhQ2144721447eucas1p1h; Mon, 29 Oct 2018 12:50:01 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 3B.6F.04294.9F107DB5; Mon, 29 Oct 2018 12:50:01 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20181029125000eucas1p21aa7d8f553dc56085a1c4d2bc7ffff3f~iFUMxCJ7m0887608876eucas1p2u; Mon, 29 Oct 2018 12:50:00 +0000 (GMT) X-AuditID: cbfec7f4-835ff700000010c6-d1-5bd701f9f963 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id E6.FD.04128.8F107DB5; Mon, 29 Oct 2018 12:50:00 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0PHD00EQH2AI7G60@eusync3.samsung.com>; Mon, 29 Oct 2018 12:50:00 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org Date: Mon, 29 Oct 2018 15:49:24 +0300 Message-id: <20181029124926.12199-8-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-reply-to: <20181029124926.12199-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrOIsWRmVeSWpSXmKPExsWy7djPc7o/Ga9HG1xcL2mxZdpkVotXi84z W1xp/8lusfHhWVaLuZ+eM1rcnuNl8fTiL2aLliU7mRw4PG78u8XmsXjPSyaPZ9MPM3nc2H6a 1ePZzf+MHn1bVjF6/G++yhrAHsVlk5Kak1mWWqRvl8CV8f7bcpaCw5oViy7UNzB+luli5OSQ EDCR+Dz/J3sXIxeHkMAKRon/12ewQjifGSVWXehjhqk63raLHcQWEljGKPGyTQGiqJlJ4tSV 42AJNgEdiVOrjzCC2CIC0hKve9+ATWIWmMgk8fbnBTaQhLCAq8SK3VtZQGwWAVWJHzsvgtm8 AtYS27ua2SC2yUus3nAAbDOngI3E8/v9bCCDJARmsElcO9EDdZKLxIpr+5ggbGGJV8e3sEPY MhKXJ3ezQNj1EvdbXjJCNHcwSkw/9A+qwV5iy+tzYA3MAnwSk7ZNBxrKARTnlehoE4IwPSSa fzpAfNnPKHHy6ymmCYySCxgZVjGKp5YW56anFhvlpZbrFSfmFpfmpesl5+duYgRG5+l/x7/s YNz1J+kQowAHoxIP7wPua9FCrIllxZW5hxglOJiVRHhfnQUK8aYkVlalFuXHF5XmpBYfYpTm YFES5102b2O0kEB6YklqdmpqQWoRTJaJg1OqgdF63+MVHasPVV/+e0Bhf7XLJ7MVD5S2zf7W GuuSdGpVivDhy1rik3/NXOb9KUPiR4CX2C+/7Y99eI8cXf9d1nhRI/fG6mkHNGX9hebELD0o 8Mbu3w4ZrraDzEsYE76I3N/B7L7v+zo2+fe8032Fnu4I1jsg+9TW693sgmkLZ5/9zKxanZZ+ guOFEktxRqKhFnNRcSIAwCUUIMoCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprGLMWRmVeSWpSXmKPExsVy+t/xq7o/GK9HG7xcamixZdpkVotXi84z W1xp/8lusfHhWVaLuZ+eM1rcnuNl8fTiL2aLliU7mRw4PG78u8XmsXjPSyaPZ9MPM3nc2H6a 1ePZzf+MHn1bVjF6/G++yhrAHsVlk5Kak1mWWqRvl8CV8f7bcpaCw5oViy7UNzB+luli5OSQ EDCRON62i72LkYtDSGAJo8TDE92MEE4rk8Tj3hesIFVsAjoSp1YfYQSxRQSkJV73vmEFKWIW mMwksaSliRkkISzgKrFi91YWEJtFQFXix86LYDavgLXE9q5mNoh18hKrNxwAq+cUsJF4fr8f LC4EVLPq41zmCYw8CxgZVjGKpJYW56bnFhvpFSfmFpfmpesl5+duYgSG1rZjP7fsYOx6F3yI UYCDUYmH9wH3tWgh1sSy4srcQ4wSHMxKIryvzgKFeFMSK6tSi/Lji0pzUosPMUpzsCiJ8543 qIwSEkhPLEnNTk0tSC2CyTJxcEo1MK6xdGvicky8IlTFI1Op2qMY+eNZPqfFhAeqghYv79x/ uu+ie6SIW73cdC3madq3F1fLh515zinQcXcyw3tnC4MLwau4ykRm7Dq49/QNP5kHV7bJBEUc 8M21Wbxg9r5H79coy/5je/bJOkZc55JucI5iVdWd3LPOeTXVn9ceiM2Rzr4+89G8P0osxRmJ hlrMRcWJADFNnkMpAgAA X-CMS-MailID: 20181029125000eucas1p21aa7d8f553dc56085a1c4d2bc7ffff3f X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181029125000eucas1p21aa7d8f553dc56085a1c4d2bc7ffff3f References: <20181029124926.12199-1-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Shahaf Shuler , Flavio Leitner , Ilya Maximets Subject: [ovs-dev] [PATCH 7/9] netdev-dummy: Set flow mark for offloaded flows. 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 Match packets received on dummy interfaces with offloaded flows and set up corresponding marks in dp-packet. Signed-off-by: Ilya Maximets --- lib/netdev-dummy.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 7163ab47c..bd18a5190 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -156,7 +156,7 @@ struct netdev_rxq_dummy { static unixctl_cb_func netdev_dummy_set_admin_state; static int netdev_dummy_construct(struct netdev *); static void netdev_dummy_queue_packet(struct netdev_dummy *, - struct dp_packet *, int); + struct dp_packet *, struct flow *, int); static void dummy_packet_stream_close(struct dummy_packet_stream *); @@ -283,7 +283,7 @@ dummy_packet_stream_run(struct netdev_dummy *dev, struct dummy_packet_stream *s) if (retval == n && dp_packet_size(&s->rxbuf) > 2) { dp_packet_pull(&s->rxbuf, 2); netdev_dummy_queue_packet(dev, - dp_packet_clone(&s->rxbuf), 0); + dp_packet_clone(&s->rxbuf), NULL, 0); dp_packet_clear(&s->rxbuf); } } else if (retval != -EAGAIN) { @@ -1152,7 +1152,7 @@ netdev_dummy_send(struct netdev *netdev, int qid OVS_UNUSED, struct dp_packet *reply = dp_packet_new(0); compose_arp(reply, ARP_OP_REPLY, dev->hwaddr, flow.dl_src, false, flow.nw_dst, flow.nw_src); - netdev_dummy_queue_packet(dev, reply, 0); + netdev_dummy_queue_packet(dev, reply, NULL, 0); } } @@ -1563,12 +1563,11 @@ eth_from_packet(const char *s) } static struct dp_packet * -eth_from_flow(const char *s, size_t packet_size) +eth_from_flow_str(const char *s, size_t packet_size, struct flow *flow) { enum odp_key_fitness fitness; struct dp_packet *packet; struct ofpbuf odp_key; - struct flow flow; int error; /* Convert string to datapath key. @@ -1585,7 +1584,7 @@ eth_from_flow(const char *s, size_t packet_size) } /* Convert odp_key to flow. */ - fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size, &flow); + fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size, flow); if (fitness == ODP_FIT_ERROR) { ofpbuf_uninit(&odp_key); return NULL; @@ -1593,15 +1592,15 @@ eth_from_flow(const char *s, size_t packet_size) packet = dp_packet_new(0); if (packet_size) { - flow_compose(packet, &flow, NULL, 0); + flow_compose(packet, flow, NULL, 0); if (dp_packet_size(packet) < packet_size) { - packet_expand(packet, &flow, packet_size); + packet_expand(packet, flow, packet_size); } else if (dp_packet_size(packet) > packet_size){ dp_packet_delete(packet); packet = NULL; } } else { - flow_compose(packet, &flow, NULL, 64); + flow_compose(packet, flow, NULL, 64); } ofpbuf_uninit(&odp_key); @@ -1621,14 +1620,28 @@ netdev_dummy_queue_packet__(struct netdev_rxq_dummy *rx, struct dp_packet *packe static void netdev_dummy_queue_packet(struct netdev_dummy *dummy, struct dp_packet *packet, - int queue_id) + struct flow *flow, int queue_id) OVS_REQUIRES(dummy->mutex) { struct netdev_rxq_dummy *rx, *prev; + struct offloaded_flow *data; + struct flow packet_flow; if (dummy->rxq_pcap) { ovs_pcap_write(dummy->rxq_pcap, packet); } + + if (!flow) { + flow = &packet_flow; + flow_extract(packet, flow); + } + HMAP_FOR_EACH (data, node, &dummy->offloaded_flows) { + if (flow_equal_except(flow, &data->match.flow, &data->match.wc)) { + dp_packet_set_flow_mark(packet, data->mark); + break; + } + } + prev = NULL; LIST_FOR_EACH (rx, node, &dummy->rxes) { if (rx->up.queue_id == queue_id && @@ -1674,6 +1687,7 @@ netdev_dummy_receive(struct unixctl_conn *conn, for (i = k; i < argc; i++) { struct dp_packet *packet; + struct flow flow; /* Try to parse 'argv[i]' as packet in hex. */ packet = eth_from_packet(argv[i]); @@ -1693,15 +1707,17 @@ netdev_dummy_receive(struct unixctl_conn *conn, i += 2; } /* Try parse 'argv[i]' as odp flow. */ - packet = eth_from_flow(flow_str, packet_size); + packet = eth_from_flow_str(flow_str, packet_size, &flow); if (!packet) { unixctl_command_reply_error(conn, "bad packet or flow syntax"); goto exit; } + } else { + flow_extract(packet, &flow); } - netdev_dummy_queue_packet(dummy_dev, packet, rx_qid); + netdev_dummy_queue_packet(dummy_dev, packet, &flow, rx_qid); } unixctl_command_reply(conn, NULL);