Skip to content

Commit 979b4cc

Browse files
committed
net: pkt_filter: Filters to modify priority to incoming packets
To enable quality-of-service (QoS) applications, allow filters to modify the priority of an incoming packet. This allows that processing can be done on tc-queue-threads with different priorities. Signed-off-by: Cla Mattia Galliard <[email protected]>
1 parent fd51dde commit 979b4cc

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

include/zephyr/net/net_pkt_filter.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,11 @@ struct npf_test {
8585

8686
/** @brief filter rule structure */
8787
struct npf_rule {
88-
sys_snode_t node; /**< Slist rule list node */
89-
enum net_verdict result; /**< result if all tests pass */
90-
uint32_t nb_tests; /**< number of tests for this rule */
91-
struct npf_test *tests[]; /**< pointers to @ref npf_test instances */
88+
sys_snode_t node; /**< Slist rule list node */
89+
enum net_verdict result; /**< result if all tests pass */
90+
uint8_t priority; /**< priority in case of NET_CONTINUE */
91+
uint32_t nb_tests; /**< number of tests for this rule */
92+
struct npf_test *tests[]; /**< pointers to @ref npf_test instances */
9293
};
9394

9495
/** @brief Default rule list termination for accepting a packet */
@@ -242,6 +243,14 @@ bool npf_remove_all_rules(struct npf_rule_list *rules);
242243
.tests = { FOR_EACH(Z_NPF_TEST_ADDR, (,), __VA_ARGS__) }, \
243244
}
244245

246+
#define NPF_PRIORITY(_name, _priority, ...) \
247+
struct npf_rule _name = { \
248+
.result = NET_CONTINUE, \
249+
.priority = (_priority), \
250+
.nb_tests = NUM_VA_ARGS_LESS_1(__VA_ARGS__) + 1, \
251+
.tests = {FOR_EACH(Z_NPF_TEST_ADDR, (,), __VA_ARGS__)}, \
252+
}
253+
245254
#define Z_NPF_TEST_ADDR(arg) &arg.test
246255

247256
/** @} */

subsys/net/pkt_filter/base.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ static enum net_verdict evaluate(sys_slist_t *rule_head, struct net_pkt *pkt)
114114

115115
SYS_SLIST_FOR_EACH_CONTAINER(rule_head, rule, node) {
116116
if (apply_tests(rule, pkt) == true) {
117+
if (rule->result == NET_CONTINUE) {
118+
net_pkt_set_priority(pkt, rule->priority);
119+
continue;
120+
}
117121
return rule->result;
118122
}
119123
}

0 commit comments

Comments
 (0)