Repository: microsoft/ebpf-for-windows (C)

Issue:
XDP header declarations belong in XDP-for-Windows repo, not eBPF-for-Windows
### Describe the bug

The ebpf_nethooks.h header file defines XDP structs hooks, but those should be defined at https://github.com/microsoft/xdp-for-windows/

```
typedef struct xdp_md_
{
    void* data;               ///< Pointer to start of packet data.
    void* data_end;           ///< Pointer to end of packet data.
    uint64_t data_meta;       ///< Packet metadata.
    uint32_t ingress_ifindex; ///< Ingress interface index.

    /* size: 26, cachelines: 1, members: 4 */
    /* last cacheline: 26 bytes */
} xdp_md_t;

typedef enum _xdp_action
{
    XDP_PASS = 1, ///< Allow the packet to pass.
    XDP_DROP,     ///< Drop the packet.
    XDP_TX        ///< Bounce the received packet back out the same NIC it arrived on.
} xdp_action_t;

/**
 * @brief Handle an incoming packet as early as possible.
 *
 * Program type: \ref EBPF_PROGRAM_TYPE_XDP_TEST
 *
 * @param[in] context Packet metadata.
 * @retval XDP_PASS Allow the packet to pass.
 * @retval XDP_DROP Drop the packet.
 * @retval XDP_TX Bounce the received packet back out the same NIC it arrived on.
 */
typedef xdp_action_t
xdp_hook_t(xdp_md_t* context);

// XDP_TEST helper functions.
#define XDP_EXT_HELPER_FN_BASE 0xFFFF

#ifndef __doxygen
#define EBPF_HELPER(return_type, name, args) typedef return_type(*const name##_t) args
#endif

typedef enum
{
    BPF_FUNC_xdp_adjust_head = XDP_EXT_HELPER_FN_BASE + 1,
} ebpf_nethook_helper_id_t;

/**
 * @brief Adjust XDP_TEST context data pointer.
 *
 * @param[in] ctx XDP_TEST context.
 * @param[in] delta Number of bytes to move the data pointer by.
 *
 * @retval 0 The operation was successful.
 * @retval <0 A failure occurred.
 */
EBPF_HELPER(int, bpf_xdp_adjust_head, (xdp_md_t * ctx, int delta));
#ifndef __doxygen
#define bpf_xdp_adjust_head ((bpf_xdp_adjust_head_t)BPF_FUNC_xdp_adjust_head)
#endif
```

These should all be removed or mangled such that they are clearly for testing only.

### OS information

N/A.

### Steps taken to reproduce bug

Include ebpf_nethooks.h from the eBPF repo, and find `xdp_md_t` is already predefined, along with colliding XDP helper functions.

### Expected behavior

eBPF should not define structs or helpers implemented in external extensions.

### Actual outcome

eBPF defines XDP structs and helpers implemented in external extensions.

### Additional details

_No response_


Discussion: @mtfriesen I am assigning this bug to you for now. Please let me know if you want this to be re-assigned.

If you fix this issue, then please make sure that xdp-test prog-type is not broken, by making a copy of xdp_md_test_t struct and update all the sample code.
@shankarseal please reassign - I will make the corresponding changes in the XDP repo. Thanks!
Also fix the documentation, with the new changes in https://github.com/microsoft/ebpf-for-windows/blob/main/docs/tutorial.md

If you prefer, I can make the changes.



Fix (patch):
diff --git a/docs/tutorial.md b/docs/tutorial.md
index dc9089a6bb..1606cd91ed 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -491,7 +491,7 @@ structure which contains an arbitrary amount of data.  (Tail calls to
 programs can have more than one argument, but hooks put all the info in a
 hook-specific context structure passed as one argument.)
 
-The "xdp_test" hook point has the following prototype in `ebpf_nethooks.h`:
+The "xdp_test" hook point has the following prototype in `net_ebpf_ext_xdp_hooks.h`:
 
 ```c
 typedef struct xdp_md
@@ -517,6 +517,7 @@ A sample eBPF program might look like this:
 ```c
 #include "bpf_helpers.h"
 #include "ebpf_nethooks.h"
+#include "net_ebpf_ext_xdp_hooks.h"
 
 // Put "xdp_test" in the section name to specify XDP_TEST as the hook.
 // The SEC macro below has the same effect as the
diff --git a/include/ebpf_nethooks.h b/include/ebpf_nethooks.h
index 73f5ebdd1e..ce4317974a 100644
--- a/include/ebpf_nethooks.h
+++ b/include/ebpf_nethooks.h
@@ -6,64 +6,10 @@
 // This file contains APIs for hooks and helpers that are
 // exposed by netebpfext.sys for use by eBPF programs.
 
-// XDP_TEST hook.  We use "struct xdp_md" for cross-platform compatibility.
-typedef struct xdp_md_
-{
-    void* data;               ///< Pointer to start of packet data.
-    void* data_end;           ///< Pointer to end of packet data.
-    uint64_t data_meta;       ///< Packet metadata.
-    uint32_t ingress_ifindex; ///< Ingress interface index.
-
-    /* size: 26, cachelines: 1, members: 4 */
-    /* last cacheline: 26 bytes */
-} xdp_md_t;
-
-typedef enum _xdp_action
-{
-    XDP_PASS = 1, ///< Allow the packet to pass.
-    XDP_DROP,     ///< Drop the packet.
-    XDP_TX        ///< Bounce the received packet back out the same NIC it arrived on.
-} xdp_action_t;
-
-/**
- * @brief Handle an incoming packet as early as possible.
- *
- * Program type: \ref EBPF_PROGRAM_TYPE_XDP_TEST
- *
- * @param[in] context Packet metadata.
- * @retval XDP_PASS Allow the packet to pass.
- * @retval XDP_DROP Drop the packet.
- * @retval XDP_TX Bounce the received packet back out the same NIC it arrived on.
- */
-typedef xdp_action_t
-xdp_hook_t(xdp_md_t* context);
-
-// XDP_TEST helper functions.
-#define XDP_EXT_HELPER_FN_BASE 0xFFFF
-
 #ifndef __doxygen
 #define EBPF_HELPER(return_type, name, args) typedef return_type(*const name##_t) args
 #endif
 
-typedef enum
-{
-    BPF_FUNC_xdp_adjust_head = XDP_EXT_HELPER_FN_BASE + 1,
-} ebpf_nethook_helper_id_t;
-
-/**
- * @brief Adjust XDP_TEST context data pointer.
- *
- * @param[in] ctx XDP_TEST context.
- * @param[in] delta Number of bytes to move the data pointer by.
- *
- * @retval 0 The operation was successful.
- * @retval <0 A failure occurred.
- */
-EBPF_HELPER(int, bpf_xdp_adjust_head, (xdp_md_t * ctx, int delta));
-#ifndef __doxygen
-#define bpf_xdp_adjust_head ((bpf_xdp_adjust_head_t)BPF_FUNC_xdp_adjust_head)
-#endif
-
 // BIND hook
 
 typedef enum _bind_operation
diff --git a/netebpfext/net_ebpf_ext_program_info.h b/netebpfext/net_ebpf_ext_program_info.h
index ffc8b69098..541e6723c4 100644
--- a/netebpfext/net_ebpf_ext_program_info.h
+++ b/netebpfext/net_ebpf_ext_program_info.h
@@ -6,6 +6,7 @@
 #include "ebpf_nethooks.h"
 #include "ebpf_program_types.h"
 #include "ebpf_shared_framework.h"
+#include "net_ebpf_ext_xdp_hooks.h"
 
 #define XDP_EXT_HELPER_FUNCTION_START EBPF_MAX_GENERAL_HELPER_FUNCTION
 
diff --git a/netebpfext/net_ebpf_ext_xdp_hooks.h b/netebpfext/net_ebpf_ext_xdp_hooks.h
new file mode 100644
index 0000000000..52482436dd
--- /dev/null
+++ b/netebpfext/net_ebpf_ext_xdp_hooks.h
@@ -0,0 +1,65 @@
+// Copyright (c) eBPF for Windows contributors
+// SPDX-License-Identifier: MIT
+#pragma once
+#include <stdint.h>
+
+// This file contains APIs for hooks and helpers that are
+// exposed by netebpfext.sys for use by eBPF xdp test programs.
+
+// XDP_TEST hook.
+typedef struct xdp_md_
+{
+    void* data;               ///< Pointer to start of packet data.
+    void* data_end;           ///< Pointer to end of packet data.
+    uint64_t data_meta;       ///< Packet metadata.
+    uint32_t ingress_ifindex; ///< Ingress interface index.
+
+    /* size: 26, cachelines: 1, members: 4 */
+    /* last cacheline: 26 bytes */
+} xdp_md_t;
+
+typedef enum _xdp_action
+{
+    XDP_PASS = 1, ///< Allow the packet to pass.
+    XDP_DROP,     ///< Drop the packet.
+    XDP_TX        ///< Bounce the received packet back out the same NIC it arrived on.
+} xdp_action_t;
+
+/**
+ * @brief Handle an incoming packet as early as possible.
+ *
+ * Program type: \ref EBPF_PROGRAM_TYPE_XDP_TEST
+ *
+ * @param[in] context Packet metadata.
+ * @retval XDP_PASS Allow the packet to pass.
+ * @retval XDP_DROP Drop the packet.
+ * @retval XDP_TX Bounce the received packet back out the same NIC it arrived on.
+ */
+typedef xdp_action_t
+xdp_hook_t(xdp_md_t* context);
+
+// XDP_TEST helper functions.
+#define XDP_EXT_HELPER_FN_BASE 0xFFFF
+
+#ifndef __doxygen
+#define EBPF_HELPER(return_type, name, args) typedef return_type(*const name##_t) args
+#endif
+
+typedef enum
+{
+    BPF_FUNC_xdp_adjust_head = XDP_EXT_HELPER_FN_BASE + 1,
+} ebpf_nethook_helper_id_t;
+
+/**
+ * @brief Adjust XDP_TEST context data pointer.
+ *
+ * @param[in] ctx XDP_TEST context.
+ * @param[in] delta Number of bytes to move the data pointer by.
+ *
+ * @retval 0 The operation was successful.
+ * @retval <0 A failure occurred.
+ */
+EBPF_HELPER(int, bpf_xdp_adjust_head, (xdp_md_t * ctx, int delta));
+#ifndef __doxygen
+#define bpf_xdp_adjust_head ((bpf_xdp_adjust_head_t)BPF_FUNC_xdp_adjust_head)
+#endif