Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */
2 : : /*
3 : : * Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
4 : : */
5 : :
6 : : #include "bpfilter/verdict.h"
7 : :
8 : : #include <errno.h>
9 : : #include <stddef.h>
10 : :
11 : : #include "bpfilter/helper.h"
12 : : #include "bpfilter/logger.h"
13 : :
14 : : static const char *_bf_redirect_dir_strs[] = {
15 : : [BF_REDIRECT_INGRESS] = "in",
16 : : [BF_REDIRECT_EGRESS] = "out",
17 : : };
18 : : static_assert_enum_mapping(_bf_redirect_dir_strs, _BF_REDIRECT_DIR_MAX);
19 : :
20 : 6 : const char *bf_redirect_dir_to_str(enum bf_redirect_dir dir)
21 : : {
22 [ + + ]: 6 : if (dir < 0 || dir >= _BF_REDIRECT_DIR_MAX)
23 : : return "<bf_redirect_dir unknown>";
24 : :
25 : 4 : return _bf_redirect_dir_strs[dir];
26 : : }
27 : :
28 : 17 : int bf_redirect_dir_from_str(const char *str, enum bf_redirect_dir *dir)
29 : : {
30 : : assert(dir);
31 : :
32 [ + + ]: 31 : for (size_t i = 0; i < _BF_REDIRECT_DIR_MAX; ++i) {
33 [ + + ]: 28 : if (bf_streq(_bf_redirect_dir_strs[i], str)) {
34 : 14 : *dir = i;
35 : 14 : return 0;
36 : : }
37 : : }
38 : :
39 : : return -EINVAL;
40 : : }
41 : :
42 : : static const char *_bf_verdict_strs[] = {
43 : : [BF_VERDICT_ACCEPT] = "ACCEPT", [BF_VERDICT_DROP] = "DROP",
44 : : [BF_VERDICT_REDIRECT] = "REDIRECT", [BF_VERDICT_CONTINUE] = "CONTINUE",
45 : : [BF_VERDICT_NEXT] = "NEXT",
46 : : };
47 : : static_assert_enum_mapping(_bf_verdict_strs, _BF_VERDICT_MAX);
48 : :
49 : 63 : const char *bf_verdict_to_str(enum bf_verdict verdict)
50 : : {
51 [ + + ]: 63 : if (verdict < 0 || verdict >= _BF_VERDICT_MAX)
52 : : return "<bf_verdict unknown>";
53 : :
54 : 61 : return _bf_verdict_strs[verdict];
55 : : }
56 : :
57 : 2101 : int bf_verdict_from_str(const char *str, enum bf_verdict *verdict)
58 : : {
59 : : assert(verdict);
60 : :
61 [ + + ]: 2843 : for (size_t i = 0; i < _BF_VERDICT_MAX; ++i) {
62 [ + + ]: 2840 : if (bf_streq(_bf_verdict_strs[i], str)) {
63 : 2098 : *verdict = i;
64 : 2098 : return 0;
65 : : }
66 : : }
67 : :
68 : : return -EINVAL;
69 : : }
70 : :
71 : 4996 : bool bf_verdict_is_valid_policy(enum bf_verdict verdict)
72 : : {
73 [ + + ]: 4996 : switch (verdict) {
74 : : case BF_VERDICT_ACCEPT:
75 : : case BF_VERDICT_DROP:
76 : : case BF_VERDICT_NEXT:
77 : : return true;
78 : 6 : default:
79 : 6 : return false;
80 : : }
81 : : }
|