From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C35BCA034E; Fri, 21 Jan 2022 11:32:51 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9243042790; Fri, 21 Jan 2022 11:31:48 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id 4A5894276D for ; Fri, 21 Jan 2022 11:31:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642761106; x=1674297106; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=I9mkbkSBoHMIpIQwsuTaEYY/J5xcaK64aU5xNJNJb4w=; b=PE3vCpcAKvaIqdGOFGmo8uId9hawea8HVn/wad8b6iBYEfpTq/Y1b3ux PHjOqaV5cy4zrCKiDnKULH8eeJ+xASqhPfT1ZfpM60KSkWcYK7Q2kTFGO /g6vxWok3ONWrPFruxPgKsH1+ganxwvrFDsFRg0Cbn4C7m5di/nrk1htO 1qFRX6mmLm7B0tfABKozXfK5qrv92Ve6vo/fVI/9PBzqYEttkNhXiWQ89 E/hjd3olVgI1Keb6hptcZGHaBt1Rp4B5Tkfj24VMUQjgpC7RuH6CifWad KJ55cWVnb5o3Q5aQw4zFEn1LDdV4r2HuDmnTMfoaKPGdNmtI/e8OJNq2a g==; X-IronPort-AV: E=McAfee;i="6200,9189,10233"; a="270045145" X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="270045145" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2022 02:31:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="533222789" Received: from silpixa00401120.ir.intel.com ([10.55.128.255]) by orsmga008.jf.intel.com with ESMTP; 21 Jan 2022 02:31:44 -0800 From: Ronan Randles To: dev@dpdk.org Cc: Ronan Randles Subject: [PATCH v2 13/15] gen: add UDP support Date: Fri, 21 Jan 2022 10:31:20 +0000 Message-Id: <20220121103122.2926856-14-ronan.randles@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220121103122.2926856-1-ronan.randles@intel.com> References: <20211214141242.3383831-1-ronan.randles@intel.com> <20220121103122.2926856-1-ronan.randles@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This commit adds UDP parsing and logging. Unit tested by the adition of "UDP()" string to 'test_gen_packet_parse_string()' Signed-off-by: Ronan Randles --- app/test/test_gen.c | 1 + lib/gen/rte_gen.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/app/test/test_gen.c b/app/test/test_gen.c index 7b67835c80..a0b00d6a6e 100644 --- a/app/test/test_gen.c +++ b/app/test/test_gen.c @@ -137,6 +137,7 @@ test_gen_packet_parse_string(void) { .str = "Ether()/IP(sr=,dst=5.6.7.8)", .expected_to_fail = 1}, { .str = "Ether()/IP(src=1.2.3.fail,dst=5.6.7.8)", .expected_to_fail = 1}, + { .str = "Ether()/IP()/UDP()"}, }; uint32_t i; diff --git a/lib/gen/rte_gen.c b/lib/gen/rte_gen.c index 4020150712..3a67ce8b6c 100644 --- a/lib/gen/rte_gen.c +++ b/lib/gen/rte_gen.c @@ -11,6 +11,7 @@ #include #include +#include RTE_LOG_REGISTER(gen_logtype, lib.gen, NOTICE); @@ -138,6 +139,7 @@ enum GEN_PROTO { GEN_PROTO_INVALID, GEN_PROTO_ETHER, GEN_PROTO_IPV4, + GEN_PROTO_UDP, /* Must be last. */ GEN_PROTO_COUNT, @@ -231,6 +233,9 @@ gen_log_ipv4(void *data, const char *indent) case 0: proto_str = "hopopt"; break; + case IPPROTO_UDP: + proto_str = "UDP"; + break; default: proto_str = "unknown next proto"; break; @@ -351,6 +356,12 @@ gen_parse_ipv4(struct gen_parser *parser, char *protocol_str) } switch (inner) { + case GEN_PROTO_UDP: + ip->next_proto_id = IPPROTO_UDP; + struct rte_udp_hdr *udp = gen_parser_get_data_ptr(parser); + udp->dgram_cksum = 0; + break; + default: /* Default protocol is hopopt (0). */ break; @@ -430,6 +441,55 @@ gen_parse_ether(struct gen_parser *parser, char *protocol_str) return 0; } +static void +gen_log_udp(void *data, const char *indent) +{ + struct rte_udp_hdr *udp = data; + + GEN_LOG_PROTOCOL(DEBUG, + "###[ UDP ]###\n%ssport= %u\n%sdport= %u\n%s" + "len= %u\n%schksum= %u\n", + indent, rte_be_to_cpu_16(udp->src_port), + indent, rte_be_to_cpu_16(udp->dst_port), + indent, rte_be_to_cpu_16(udp->dgram_len), + indent, rte_be_to_cpu_16(udp->dgram_cksum)); + +} + +static int32_t +gen_parse_udp(struct gen_parser *parser, char *protocol_str) +{ + RTE_SET_USED(protocol_str); + struct rte_udp_hdr *udp = gen_parser_get_data_ptr(parser); + uint32_t pre_udp_len = parser->buf_write_offset; + memset(udp, 0, sizeof(*udp)); + + /* Move up write pointer in packet. */ + parser->buf_write_offset += sizeof(*udp); + + /* Recurse and handle inner protocol. */ + enum GEN_PROTO inner; + int err = gen_parser_parse_next(parser, &inner); + + switch (inner) { + default: + /* default to DNS like other packet generation tools */ + udp->src_port = rte_cpu_to_be_16(53); + udp->dst_port = rte_cpu_to_be_16(53); + break; + }; + + /* Minimum len is the UDP header itself (8 bytes) or more */ + int32_t total_len = parser->mbuf->data_len; + int32_t dgram_len = total_len - pre_udp_len; + if (dgram_len < 8) + printf("error parsing dgram len, %d\n", dgram_len); + + udp->dgram_len = rte_cpu_to_be_16(dgram_len); + + return err; +} + /* (Name, Function-pointer) pairs for supported parse types */ typedef int32_t (*gen_parse_func)(struct gen_parser *parser, char *protocol_str); @@ -455,6 +515,12 @@ static struct gen_parse_func_t gen_protocols[] = { .parse_func = gen_parse_ipv4, .log_func = gen_log_ipv4, }, + { + .name = "UDP(", + .proto = GEN_PROTO_UDP, + .parse_func = gen_parse_udp, + .log_func = gen_log_udp, + } }; -- 2.25.1