From patchwork Tue Jul 25 13:02:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 793367 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 3xGz29644fz9rxm for ; Tue, 25 Jul 2017 23:03:29 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id E6EF5B77; Tue, 25 Jul 2017 13:02:20 +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 37C0FB49 for ; Tue, 25 Jul 2017 13:02:19 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout3.w1.samsung.com (mailout3.w1.samsung.com [210.118.77.13]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 0FC0B3CE for ; Tue, 25 Jul 2017 13:02:17 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout3.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OTN006CLDJQHS70@mailout3.w1.samsung.com> for ovs-dev@openvswitch.org; Tue, 25 Jul 2017 14:02:14 +0100 (BST) Received: from eusmges1.samsung.com (unknown [203.254.199.239]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170725130214eucas1p2d88edd1e76c868a27fd43df8494ffdf1~UlGRLow3F1321113211eucas1p2m; Tue, 25 Jul 2017 13:02:14 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1.samsung.com (EUCPMTA) with SMTP id AF.AC.14140.85147795; Tue, 25 Jul 2017 14:02:16 +0100 (BST) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170725130213eucas1p26be023ce1946c1736b44c2db7ff291da~UlGQf0_R31321113211eucas1p2i; Tue, 25 Jul 2017 13:02:13 +0000 (GMT) X-AuditID: cbfec7ef-f796a6d00000373c-4a-59774158d6b1 Received: from eusync1.samsung.com ( [203.254.199.211]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 01.CA.20206.55147795; Tue, 25 Jul 2017 14:02:13 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OTN00ESODJG6I80@eusync1.samsung.com>; Tue, 25 Jul 2017 14:02:13 +0100 (BST) From: Ilya Maximets To: ovs-dev@openvswitch.org, Andy Zhou Date: Tue, 25 Jul 2017 16:02:00 +0300 Message-id: <1500987722-28140-2-git-send-email-i.maximets@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1500987722-28140-1-git-send-email-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrKIsWRmVeSWpSXmKPExsWy7djPc7oRjuWRBnfWy1rMe7+J0WLa59vs Flfaf7Jb7JmVZzH303NGB1aPZzf/M3o8v9bD4tG3ZRVjAHMUl01Kak5mWWqRvl0CV8bC7V8Y C9aqVayef46pgfGnVBcjJ4eEgInE+U//2CBsMYkL99YD2VwcQgLLGCVmf7nICOF8ZpR4tnAf O0zH48ZFrHBVCxYuY4FwmpkkFs84zQhSxSagI3Fq9REwW0TATGL9tvWsIDazQInElN3NYPuE geI3DnaCxVkEVCW2vLwNtoFXwE1i/aVzUDfJSdw818kMYnMKuEv87pnEDLJMQuAym0RP8wOg Zg4gR1Zi0wFmCNNFYspkc4hWYYlXx7dAHS0jcXlyNwtEazOjRMOqS4wQzgRGiS/Ny5kgquwl Tt28ygRxKJ/EpG3ToYbySnS0CUGUeEic2zGTGcJ2lNh68y3YnUICsxgl7r9VmsAos4CRYRWj SGppcW56arGhXnFibnFpXrpecn7uJkZgZJ7+d/z9DsanzSGHGAU4GJV4eDf8KI0UYk0sK67M PcQowcGsJMLL41AeKcSbklhZlVqUH19UmpNafIhRmoNFSZyX99S1CCGB9MSS1OzU1ILUIpgs EwenVAPjgqzXi5Yu/RyRzP/dMqS3QtWO4dqBsoDaBeEaBrM3tTn935jkqhrW8ldD6k51xonv NS+SdHXnfM87k3jnkczEpjfny1/IbkqpsVh4Vc9Wrtfq36e/JVftIie+O5/waU9Ip0vHoxfd 9658YnrlGfL/fZF038kvec3eGhtMsk2qlCWkvkkHcfYqsRRnJBpqMRcVJwIAGXJtUMgCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrCLMWRmVeSWpSXmKPExsVy+t/xy7qhjuWRBtfe81rMe7+J0WLa59vs Flfaf7Jb7JmVZzH303NGB1aPZzf/M3o8v9bD4tG3ZRVjAHOUm01GamJKapFCal5yfkpmXrqt UmiIm66FkkJeYm6qrVKErm9IkJJCWWJOKZBnZIAGHJwD3IOV9O0S3DIWbv/CWLBWrWL1/HNM DYw/pboYOTkkBEwkHjcuYoWwxSQu3FvP1sXIxSEksIRR4tOCw2wgCSGBViaJ1j0lIDabgI7E qdVHGEFsEQEzifXb1oM1MwuUSDxec5wFxBYGit842AkWZxFQldjy8jY7iM0r4Cax/tI5Nohl chI3z3Uyg9icAu4Sv3smMUPscpM4cP4z2wRG3gWMDKsYRVJLi3PTc4uN9IoTc4tL89L1kvNz NzECQ3TbsZ9bdjB2vQs+xCjAwajEwxvxrTRSiDWxrLgy9xCjBAezkggvj0N5pBBvSmJlVWpR fnxRaU5q8SFGU6CjJjJLiSbnA+MnryTe0MTQ3NLQyNjCwtzISEmcd+qHK+FCAumJJanZqakF qUUwfUwcnFINjNOU1BaduW/TNP+CUe/J9l+b+6+wsD54sORFh9/qR57x5hN2vOFl+3Pnh61J rOSmgw1n1LpOVdxke6dpIhX81Pmbpm+OeJQWn3/L9M+OvdvWvNoaq7DRb9PdjNvpu7pCbASX zXrqcC3wofoDb6MGvpzwKrdncUsv+i1Vbw/iOr7A+obsj+/3pZVYijMSDbWYi4oTAXuQihdn AgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170725130213eucas1p26be023ce1946c1736b44c2db7ff291da X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?SWx5YSBNYXhpbWV0cxtTUlItVmlydHVhbGl6YXRpb24gTGFi?= =?UTF-8?B?G+yCvOyEseyghOyekBtMZWFkaW5nIEVuZ2luZWVy?= X-Global-Sender: =?UTF-8?B?SWx5YSBNYXhpbWV0cxtTUlItVmlydHVhbGl6YXRpb24gTGFi?= =?UTF-8?B?G1NhbXN1bmcgRWxlY3Ryb25pY3MbTGVhZGluZyBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0NJU0hRG0MxMEdEMDFHRDAxMDE1NA==?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170725130213eucas1p26be023ce1946c1736b44c2db7ff291da X-RootMTR: 20170725130213eucas1p26be023ce1946c1736b44c2db7ff291da References: <1500987722-28140-1-git-send-email-i.maximets@samsung.com> X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 Cc: Ilya Maximets , Heetae Ahn Subject: [ovs-dev] [PATCH v2 1/3] flow: Add flow_compose_size(). 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 allows to compose packets with different real lenghts from odp flows i.e. memory will be allocated for requested packet size and all required headers like ip->tot_len filled correctly. Will be used in netdev-dummy to properly handle '--len' option. Suggested-by: Andy Zhou Signed-off-by: Ilya Maximets --- lib/flow.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++---------- lib/flow.h | 1 + 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/lib/flow.c b/lib/flow.c index e1597fa..8da9f32 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -2706,40 +2706,85 @@ flow_compose_l4_csum(struct dp_packet *p, const struct flow *flow, if (flow->nw_proto == IPPROTO_TCP) { struct tcp_header *tcp = dp_packet_l4(p); - /* Checksum has already been zeroed by put_zeros call in - * flow_compose_l4(). */ + tcp->tcp_csum = 0; tcp->tcp_csum = csum_finish(csum_continue(pseudo_hdr_csum, tcp, l4_len)); } else if (flow->nw_proto == IPPROTO_UDP) { struct udp_header *udp = dp_packet_l4(p); - /* Checksum has already been zeroed by put_zeros call in - * flow_compose_l4(). */ + udp->udp_csum = 0; udp->udp_csum = csum_finish(csum_continue(pseudo_hdr_csum, udp, l4_len)); } else if (flow->nw_proto == IPPROTO_ICMP) { struct icmp_header *icmp = dp_packet_l4(p); - /* Checksum has already been zeroed by put_zeros call in - * flow_compose_l4(). */ + icmp->icmp_csum = 0; icmp->icmp_csum = csum(icmp, l4_len); } else if (flow->nw_proto == IPPROTO_IGMP) { struct igmp_header *igmp = dp_packet_l4(p); - /* Checksum has already been zeroed by put_zeros call in - * flow_compose_l4(). */ + igmp->igmp_csum = 0; igmp->igmp_csum = csum(igmp, l4_len); } else if (flow->nw_proto == IPPROTO_ICMPV6) { struct icmp6_hdr *icmp = dp_packet_l4(p); - /* Checksum has already been zeroed by put_zeros call in - * flow_compose_l4(). */ + icmp->icmp6_cksum = 0; icmp->icmp6_cksum = (OVS_FORCE uint16_t) csum_finish(csum_continue(pseudo_hdr_csum, icmp, l4_len)); } } } +/* Tries to increase the size of packet composed by 'flow_compose' up to + * 'size' bytes. Fixes all the required packet headers like ip/udp lengths + * and l3/l4 checksums. */ +void +flow_compose_size(struct dp_packet *p, const struct flow *flow, size_t size) +{ + size_t extra_size; + + if (size <= dp_packet_size(p)) { + return; + } + + extra_size = size - dp_packet_size(p); + dp_packet_put_zeros(p, extra_size); + + if (flow->dl_type == htons(FLOW_DL_TYPE_NONE)) { + struct eth_header *eth = dp_packet_eth(p); + + eth->eth_type = htons(dp_packet_size(p)); + + } else if (dl_type_is_ip_any(flow->dl_type)) { + uint32_t pseudo_hdr_csum; + size_t l4_len = (char *) dp_packet_tail(p) - (char *) dp_packet_l4(p); + + if (flow->dl_type == htons(ETH_TYPE_IP)) { + struct ip_header *ip = dp_packet_l3(p); + + ip->ip_tot_len = htons(p->l4_ofs - p->l3_ofs + l4_len); + ip->ip_csum = 0; + ip->ip_csum = csum(ip, sizeof *ip); + + pseudo_hdr_csum = packet_csum_pseudoheader(ip); + } else { /* ETH_TYPE_IPV6 */ + struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(p); + + nh->ip6_plen = htons(l4_len); + pseudo_hdr_csum = packet_csum_pseudoheader6(nh); + } + + if ((!(flow->nw_frag & FLOW_NW_FRAG_ANY) + || !(flow->nw_frag & FLOW_NW_FRAG_LATER)) + && flow->nw_proto == IPPROTO_UDP) { + struct udp_header *udp = dp_packet_l4(p); + + udp->udp_len = htons(l4_len + extra_size); + } + flow_compose_l4_csum(p, flow, pseudo_hdr_csum); + } +} + /* Puts into 'p' a packet that flow_extract() would parse as having the given * 'flow'. * diff --git a/lib/flow.h b/lib/flow.h index 9297842..1bbbe41 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -125,6 +125,7 @@ void flow_set_mpls_bos(struct flow *, int idx, uint8_t stack); void flow_set_mpls_lse(struct flow *, int idx, ovs_be32 lse); void flow_compose(struct dp_packet *, const struct flow *); +void flow_compose_size(struct dp_packet *, const struct flow *, size_t size); bool parse_ipv6_ext_hdrs(const void **datap, size_t *sizep, uint8_t *nw_proto, uint8_t *nw_frag);