Skip to content
This repository was archived by the owner on May 2, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions eng/pipelines/templates/build-job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ jobs:
- script: sudo gem install fpm
displayName: Install fpm

- ${{ if eq(parameters.osGroup, 'Windows') }}:
- script: |
mkdir src\msquic\artifacts\xdp
xcopy /s /y src\xdp\* src\msquic\artifacts\xdp
displayName: Install xdp

- script: $(_crossBuild) $(_buildScript) $(_buildargs)
displayName: Build binaries

Expand Down
2 changes: 1 addition & 1 deletion src/msquic
Submodule msquic updated 153 files
241 changes: 241 additions & 0 deletions src/xdp/include/afxdp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
//
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
//

#ifndef AFXDP_H
#define AFXDP_H

#include <xdp/hookid.h>

#ifndef XDPAPI
#define XDPAPI __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef union _XSK_BUFFER_ADDRESS {
struct {
UINT64 BaseAddress : 48;
UINT64 Offset : 16;
#pragma warning(suppress:4201) // nonstandard extension used: nameless struct/union
} DUMMYUNIONNAME;
UINT64 AddressAndOffset;
} XSK_BUFFER_ADDRESS;

C_ASSERT(sizeof(XSK_BUFFER_ADDRESS) == sizeof(UINT64));

typedef struct _XSK_BUFFER_DESCRIPTOR {
XSK_BUFFER_ADDRESS Address;
UINT32 Length;
UINT32 Reserved;
} XSK_BUFFER_DESCRIPTOR;

typedef struct _XSK_FRAME_DESCRIPTOR {
XSK_BUFFER_DESCRIPTOR Buffer;
//
// Followed by various descriptor extensions.
//
} XSK_FRAME_DESCRIPTOR;

//
// Ensure frame-unaware apps can treat the frame ring as a buffer ring.
//
C_ASSERT(FIELD_OFFSET(XSK_FRAME_DESCRIPTOR, Buffer) == 0);

typedef enum _XSK_RING_FLAGS {
XSK_RING_FLAG_NONE = 0x0,
XSK_RING_FLAG_ERROR = 0x1,
XSK_RING_FLAG_NEED_POKE = 0x2,
XSK_RING_FLAG_AFFINITY_CHANGED = 0x4,
} XSK_RING_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(XSK_RING_FLAGS);
C_ASSERT(sizeof(XSK_RING_FLAGS) == sizeof(UINT32));

typedef
HRESULT
XSK_CREATE_FN(
_Out_ HANDLE* Socket
);

typedef enum _XSK_BIND_FLAGS {
XSK_BIND_FLAG_NONE = 0x0,
XSK_BIND_FLAG_RX = 0x1,
XSK_BIND_FLAG_TX = 0x2,
XSK_BIND_FLAG_GENERIC = 0x4,
XSK_BIND_FLAG_NATIVE = 0x8,
} XSK_BIND_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(XSK_BIND_FLAGS)
C_ASSERT(sizeof(XSK_BIND_FLAGS) == sizeof(UINT32));

typedef
HRESULT
XSK_BIND_FN(
_In_ HANDLE Socket,
_In_ UINT32 IfIndex,
_In_ UINT32 QueueId,
_In_ XSK_BIND_FLAGS Flags
);

typedef enum _XSK_ACTIVATE_FLAGS {
XSK_ACTIVATE_FLAG_NONE = 0x0,
} XSK_ACTIVATE_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(XSK_ACTIVATE_FLAGS)
C_ASSERT(sizeof(XSK_ACTIVATE_FLAGS) == sizeof(UINT32));

typedef
HRESULT
XSK_ACTIVATE_FN(
_In_ HANDLE Socket,
_In_ XSK_ACTIVATE_FLAGS Flags
);

typedef enum _XSK_NOTIFY_FLAGS {
XSK_NOTIFY_FLAG_NONE = 0x0,
XSK_NOTIFY_FLAG_POKE_RX = 0x1,
XSK_NOTIFY_FLAG_POKE_TX = 0x2,
XSK_NOTIFY_FLAG_WAIT_RX = 0x4,
XSK_NOTIFY_FLAG_WAIT_TX = 0x8,
} XSK_NOTIFY_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(XSK_NOTIFY_FLAGS)
C_ASSERT(sizeof(XSK_NOTIFY_FLAGS) == sizeof(UINT32));

typedef enum _XSK_NOTIFY_RESULT_FLAGS {
XSK_NOTIFY_RESULT_FLAG_NONE = 0x0,
XSK_NOTIFY_RESULT_FLAG_RX_AVAILABLE = 0x1,
XSK_NOTIFY_RESULT_FLAG_TX_COMP_AVAILABLE = 0x2,
} XSK_NOTIFY_RESULT_FLAGS;

DEFINE_ENUM_FLAG_OPERATORS(XSK_NOTIFY_RESULT_FLAGS)
C_ASSERT(sizeof(XSK_NOTIFY_RESULT_FLAGS) == sizeof(UINT32));

typedef
HRESULT
XSK_NOTIFY_SOCKET_FN(
_In_ HANDLE Socket,
_In_ XSK_NOTIFY_FLAGS Flags,
_In_ UINT32 WaitTimeoutMilliseconds,
_Out_ XSK_NOTIFY_RESULT_FLAGS *Result
);

typedef struct _OVERLAPPED OVERLAPPED;

typedef
HRESULT
XSK_NOTIFY_ASYNC_FN(
_In_ HANDLE Socket,
_In_ XSK_NOTIFY_FLAGS Flags,
_Inout_ OVERLAPPED *Overlapped
);

typedef
HRESULT
XSK_GET_NOTIFY_ASYNC_RESULT_FN(
_In_ OVERLAPPED *Overlapped,
_Out_ XSK_NOTIFY_RESULT_FLAGS *Result
);

typedef
HRESULT
XSK_SET_SOCKOPT_FN(
_In_ HANDLE Socket,
_In_ UINT32 OptionName,
_In_reads_bytes_opt_(OptionLength) const VOID *OptionValue,
_In_ UINT32 OptionLength
);

typedef
HRESULT
XSK_GET_SOCKOPT_FN(
_In_ HANDLE Socket,
_In_ UINT32 OptionName,
_Out_writes_bytes_(*OptionLength) VOID *OptionValue,
_Inout_ UINT32 *OptionLength
);

typedef
HRESULT
XSK_IOCTL_FN(
_In_ HANDLE Socket,
_In_ UINT32 OptionName,
_In_reads_bytes_opt_(InputLength) const VOID *InputValue,
_In_ UINT32 InputLength,
_Out_writes_bytes_(*OutputLength) VOID *OutputValue,
_Inout_ UINT32 *OutputLength
);

//
// Socket options
//

#define XSK_SOCKOPT_UMEM_REG 1

typedef struct _XSK_UMEM_REG {
UINT64 TotalSize;
UINT32 ChunkSize;
UINT32 Headroom;
VOID *Address;
} XSK_UMEM_REG;

#define XSK_SOCKOPT_RX_RING_SIZE 2
#define XSK_SOCKOPT_RX_FILL_RING_SIZE 3
#define XSK_SOCKOPT_TX_RING_SIZE 4
#define XSK_SOCKOPT_TX_COMPLETION_RING_SIZE 5

#define XSK_SOCKOPT_RING_INFO 6

typedef struct _XSK_RING_INFO {
BYTE *Ring;
UINT32 DescriptorsOffset;
UINT32 ProducerIndexOffset;
UINT32 ConsumerIndexOffset;
UINT32 FlagsOffset;
UINT32 Size;
UINT32 ElementStride;
UINT32 Reserved;
} XSK_RING_INFO;

typedef struct _XSK_RING_INFO_SET {
XSK_RING_INFO Fill;
XSK_RING_INFO Completion;
XSK_RING_INFO Rx;
XSK_RING_INFO Tx;
} XSK_RING_INFO_SET;

#define XSK_SOCKOPT_STATISTICS 7

typedef struct _XSK_STATISTICS {
UINT64 RxDropped;
UINT64 RxTruncated;
UINT64 RxInvalidDescriptors;
UINT64 TxInvalidDescriptors;
} XSK_STATISTICS;

#define XSK_SOCKOPT_RX_HOOK_ID 8
#define XSK_SOCKOPT_TX_HOOK_ID 9

#define XSK_SOCKOPT_RX_ERROR 10
#define XSK_SOCKOPT_RX_FILL_ERROR 11
#define XSK_SOCKOPT_TX_ERROR 12
#define XSK_SOCKOPT_TX_COMPLETION_ERROR 13

typedef enum _XSK_ERROR {
XSK_NO_ERROR = 0,
XSK_ERROR_INTERFACE_DETACH = 0x80000000,
XSK_ERROR_INVALID_RING = 0xC0000000,
} XSK_ERROR;

#define XSK_SOCKOPT_RX_PROCESSOR_AFFINITY 14
#define XSK_SOCKOPT_TX_PROCESSOR_AFFINITY 15

#ifdef __cplusplus
} // extern "C"
#endif

#endif
105 changes: 105 additions & 0 deletions src/xdp/include/afxdp_experimental.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
//
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
//

//
// This header declares experimental AF_XDP interfaces. All definitions within
// this file are subject to breaking changes, including removal.
//

#ifndef AFXDP_EXPERIMENTAL_H
#define AFXDP_EXPERIMENTAL_H

#ifdef __cplusplus
extern "C" {
#endif

//
// XSK_SOCKOPT_POLL_MODE
//
// Supports: set
// Optval type: XSK_POLL_MODE
// Description: Sets the poll mode of a socket.
//

#define XSK_SOCKOPT_POLL_MODE 1000

typedef enum _XSK_POLL_MODE {
//
// Sets the XSK polling mode to the system default.
//
// Expectation: XSK_RING_FLAG_NEED_POKE varies.
//
XSK_POLL_MODE_DEFAULT,

//
// Sets the XSK polling mode to a kernel busy loop.
//
// Expectation: XSK_RING_FLAG_NEED_POKE is usually FALSE.
//
XSK_POLL_MODE_BUSY,

//
// Sets the XSK polling mode to poll only in the context of XskNotifySocket.
//
// Expectation: XSK_RING_FLAG_NEED_POKE is usually TRUE.
//
XSK_POLL_MODE_SOCKET,
} XSK_POLL_MODE;

//
// XSK_SOCKOPT_TX_FRAME_LAYOUT_EXTENSION
//
// Supports: get
// Optval type: XDP_EXTENSION
// Description: Gets the XDP_FRAME_LAYOUT descriptor extension for the TX frame
// ring. This requires the socket is bound, the TX ring size is
// set, and at least one socket option has enabled the frame layout
// extension.
//
#define XSK_SOCKOPT_TX_FRAME_LAYOUT_EXTENSION 1001

//
// XSK_SOCKOPT_TX_FRAME_CHECKSUM_EXTENSION
//
// Supports: get
// Optval type: XDP_EXTENSION
// Description: Gets the XDP_FRAME_CHECKSUM descriptor extension for the TX
// frame ring. This requires the socket is bound, the TX ring size
// is set, and at least one socket option has enabled the frame
// layout extension.
//
#define XSK_SOCKOPT_TX_FRAME_CHECKSUM_EXTENSION 1002

//
// XSK_SOCKOPT_OFFLOAD_UDP_CHECKSUM_TX
//
// Supports: set
// Optval type: BOOLEAN
// Description: Sets whether UDP checksum transmit offload is enabled. This
// option requires the socket is bound and the TX frame ring size
// is not set. This option enables the XDP_FRAME_LAYOUT and
// XDP_FRAME_CHECKSUM extensions on the TX frame ring.
//
#define XSK_SOCKOPT_OFFLOAD_UDP_CHECKSUM_TX 1003

//
// XSK_SOCKOPT_OFFLOAD_UDP_CHECKSUM_TX_CAPABILITIES
//
// Supports: get
// Optval type: XSK_OFFLOAD_UDP_CHECKSUM_TX_CAPABILITIES
// Description: Returns the UDP checksum transmit offload capabilities. This
// option requires the socket is bound.
//
#define XSK_SOCKOPT_OFFLOAD_UDP_CHECKSUM_TX_CAPABILITIES 1004

typedef struct _XSK_OFFLOAD_UDP_CHECKSUM_TX_CAPABILITIES {
BOOLEAN Supported;
} XSK_OFFLOAD_UDP_CHECKSUM_TX_CAPABILITIES;

#ifdef __cplusplus
} // extern "C"
#endif

#endif
Loading