@@ -68,7 +68,10 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
68
68
{
69
69
int ret ;
70
70
71
- net_packet_socket_input (pkt , ETH_P_ALL , SOCK_RAW );
71
+ if (!net_pkt_is_raw_processed (pkt )) {
72
+ net_pkt_set_raw_processed (pkt );
73
+ net_packet_socket_input (pkt , ETH_P_ALL , SOCK_RAW );
74
+ }
72
75
73
76
/* If there is no data, then drop the packet. */
74
77
if (!pkt -> frags ) {
@@ -79,8 +82,8 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
79
82
}
80
83
81
84
if (!net_pkt_is_l2_processed (pkt )) {
82
- ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
83
85
net_pkt_set_l2_processed (pkt , true);
86
+ ret = net_if_recv_data (net_pkt_iface (pkt ), pkt );
84
87
if (ret != NET_CONTINUE ) {
85
88
if (ret == NET_DROP ) {
86
89
NET_DBG ("Packet %p discarded by L2" , pkt );
@@ -90,40 +93,48 @@ static inline enum net_verdict process_data(struct net_pkt *pkt)
90
93
91
94
return ret ;
92
95
}
93
- }
94
96
95
- /* L2 has modified the buffer starting point, it is easier
96
- * to re-initialize the cursor rather than updating it.
97
- */
98
- net_pkt_cursor_init (pkt );
97
+ /* L2 has modified the buffer starting point, it is easier
98
+ * to re-initialize the cursor rather than updating it.
99
+ */
100
+ net_pkt_cursor_init (pkt );
101
+ }
99
102
100
- if (IS_ENABLED (CONFIG_NET_SOCKETS_PACKET_DGRAM )) {
103
+ if (IS_ENABLED (CONFIG_NET_SOCKETS_PACKET_DGRAM ) &&
104
+ !net_pkt_is_dgram_processed (pkt )) {
105
+ net_pkt_set_dgram_processed (pkt );
101
106
net_packet_socket_input (pkt , net_pkt_ll_proto_type (pkt ), SOCK_DGRAM );
102
107
}
103
108
104
- uint8_t family = net_pkt_family (pkt );
109
+ if (net_pkt_is_l3_processed (pkt )) {
110
+ net_pkt_set_l3_processed (pkt );
111
+ uint8_t family = net_pkt_family (pkt );
105
112
106
- if (IS_ENABLED (CONFIG_NET_IP ) && (family == AF_INET || family == AF_INET6 ||
107
- family == AF_UNSPEC || family == AF_PACKET )) {
108
- /* IP version and header length. */
109
- uint8_t vtc_vhl = NET_IPV6_HDR (pkt )-> vtc & 0xf0 ;
113
+ if (IS_ENABLED (CONFIG_NET_IP ) && (family == AF_INET || family == AF_INET6 ||
114
+ family == AF_UNSPEC || family == AF_PACKET )) {
115
+ /* IP version and header length. */
116
+ uint8_t vtc_vhl = NET_IPV6_HDR (pkt )-> vtc & 0xf0 ;
110
117
111
- if (IS_ENABLED (CONFIG_NET_IPV6 ) && vtc_vhl == 0x60 ) {
112
- return net_ipv6_input (pkt );
113
- } else if (IS_ENABLED (CONFIG_NET_IPV4 ) && vtc_vhl == 0x40 ) {
114
- return net_ipv4_input (pkt );
115
- }
118
+ if (IS_ENABLED (CONFIG_NET_IPV6 ) && vtc_vhl == 0x60 ) {
119
+ return net_ipv6_input (pkt );
120
+ } else if (IS_ENABLED (CONFIG_NET_IPV4 ) && vtc_vhl == 0x40 ) {
121
+ return net_ipv4_input (pkt );
122
+ }
116
123
117
- NET_DBG ("Unknown IP family packet (0x%x)" , NET_IPV6_HDR (pkt )-> vtc & 0xf0 );
118
- net_stats_update_ip_errors_protoerr (net_pkt_iface (pkt ));
119
- net_stats_update_ip_errors_vhlerr (net_pkt_iface (pkt ));
120
- return NET_DROP ;
121
- } else if (IS_ENABLED (CONFIG_NET_SOCKETS_CAN ) && family == AF_CAN ) {
122
- return net_canbus_socket_input (pkt );
124
+ NET_DBG ("Unknown IP family packet (0x%x)" , NET_IPV6_HDR (pkt )-> vtc & 0xf0 );
125
+ net_stats_update_ip_errors_protoerr (net_pkt_iface (pkt ));
126
+ net_stats_update_ip_errors_vhlerr (net_pkt_iface (pkt ));
127
+ return NET_DROP ;
128
+ } else if (IS_ENABLED (CONFIG_NET_SOCKETS_CAN ) && family == AF_CAN ) {
129
+ return net_canbus_socket_input (pkt );
130
+ } else {
131
+ NET_DBG ("Unknown protocol family packet (0x%x)" , family );
132
+ return NET_DROP ;
133
+ }
123
134
}
124
135
125
- NET_DBG ("Unknown protocol family packet (0x%x)" , family );
126
136
return NET_DROP ;
137
+
127
138
}
128
139
129
140
static void processing_data (struct net_pkt * pkt )
0 commit comments