aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/udp/udp.h3
-rw-r--r--src/vnet/udp/udp_pg.c11
2 files changed, 13 insertions, 1 deletions
diff --git a/src/vnet/udp/udp.h b/src/vnet/udp/udp.h
index 91d063a2f0c..3b6de6ca271 100644
--- a/src/vnet/udp/udp.h
+++ b/src/vnet/udp/udp.h
@@ -107,6 +107,9 @@ typedef struct
/* Next index for this type. */
u32 next_index;
+
+ /* Parser for packet generator edits for this protocol */
+ unformat_function_t *unformat_pg_edit;
} udp_dst_port_info_t;
typedef enum
diff --git a/src/vnet/udp/udp_pg.c b/src/vnet/udp/udp_pg.c
index a81a9d2ed40..0f633eb6c9f 100644
--- a/src/vnet/udp/udp_pg.c
+++ b/src/vnet/udp/udp_pg.c
@@ -39,6 +39,7 @@
#include <vnet/pg/pg.h>
#include <vnet/ip/ip.h> /* for unformat_udp_udp_port */
+#include <vnet/udp/udp.h>
#define UDP_PG_EDIT_LENGTH (1 << 0)
#define UDP_PG_EDIT_CHECKSUM (1 << 1)
@@ -191,17 +192,25 @@ unformat_pg_udp_header (unformat_input_t * input, va_list * args)
u16 dst_port;
tcp_udp_port_info_t *pi;
+ /* For the pg format of applications over UDP local */
+ udp_dst_port_info_t *pi2 = NULL;
+
pi = 0;
if (p->dst_port.type == PG_EDIT_FIXED)
{
dst_port = pg_edit_get_value (&p->dst_port, PG_EDIT_LO);
pi = ip_get_tcp_udp_port_info (im, dst_port);
+ pi2 = udp_get_dst_port_info (&udp_main, dst_port, UDP_IP4);
+ if (!pi2)
+ pi2 = udp_get_dst_port_info (&udp_main, dst_port, UDP_IP6);
}
if (pi && pi->unformat_pg_edit
&& unformat_user (input, pi->unformat_pg_edit, s))
;
-
+ else if (pi2 && pi2->unformat_pg_edit
+ && unformat_user (input, pi2->unformat_pg_edit, s))
+ ;
else if (!unformat_user (input, unformat_pg_payload, s))
goto error;