Dpdk: add a uevent listener helper app - #4661
Conversation
11c37af to
c867395
Compare
There was a problem hiding this comment.
Pull request overview
This PR adds a small standalone C helper (azure_uevent_listener.c) under the DPDK test suite that listens directly to NETLINK_KOBJECT_UEVENT and prints one tagged line per kernel uevent relevant to Azure NIC hotplug (net, vmbus, infiniband, pci), enabling higher-level DPDK SR-IOV hotplug tests to reliably match the precise device-add/remove sequence.
Changes:
- Add a netlink uevent listener that classifies and prints Azure NIC-related uevents with stable, parseable tags.
- Include optional modes to print all subsystems (
-a) and dump raw key/value properties (-v).
Suppressed comments (1)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
- The
-hoption is implemented but not documented inusage(), and the usage line doesn’t mention it. This makes CLI help incomplete.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| static void | ||
| print_event(const struct uevent *ev, const char *tag, bool vf) | ||
| { | ||
| struct timespec ts; |
| * Build: | ||
| * gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c | ||
| * |
| cm = CMSG_FIRSTHDR(&msg); | ||
| if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS) | ||
| return 0; | ||
| cred = (struct ucred *)CMSG_DATA(cm); | ||
| if (cred->uid != 0) | ||
| return 0; |
c867395 to
7c46c72
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
struct timespec tsis used in the timestamp (ts.tv_nsec) even ifclock_gettime()fails, leavingtsuninitialized and causing undefined behavior in the printed output. Initializetsso the fallback path is safe.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:21
- The build command in the header comment references a non-existent source file (
azure_hotplug_mon.c). Copy/pasting this command will fail because the actual file name isazure_uevent_listener.c.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:158
classify()returnsPCI_ADD/PCI_REMOVEfor non-Azure-VF PCI events. That means the program will print unrelated PCI hotplug events even when-ais not specified, contradicting the comment that non-Azure NIC cases are dropped unless-ais given.
if (strcmp(ev->subsystem, "pci") == 0) {
if (vf)
return add ? "VF_PCI_ADD" : "VF_PCI_REMOVE";
return add ? "PCI_ADD" : "PCI_REMOVE";
}
7c46c72 to
5cd523e
Compare
5cd523e to
5686a9b
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
tsmay be uninitialized ifclock_gettime()fails, but it is still used in the timestamp print (ts.tv_nsec). Initializing it avoids undefined behavior and keeps output deterministic on failure paths.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:295
recvmsg()ancillary data can include multiple control messages; relying onCMSG_FIRSTHDR()beingSCM_CREDENTIALSmay cause all events to be skipped on kernels that prepend other cmsgs (e.g. pktinfo). Iterate cmsgs to findSCM_CREDENTIALSand validate it.
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
cred = (struct ucred *)CMSG_DATA(cm);
if (cred->uid != 0)
return 0;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build command in the header comment refers to
azure_hotplug_mon.c, but this file isazure_uevent_listener.c. Updating it prevents copy/paste build failures for anyone following the inline instructions.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build instruction references
azure_hotplug_mon.c, but this PR addsazure_uevent_listener.c. As written, the example command won’t compile on a fresh checkout. Update the command to use the actual source filename (or rename the file to match the documentation).
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
tsis used in the printf even ifclock_gettime()fails, but it’s currently uninitialized. Initialize it to avoid undefined behavior in that error path.
struct timespec ts;
5686a9b to
025ec32
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build instructions reference
azure_hotplug_mon.c, but this file doesn’t exist in the repo (this PR addsazure_uevent_listener.c). As written, the example build command will fail. Update the command to compile the actual source file name (or rename the file to match the documented command).
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:181
ts.tv_nsecis used in the printf even ifclock_gettime()fails, leavingtsuninitialized (undefined behavior and can trigger compiler warnings). Initializetsand only print milliseconds when the timestamp was captured successfully (or default to 0).
struct timespec ts;
struct tm tm;
char when[16] = "??:??:??";
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build command references
azure_hotplug_mon.c, but this file is namedazure_uevent_listener.cin the repo, so the command as written will fail when copy/pasted. Update the filename in the build instructions.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
tsis used in the printf format even whenclock_gettime()fails, which leavests.tv_nsecuninitialized and can print garbage timestamps. Initializetsto a known value before the call.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
-his supported (andgetoptaccepts it), but the usage text doesn’t mention it. This makes the CLI help incomplete.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
a4f1150 to
5ef3530
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (4)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:186
- Major:
print_event()usests.tv_nsecin the log line even ifclock_gettime()fails, leavingtsuninitialized and resulting in undefined behavior / garbage timestamps.
struct timespec ts;
struct tm tm;
char when[16] = "??:??:??";
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
localtime_r(&ts.tv_sec, &tm) != NULL)
strftime(when, sizeof(when), "%H:%M:%S", &tm);
printf("[%s.%03ld] %-18s subsystem=%s", when, ts.tv_nsec / 1000000,
tag, ev->subsystem != NULL ? ev->subsystem : "?");
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:295
- Major: if
SO_PASSCREDcan't be enabled (you already warn and continue),uev_recv()will drop all messages because it requiresSCM_CREDENTIALS. Also, the cmsg check should validatecmsg_level == SOL_SOCKET. Consider treating credentials as an optional extra filter: only enforceuid==0when credentials are present.
/* Only the kernel (port id 0, uid 0) is allowed to talk to us. */
if (snl.nl_pid != 0)
return 0;
cm = CMSG_FIRSTHDR(&msg);
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
cred = (struct ucred *)CMSG_DATA(cm);
if (cred->uid != 0)
return 0;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- Minor: the build instructions reference
azure_hotplug_mon.c, but this file is namedazure_uevent_listener.c. This can confuse users trying to build the helper.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
- Nit:
-his accepted by getopt, but it isn't shown in the usage text.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
5ef3530 to
f121dda
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- Minor: The build instructions reference a different source filename (azure_hotplug_mon.c) than the actual file (azure_uevent_listener.c), which will mislead anyone trying to compile this helper.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:185
- Major: print_event() uses ts.tv_nsec in the printf even if clock_gettime() fails, leaving ts uninitialized and causing undefined behavior / garbage timestamps. Initialize ts and only derive milliseconds when clock_gettime succeeds.
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
localtime_r(&ts.tv_sec, &tm) != NULL)
strftime(when, sizeof(when), "%H:%M:%S", &tm);
printf("[%s.%03ld] %-18s subsystem=%s", when, ts.tv_nsec / 1000000,
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:295
- Minor: uev_recv() assumes the first control message is SCM_CREDENTIALS without verifying cmsg_level/cmsg_len, and doesn’t search subsequent control messages. It’s more robust to iterate CMSG headers and validate the credential cmsg before trusting it.
cm = CMSG_FIRSTHDR(&msg);
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
cred = (struct ucred *)CMSG_DATA(cm);
if (cred->uid != 0)
return 0;
f121dda to
ebeb6fb
Compare
ebeb6fb to
b607cbe
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- Minor: The build instructions reference
azure_hotplug_mon.c, which doesn’t exist in this repo. Update the command to use the actual source filename so the helper can be built as documented.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:179
- Major:
ts(andtm) are uninitialized whenclock_gettime()/localtime_r()fail, butts.tv_nsecis still used in the printf, which is undefined behavior. Initialize the structs before use so failure prints a safe timestamp (e.g., 00:00:00.000).
struct timespec ts;
struct tm tm;
char when[16] = "??:??:??";
| /* Credentials let us drop anything not sent by the kernel. */ | ||
| if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) | ||
| fprintf(stderr, "warning: SO_PASSCRED failed: %s\n", | ||
| strerror(errno)); |
b607cbe to
eebf97a
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.
Suppressed comments (2)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build command references
azure_hotplug_mon.c, but this file isazure_uevent_listener.c. As-is, the documented build command won’t work when copied verbatim.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:181
tsis uninitialized ifclock_gettime()orlocaltime_r()fails, butts.tv_nsecis still used in theprintf(), which is undefined behavior and can print garbage timestamps. Initialize the timespec and only compute milliseconds when the time lookup succeeds.
struct timespec ts;
struct tm tm;
char when[16] = "??:??:??";
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
| @@ -0,0 +1,452 @@ | |||
| /* SPDX-License-Identifier: BSD-3-Clause | |||
| * | |||
| * azure_hotplug_mon - watch kernel uevents for NIC hotplug/removal on Azure. | |||
| "usage: %s [-a] [-v]\n" | ||
| " -a report every subsystem, not just Azure NIC events\n" | ||
| " -v dump all uevent properties for each reported event\n", | ||
| argv0); |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- Major: The build instructions reference
azure_hotplug_mon.c, but the added source file isazure_uevent_listener.c. This makes the comment block non-actionable for anyone trying to compile the helper from the repo checkout.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:186
- Major:
tsis uninitialized ifclock_gettime()fails, but it is always used in the printf for milliseconds (ts.tv_nsec / 1000000). This is undefined behavior and can print garbage or crash under sanitizers.
struct timespec ts;
struct tm tm;
char when[16] = "??:??:??";
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
localtime_r(&ts.tv_sec, &tm) != NULL)
strftime(when, sizeof(when), "%H:%M:%S", &tm);
printf("[%s.%03ld] %-18s subsystem=%s", when, ts.tv_nsec / 1000000,
tag, ev->subsystem != NULL ? ev->subsystem : "?");
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
- Minor:
-his implemented ingetopt()handling, but theusage()output doesn’t mention it. This can confuse callers trying to discover the help flag.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build command references a non-existent source filename (
azure_hotplug_mon.c). Since the file in-tree isazure_uevent_listener.c, the command as written will fail if copy-pasted.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
tsis used in the printf even ifclock_gettime()fails, which leavests.tv_nsecuninitialized and results in undefined output/behavior. Initializets(or gate the use of tv_nsec) so printing is always defined.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:292
- The SCM_CREDENTIALS validation checks only
cmsg_type. Adding acmsg_level == SOL_SOCKETcheck avoids accidentally treating a different control message type as credentials if message layouts change.
cm = CMSG_FIRSTHDR(&msg);
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
| printf("watching kernel uevents (ctrl-c to stop)\n"); | ||
| fflush(stdout); |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:185
- Major:
ts.tv_nsecis used in the printf even ifclock_gettime()orlocaltime_r()fails, leavingtspotentially uninitialized and printing garbage (undefined behavior). Initializets/the millisecond field to a safe default before printing.
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
localtime_r(&ts.tv_sec, &tm) != NULL)
strftime(when, sizeof(when), "%H:%M:%S", &tm);
printf("[%s.%03ld] %-18s subsystem=%s", when, ts.tv_nsec / 1000000,
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- Minor: The build instruction references
azure_hotplug_mon.c, but this source file isazure_uevent_listener.c. As written, the command won’t work when copy-pasted.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (3)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
tsis uninitialized ifclock_gettime()fails, but it is still used in the timestamp (ts.tv_nsec) in theprintf, which is undefined behavior. Initializetsto zero so the fallback??:??:??path is still safe.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build instructions reference
azure_hotplug_mon.c, but the file added in this PR isazure_uevent_listener.c. As written, the command won’t work.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
-his accepted ingetopt("avh"), but it isn’t documented in theusage()output. This makes the help text incomplete.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (4)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:185
print_event()usests.tv_nsecin the printf even whenclock_gettime()fails, leavingtsuninitialized and producing undefined output for the milliseconds field.
if (clock_gettime(CLOCK_REALTIME, &ts) == 0 &&
localtime_r(&ts.tv_sec, &tm) != NULL)
strftime(when, sizeof(when), "%H:%M:%S", &tm);
printf("[%s.%03ld] %-18s subsystem=%s", when, ts.tv_nsec / 1000000,
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:295
uev_recv()drops the event when no SCM_CREDENTIALS control message is present. That makes the listener silently stop reporting on kernels/configs whereSO_PASSCREDisn't supported or credentials aren't attached, even thoughsnl.nl_pid == 0already filters to kernel-originated uevents.
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
cred = (struct ucred *)CMSG_DATA(cm);
if (cred->uid != 0)
return 0;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:22
- The build instruction references
azure_hotplug_mon.c, but this file isazure_uevent_listener.c. Copy/pasting the command as written will fail.
* Build:
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
*
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:367
usage()doesn't mention the supported-hflag, and the usage line omits-h, so the help output is incomplete/misleading.
fprintf(stderr,
"usage: %s [-a] [-v]\n"
" -a report every subsystem, not just Azure NIC events\n"
" -v dump all uevent properties for each reported event\n",
argv0);
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (4)
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:21
- The build example references
azure_hotplug_mon.c, but this PR addsazure_uevent_listener.c. As written, the command will fail when copy-pasted.
* gcc -O2 -Wall -Wextra -o azure-hotplug-mon azure_hotplug_mon.c
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:177
ts.tv_nsecis used in the printf even whenclock_gettime()fails, leavingtsuninitialized and producing undefined output.
struct timespec ts;
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:364
usage()documents-aand-vbut the program also supports-h. The help output should include-hso users can discover it.
"usage: %s [-a] [-v]\n"
lisa/microsoft/testsuites/dpdk/uevent_listener/azure_uevent_listener.c:295
- If
SO_PASSCREDcan't be enabled (you already print a warning),recvmsg()may not include anSCM_CREDENTIALScontrol message and this function will silently drop every uevent (returning 0). Consider treating credentials as optional and falling back to the existingsnl.nl_pid == 0kernel-sender check.
cm = CMSG_FIRSTHDR(&msg);
if (cm == NULL || cm->cmsg_type != SCM_CREDENTIALS)
return 0;
cred = (struct ucred *)CMSG_DATA(cm);
if (cred->uid != 0)
return 0;
Hot plug tests need to know exactly when the kernel adds or removes a VF, its uverbs node, its ib device and its netdev, but DPDK's own rte_dev_event_monitor only parses pci, uio and vfio events that carry PCI_SLOT_NAME, so it drops every vmbus, net and infiniband uevent that matters on Azure. Add a small helper that listens on NETLINK_KOBJECT_UEVENT directly and prints a tagged, single line per event that tests can match on. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d5f58ad-b9df-4420-ad37-22caee78e925
Part 8 of 9 of a stacked series that reworks the DPDK SRIOV hot plug tests. Stacked on #4660, review only the last commit. This adds a single new C source file and changes no Python.
Hot plug tests need to know exactly when the kernel adds or removes a VF, its uverbs node, its ib device and its netdev. DPDK's own
rte_dev_event_monitoronly parses pci, uio and vfio events that carryPCI_SLOT_NAME, so it drops every vmbus, net and infiniband uevent that matters on Azure.This helper listens on
NETLINK_KOBJECT_UEVENTdirectly and prints a tagged, single line per event that the tests can match on. It is consumed by the next PR in the stack.Key Test Cases:
verify_dpdk_sriov_rescind_failover_send_only
Impacted LISA Features:
Sriov, NetworkInterface
Tested Azure Marketplace Images:
canonical 0001-com-ubuntu-server-jammy 22_04-lts latest