@@ -71,39 +71,39 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
71
71
if (!net_pkt_is_raw_processed (pkt )) {
72
72
net_pkt_set_raw_processed (pkt , true);
73
73
net_packet_socket_input (pkt , ETH_P_ALL , SOCK_RAW );
74
+ return NET_CONTINUE ;
74
75
}
75
76
76
77
/* If there is no data, then drop the packet. */
77
78
if (!pkt -> frags ) {
78
79
NET_DBG ("Corrupted packet (frags %p)" , pkt -> frags );
79
80
net_stats_update_processing_error (net_pkt_iface (pkt ));
80
-
81
81
return NET_DROP ;
82
82
}
83
83
84
84
if (!net_pkt_is_l2_processed (pkt )) {
85
- ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
86
85
net_pkt_set_l2_processed (pkt , true);
86
+ ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
87
87
if (ret != NET_CONTINUE ) {
88
88
if (ret == NET_DROP ) {
89
89
NET_DBG ("Packet %p discarded by L2" , pkt );
90
90
net_stats_update_processing_error (
91
91
net_pkt_iface (pkt ));
92
92
}
93
-
94
93
return ret ;
95
94
}
96
-
97
95
/* L2 has modified the buffer starting point, it is easier
98
96
* to re-initialize the cursor rather than updating it.
99
97
*/
100
98
net_pkt_cursor_init (pkt );
99
+ return NET_CONTINUE ;
101
100
}
102
101
103
102
if (IS_ENABLED (CONFIG_NET_SOCKETS_PACKET_DGRAM ) &&
104
103
!net_pkt_is_dgram_processed (pkt )) {
105
104
net_pkt_set_dgram_processed (pkt , true);
106
105
net_packet_socket_input (pkt , net_pkt_ll_proto_type (pkt ), SOCK_DGRAM );
106
+ return NET_CONTINUE ;
107
107
}
108
108
109
109
if (net_pkt_is_l3_processed (pkt )) {
@@ -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_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