@@ -63,6 +63,8 @@ LOG_MODULE_REGISTER(net_core, CONFIG_NET_CORE_LOG_LEVEL);
63
63
64
64
#include "net_stats.h"
65
65
66
+ static void net_queue_rx (struct net_if * iface , struct net_pkt * pkt );
67
+
66
68
#if defined(CONFIG_NET_NATIVE )
67
69
static inline enum net_verdict process_data (struct net_pkt * pkt )
68
70
{
@@ -77,27 +79,25 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
77
79
if (!pkt -> frags ) {
78
80
NET_DBG ("Corrupted packet (frags %p)" , pkt -> frags );
79
81
net_stats_update_processing_error (net_pkt_iface (pkt ));
80
-
81
82
return NET_DROP ;
82
83
}
83
84
84
85
if (!net_pkt_is_l2_processed (pkt )) {
85
- ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
86
86
net_pkt_set_l2_processed (pkt , true);
87
+ ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
87
88
if (ret != NET_CONTINUE ) {
88
89
if (ret == NET_DROP ) {
89
90
NET_DBG ("Packet %p discarded by L2" , pkt );
90
91
net_stats_update_processing_error (
91
92
net_pkt_iface (pkt ));
92
93
}
93
-
94
94
return ret ;
95
95
}
96
-
97
96
/* L2 has modified the buffer starting point, it is easier
98
97
* to re-initialize the cursor rather than updating it.
99
98
*/
100
99
net_pkt_cursor_init (pkt );
100
+ return NET_CONTINUE ;
101
101
}
102
102
103
103
if (IS_ENABLED (CONFIG_NET_SOCKETS_PACKET_DGRAM ) &&
@@ -128,7 +128,6 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
128
128
} else if (IS_ENABLED (CONFIG_NET_SOCKETS_CAN ) && family == AF_CAN ) {
129
129
return net_canbus_socket_input (pkt );
130
130
}
131
-
132
131
NET_DBG ("Unknown protocol family packet (0x%x)" , family );
133
132
return NET_DROP ;
134
133
}
@@ -137,29 +136,47 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
137
136
138
137
}
139
138
139
+ static void update_priority (struct net_pkt * pkt )
140
+ {
141
+ /* This is just an example.
142
+ * Similar infrastructure with custom application rules like
143
+ * net_pkt_filter could be established
144
+ */
145
+ if (net_pkt_is_l2_processed (pkt )) {
146
+ if (net_pkt_ll_proto_type (pkt ) == NET_ETH_PTYPE_PTP ) {
147
+ net_pkt_set_priority (pkt , NET_PRIORITY_IC );
148
+ }
149
+ }
150
+ }
151
+
152
+ static bool being_processed_by_correct_thread (struct net_pkt * pkt )
153
+ {
154
+ uint8_t prio = net_pkt_priority (pkt );
155
+ uint8_t tc = net_rx_priority2tc (prio );
156
+
157
+ return net_tc_rx_is_current_thread (tc );
158
+ }
159
+
140
160
static void processing_data (struct net_pkt * pkt )
141
161
{
142
- again :
143
- switch (process_data (pkt )) {
144
- case NET_CONTINUE :
145
- if (IS_ENABLED (CONFIG_NET_L2_VIRTUAL )) {
146
- /* If we have a tunneling packet, feed it back
147
- * to the stack in this case.
148
- */
149
- goto again ;
150
- } else {
151
- NET_DBG ("Dropping pkt %p" , pkt );
152
- net_pkt_unref (pkt );
162
+ enum net_verdict verdict = NET_CONTINUE ;
163
+
164
+ do {
165
+ verdict = process_data (pkt );
166
+ if (verdict != NET_CONTINUE ) {
167
+ break ;
153
168
}
154
- break ;
155
- case NET_OK :
156
- NET_DBG ("Consumed pkt %p" , pkt );
157
- break ;
158
- case NET_DROP :
159
- default :
160
- NET_DBG ("Dropping pkt %p" , pkt );
169
+
170
+ update_priority (pkt );
171
+
172
+ if (!being_processed_by_correct_thread (pkt )) {
173
+ net_queue_rx (net_pkt_iface (pkt ), pkt );
174
+ }
175
+
176
+ } while (true);
177
+
178
+ if (verdict != NET_OK ) {
161
179
net_pkt_unref (pkt );
162
- break ;
163
180
}
164
181
}
165
182
0 commit comments