2021-05-06 23:47:09 +03:00
|
|
|
// Copyright (c) Microsoft Corporation
|
|
|
|
// 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 programs.
|
|
|
|
|
|
|
|
// XDP hook. We use "struct xdp_md" for cross-platform compatibility.
|
|
|
|
typedef struct xdp_md
|
|
|
|
{
|
2021-07-07 20:39:59 +03:00
|
|
|
void* data; ///< Pointer to start of packet data.
|
|
|
|
void* data_end; ///< Pointer to end of packet data.
|
|
|
|
uint64_t data_meta; ///< Packet metadata.
|
2021-05-06 23:47:09 +03:00
|
|
|
|
|
|
|
/* size: 12, cachelines: 1, members: 3 */
|
|
|
|
/* last cacheline: 12 bytes */
|
|
|
|
} xdp_md_t;
|
|
|
|
|
|
|
|
typedef enum _xdp_action
|
|
|
|
{
|
2021-06-30 19:22:40 +03:00
|
|
|
XDP_PASS = 1, ///< Allow the packet to pass.
|
|
|
|
XDP_DROP = 2 ///< Drop the packet.
|
2021-05-06 23:47:09 +03:00
|
|
|
} xdp_action_t;
|
|
|
|
|
2021-07-02 00:27:24 +03:00
|
|
|
/**
|
|
|
|
* @brief Handle an incoming packet as early as possible.
|
|
|
|
*
|
|
|
|
* Program type: \ref EBPF_PROGRAM_TYPE_XDP
|
|
|
|
*
|
|
|
|
* @param[in] context Packet metadata.
|
|
|
|
* @retval XDP_PASS Allow the packet to pass.
|
|
|
|
* @retval XDP_DROP Drop the packet.
|
|
|
|
*/
|
2021-07-02 02:21:33 +03:00
|
|
|
typedef xdp_action_t
|
|
|
|
xdp_hook_t(xdp_md_t* context);
|
2021-07-02 00:27:24 +03:00
|
|
|
|
2021-05-06 23:47:09 +03:00
|
|
|
// BIND hook
|
|
|
|
|
|
|
|
typedef enum _bind_operation
|
|
|
|
{
|
2021-06-30 19:22:40 +03:00
|
|
|
BIND_OPERATION_BIND, ///< Entry to bind.
|
|
|
|
BIND_OPERATION_POST_BIND, ///< After port allocation.
|
|
|
|
BIND_OPERATION_UNBIND, ///< Release port.
|
2021-05-06 23:47:09 +03:00
|
|
|
} bind_operation_t;
|
|
|
|
|
2021-07-07 20:39:59 +03:00
|
|
|
typedef struct _bind_md
|
|
|
|
{
|
|
|
|
uint8_t* app_id_start; ///< Pointer to start of App ID.
|
|
|
|
uint8_t* app_id_end; ///< Pointer to end of App ID.
|
|
|
|
uint64_t process_id; ///< Process ID.
|
|
|
|
uint8_t socket_address[16]; ///< Socket address to bind to.
|
|
|
|
uint8_t socket_address_length; ///< Length in bytes of the socket address.
|
|
|
|
bind_operation_t operation; ///< Operation to do.
|
|
|
|
uint8_t protocol; ///< Protocol number (e.g., IPPROTO_TCP).
|
|
|
|
} bind_md_t;
|
|
|
|
|
2021-05-06 23:47:09 +03:00
|
|
|
typedef enum _bind_action
|
|
|
|
{
|
2021-06-30 19:22:40 +03:00
|
|
|
BIND_PERMIT, ///< Permit the bind operation.
|
|
|
|
BIND_DENY, ///< Deny the bind operation.
|
|
|
|
BIND_REDIRECT, ///< Change the bind endpoint.
|
2021-05-06 23:47:09 +03:00
|
|
|
} bind_action_t;
|
2021-07-02 00:27:24 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Handle a socket bind() request.
|
|
|
|
*
|
|
|
|
* Program type: \ref EBPF_PROGRAM_TYPE_BIND
|
|
|
|
*
|
|
|
|
* @param[in] context Socket metadata.
|
|
|
|
* @retval BIND_PERMIT Permit the bind operation.
|
|
|
|
* @retval BIND_DENY Deny the bind operation.
|
|
|
|
* @retval BIND_REDIRECT Change the bind endpoint.
|
|
|
|
*/
|
2021-07-02 02:21:33 +03:00
|
|
|
typedef bind_action_t
|
|
|
|
bind_hook_t(bind_md_t* context);
|