Skip to content

Commit a230bfd

Browse files
change BPF_SOCK_ADDR_VERDICT_PROCEED to BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT (#4701)
Co-authored-by: Andrew Li <liandrew@microsoft.com>
1 parent bd3cbe7 commit a230bfd

File tree

13 files changed

+59
-52
lines changed

13 files changed

+59
-52
lines changed

include/ebpf_nethooks.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,12 @@ bind_hook_t(bind_md_t* context);
5454
// CGROUP_SOCK_ADDR.
5555
//
5656

57-
#define BPF_SOCK_ADDR_VERDICT_REJECT 0
58-
#define BPF_SOCK_ADDR_VERDICT_PROCEED 1
59-
#define BPF_SOCK_ADDR_VERDICT_PROCEED_HARD 2
57+
typedef enum _ebpf_sock_addr_verdict
58+
{
59+
BPF_SOCK_ADDR_VERDICT_REJECT,
60+
BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT,
61+
BPF_SOCK_ADDR_VERDICT_PROCEED_HARD
62+
} ebpf_sock_addr_verdict_t;
6063

6164
#ifdef _MSC_VER
6265
#pragma warning(push)
@@ -136,12 +139,12 @@ EBPF_HELPER(int, bpf_sock_addr_set_redirect_context, (bpf_sock_addr_t * ctx, voi
136139
*
137140
* @param[in] context \ref bpf_sock_addr_t
138141
* @retval BPF_SOCK_ADDR_VERDICT_REJECT Block the socket operation. Maps to a hard block in WFP.
139-
* @retval BPF_SOCK_ADDR_VERDICT_PROCEED Allow the socket operation. Maps to a soft permit in WFP.
142+
* @retval BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT Allow the socket operation. Maps to a soft permit in WFP.
140143
* @retval BPF_SOCK_ADDR_VERDICT_PROCEED_HARD Allow the socket operation. Maps to a hard permit in WFP.
141144
*
142145
* Any return value other than the ones mentioned above is treated as BPF_SOCK_ADDR_VERDICT_REJECT.
143146
*/
144-
typedef int
147+
typedef ebpf_sock_addr_verdict_t
145148
sock_addr_hook_t(bpf_sock_addr_t* context);
146149

147150
typedef enum _bpf_sock_op_type

netebpfext/net_ebpf_ext_sock_addr.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ _net_ebpf_extension_connection_context_initialize(
989989
_Requires_exclusive_lock_held_(_net_ebpf_ext_sock_addr_contexts.lock) static uint32_t
990990
_net_ebpf_ext_find_and_remove_connection_context_locked(_In_ net_ebpf_extension_connection_context_t* context)
991991
{
992-
uint32_t verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
992+
uint32_t verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
993993
// Check the hash table for the entry.
994994
net_ebpf_extension_connection_context_t* found_context =
995995
(net_ebpf_extension_connection_context_t*)RtlLookupElementGenericTableAvl(
@@ -1518,7 +1518,7 @@ _get_verdict_priority(uint32_t verdict)
15181518
return 3; // Highest priority
15191519
case BPF_SOCK_ADDR_VERDICT_PROCEED_HARD:
15201520
return 2;
1521-
case BPF_SOCK_ADDR_VERDICT_PROCEED:
1521+
case BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT:
15221522
return 1;
15231523
default:
15241524
return 0;
@@ -1631,7 +1631,7 @@ net_ebpf_extension_sock_addr_authorize_recv_accept_classify(
16311631
goto Exit;
16321632
}
16331633

1634-
classify_output->actionType = (result == BPF_SOCK_ADDR_VERDICT_PROCEED) ? FWP_ACTION_PERMIT : FWP_ACTION_BLOCK;
1634+
classify_output->actionType = (result == BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT) ? FWP_ACTION_PERMIT : FWP_ACTION_BLOCK;
16351635
if (classify_output->actionType == FWP_ACTION_BLOCK) {
16361636
classify_output->rights &= ~FWPS_RIGHT_ACTION_WRITE;
16371637
}
@@ -1699,7 +1699,7 @@ net_ebpf_extension_sock_addr_authorize_connection_classify(
16991699
// This is a re-authorization of a connection that was previously authorized by the
17001700
// eBPF program. Permit it.
17011701
// NOTE: Reauthorization is currently not supported for hard permit.
1702-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
1702+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
17031703
goto Exit;
17041704
}
17051705

@@ -1713,7 +1713,7 @@ net_ebpf_extension_sock_addr_authorize_connection_classify(
17131713
"The cgroup_sock_addr eBPF program is not interested in this compartment ID",
17141714
sock_addr_ctx->compartment_id);
17151715

1716-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
1716+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
17171717
goto Exit;
17181718
}
17191719

@@ -1724,7 +1724,7 @@ net_ebpf_extension_sock_addr_authorize_connection_classify(
17241724
// Set action type based on verdict
17251725
// Clear FWPS_RIGHT_ACTION_WRITE for block and hard permit.
17261726
switch (verdict) {
1727-
case BPF_SOCK_ADDR_VERDICT_PROCEED:
1727+
case BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT:
17281728
classify_output->actionType = FWP_ACTION_PERMIT;
17291729
break;
17301730
case BPF_SOCK_ADDR_VERDICT_PROCEED_HARD:
@@ -1914,7 +1914,7 @@ _cache_connection_context_verdict(
19141914
uint32_t verdict,
19151915
uint64_t handle)
19161916
{
1917-
if (verdict != BPF_SOCK_ADDR_VERDICT_PROCEED) {
1917+
if (verdict != BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT) {
19181918
// Create a connection context and add it to list for the AUTH_CONNECT layer callout to enforce the
19191919
// verdict of the program.
19201920
if (verdict == BPF_SOCK_ADDR_VERDICT_PROCEED_HARD) {
@@ -2017,7 +2017,7 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
20172017
NET_EBPF_EXT_TRACELOG_LEVEL_VERBOSE,
20182018
NET_EBPF_EXT_TRACELOG_KEYWORD_SOCK_ADDR,
20192019
"No \"write\" right; exiting.");
2020-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2020+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
20212021
goto Exit;
20222022
}
20232023

@@ -2040,7 +2040,7 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
20402040
NET_EBPF_EXT_TRACELOG_KEYWORD_SOCK_ADDR,
20412041
"net_ebpf_extension_sock_addr_redirect_connection_classify - Client detach detected.",
20422042
STATUS_INVALID_PARAMETER);
2043-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2043+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
20442044
goto Exit;
20452045
}
20462046

@@ -2051,7 +2051,7 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
20512051
// In case of re-authorization, the eBPF programs have already inspected the connection.
20522052
// Skip invoking the program(s) again. In this case the verdict is always to proceed (terminating).
20532053
if (net_ebpf_sock_addr_ctx.flags & FWP_CONDITION_FLAG_IS_REAUTHORIZE) {
2054-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2054+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
20552055
reauthorization = TRUE;
20562056
NET_EBPF_EXT_LOG_MESSAGE_UINT64_UINT64(
20572057
NET_EBPF_EXT_TRACELOG_LEVEL_ERROR,
@@ -2071,7 +2071,7 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
20712071
NET_EBPF_EXT_TRACELOG_KEYWORD_SOCK_ADDR,
20722072
"The cgroup_sock_addr eBPF program is not interested in this compartment ID.",
20732073
sock_addr_ctx->compartment_id);
2074-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2074+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
20752075
goto Exit;
20762076
}
20772077

@@ -2091,15 +2091,15 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
20912091
(uint64_t)sock_addr_ctx->compartment_id);
20922092

20932093
// This connection was previously redirected.
2094-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2094+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
20952095
goto Exit;
20962096
}
20972097

20982098
v4_mapped = (sock_addr_ctx->family == AF_INET6) && IN6_IS_ADDR_V4MAPPED((IN6_ADDR*)sock_addr_ctx->user_ip6);
20992099

21002100
// Check if the eBPF program should be invoked based on the IP address family and the hook attach type.
21012101
if (!_net_ebpf_extension_sock_addr_should_invoke_ebpf_program(filter_context, sock_addr_ctx, v4_mapped)) {
2102-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2102+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
21032103
goto Exit;
21042104
}
21052105
net_ebpf_sock_addr_ctx.v4_mapped = v4_mapped;
@@ -2141,7 +2141,7 @@ net_ebpf_extension_sock_addr_redirect_connection_classify(
21412141

21422142
if (result == EBPF_OBJECT_NOT_FOUND) {
21432143
// No eBPF program is attached to this filter.
2144-
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED;
2144+
verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
21452145
} else if (result != EBPF_SUCCESS) {
21462146
// We failed to invoke at least one program in the chain, block the request.
21472147
verdict = BPF_SOCK_ADDR_VERDICT_REJECT;

tests/connect_redirect/connect_redirect_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ _update_policy_map(
326326

327327
// Insert / delete redirect policy entry in the map.
328328
destination_entry_key_t key = {0};
329-
destination_entry_value_t value = {.verdict = BPF_SOCK_ADDR_VERDICT_PROCEED};
329+
destination_entry_value_t value = {.verdict = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT};
330330

331331
if (_globals.family == AF_INET && dual_stack) {
332332
struct sockaddr_in6* v6_destination = (struct sockaddr_in6*)&destination;

tests/netebpfext_unit/netebpfext_unit.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ netebpfext_unit_invoke_sock_addr_program(
346346

347347
switch (action) {
348348
case SOCK_ADDR_TEST_ACTION_PERMIT_SOFT:
349-
*result = BPF_SOCK_ADDR_VERDICT_PROCEED;
349+
*result = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
350350
break;
351351
case SOCK_ADDR_TEST_ACTION_PERMIT_HARD:
352352
*result = BPF_SOCK_ADDR_VERDICT_PROCEED_HARD;
@@ -362,7 +362,7 @@ netebpfext_unit_invoke_sock_addr_program(
362362
auto first_octet = &sock_addr_context->user_ip6[0];
363363
(*first_octet)++;
364364
}
365-
*result = BPF_SOCK_ADDR_VERDICT_PROCEED;
365+
*result = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
366366
break;
367367
case SOCK_ADDR_TEST_ACTION_FAILURE:
368368
return_result = EBPF_FAILED;

tests/sample/cgroup_count_connect4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ count_tcp_connect4(bpf_sock_addr_t* ctx)
3232
{
3333
int retval = 0;
3434
if (ctx->protocol != IPPROTO_TCP) {
35-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
35+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
3636
goto exit;
3737
}
3838

3939
// IP address, port #s in the context are in network byte order.
4040
if (ctx->user_port != ntohs(remote_port)) {
41-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
41+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
4242
goto exit;
4343
}
4444

tests/sample/cgroup_count_connect6.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ count_tcp_connect6(bpf_sock_addr_t* ctx)
3232
{
3333
int retval = 0;
3434
if (ctx->protocol != IPPROTO_TCP) {
35-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
35+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
3636
goto exit;
3737
}
3838

3939
// IP address, port #s in the context are in network byte order.
4040
if (ctx->user_port != ntohs(remote_port)) {
41-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
41+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
4242
goto exit;
4343
}
4444

tests/sample/cgroup_mt_connect4.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ tcp_mt_connect4(bpf_sock_addr_t* ctx)
2525
{
2626
int retval = 0;
2727
if (ctx->protocol != IPPROTO_TCP) {
28-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
28+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
2929
goto exit;
3030
}
3131

3232
// IP address, port #s in the context are in network byte order.
3333
if (ctx->user_port < htons(remote_port)) {
3434

3535
// Not one of ours, allow.
36-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
36+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
3737
goto exit;
3838
}
3939

@@ -44,15 +44,15 @@ tcp_mt_connect4(bpf_sock_addr_t* ctx)
4444
}
4545

4646
if (!(ntohs(ctx->user_port) % 2)) {
47-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
47+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
4848
goto exit;
4949
}
5050

5151
// For all other port values, redirect the port to some arbitrary value.
5252
// REDIRECT uses the same return value as PROCEED except it updates the IP
5353
// address and/or port as required. (We only update the port here.)
5454
ctx->user_port += htons(redirect_offset);
55-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
55+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
5656

5757
exit:
5858
return retval;

tests/sample/cgroup_mt_connect6.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ tcp_mt_connect6(bpf_sock_addr_t* ctx)
2525
{
2626
int retval = 0;
2727
if (ctx->protocol != IPPROTO_TCP) {
28-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
28+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
2929
goto exit;
3030
}
3131

3232
// IP address, port #s in the context are in network byte order.
3333
if (ctx->user_port < htons(remote_port)) {
3434

3535
// Not one of ours, allow.
36-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
36+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
3737
goto exit;
3838
}
3939

@@ -44,15 +44,15 @@ tcp_mt_connect6(bpf_sock_addr_t* ctx)
4444
}
4545

4646
if (!(ntohs(ctx->user_port) % 2)) {
47-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
47+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
4848
goto exit;
4949
}
5050

5151
// For all other port values, redirect the port to some arbitrary value.
5252
// REDIRECT uses the same return value as PROCEED except it also updates the IP address and/or port as required.
5353
// (We only update the port here.)
5454
ctx->user_port += htons(redirect_offset);
55-
retval = BPF_SOCK_ADDR_VERDICT_PROCEED;
55+
retval = BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
5656

5757
exit:
5858
return retval;

tests/sample/cgroup_sock_addr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ authorize_v4(bpf_sock_addr_t* ctx, void* connection_policy_map)
5959

6060
verdict = bpf_map_lookup_elem(connection_policy_map, &tuple_key);
6161

62-
return (verdict != NULL) ? *verdict : BPF_SOCK_ADDR_VERDICT_PROCEED;
62+
return (verdict != NULL) ? *verdict : BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
6363
}
6464

6565
__inline int
@@ -75,7 +75,7 @@ authorize_v6(bpf_sock_addr_t* ctx, void* connection_policy_map)
7575

7676
verdict = bpf_map_lookup_elem(connection_policy_map, &tuple_key);
7777

78-
return (verdict != NULL) ? *verdict : BPF_SOCK_ADDR_VERDICT_PROCEED;
78+
return (verdict != NULL) ? *verdict : BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
7979
}
8080

8181
SEC("cgroup/connect4")

tests/sample/process_start_key.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ get_start_key(bpf_sock_addr_t* ctx)
2929
uint32_t key = 0;
3030
bpf_map_update_elem(&process_start_key_map, &key, &v, 0);
3131

32-
return BPF_SOCK_ADDR_VERDICT_PROCEED;
32+
return BPF_SOCK_ADDR_VERDICT_PROCEED_SOFT;
3333
}
3434

3535
SEC("cgroup/connect4")

0 commit comments

Comments
 (0)