Skip to content

Commit 1f72b1f

Browse files
Lukasz Majewskijukkar
authored andcommitted
net: Exclude code responsible for handling raw sockets processing
The new function - namely conn_raw_socket(); has been introduced to handle raw sockets processing. Its code, up till now, only was executed when IS_ENABLED(CONFIG_NET_SOCKETS_PACKET) was defined. After this change it can be reused when one would like to handle raw sockets also when CONFIG_NET_{UDP|TCP} are enabled. Signed-off-by: Lukasz Majewski <[email protected]>
1 parent 4987c7b commit 1f72b1f

File tree

1 file changed

+46
-30
lines changed

1 file changed

+46
-30
lines changed

subsys/net/ip/connection.c

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,45 @@ static bool conn_are_end_points_valid(struct net_pkt *pkt,
505505
return !(my_src_addr && (src_port == dst_port));
506506
}
507507

508+
static enum net_verdict conn_raw_socket(struct net_pkt *pkt,
509+
struct net_conn *conn)
510+
{
511+
if (conn->flags & NET_CONN_LOCAL_ADDR_SET) {
512+
struct net_if *pkt_iface = net_pkt_iface(pkt);
513+
uint8_t proto = ETH_P_ALL;
514+
struct sockaddr_ll *local;
515+
struct net_pkt *raw_pkt;
516+
517+
local = (struct sockaddr_ll *)&conn->local_addr;
518+
519+
if (local->sll_ifindex !=
520+
net_if_get_by_iface(pkt_iface)) {
521+
return NET_CONTINUE;
522+
}
523+
524+
NET_DBG("[%p] raw match found cb %p ud %p", conn,
525+
conn->cb, conn->user_data);
526+
527+
raw_pkt = net_pkt_clone(pkt, CLONE_TIMEOUT);
528+
if (!raw_pkt) {
529+
net_stats_update_per_proto_drop(pkt_iface, proto);
530+
return NET_DROP;
531+
}
532+
533+
if (conn->cb(conn, raw_pkt, NULL, NULL, conn->user_data)
534+
== NET_DROP) {
535+
net_stats_update_per_proto_drop(pkt_iface, proto);
536+
net_pkt_unref(raw_pkt);
537+
} else {
538+
net_stats_update_per_proto_recv(pkt_iface, proto);
539+
}
540+
541+
return NET_OK;
542+
}
543+
544+
return NET_CONTINUE;
545+
}
546+
508547
enum net_verdict net_conn_input(struct net_pkt *pkt,
509548
union net_ip_header *ip_hdr,
510549
uint8_t proto,
@@ -517,6 +556,7 @@ enum net_verdict net_conn_input(struct net_pkt *pkt,
517556
bool raw_pkt_delivered = false;
518557
int16_t best_rank = -1;
519558
struct net_conn *conn;
559+
enum net_verdict ret;
520560
uint16_t src_port;
521561
uint16_t dst_port;
522562

@@ -681,36 +721,12 @@ enum net_verdict net_conn_input(struct net_pkt *pkt,
681721
mcast_pkt_delivered = true;
682722
}
683723
} else if (IS_ENABLED(CONFIG_NET_SOCKETS_PACKET)) {
684-
if (conn->flags & NET_CONN_LOCAL_ADDR_SET) {
685-
struct sockaddr_ll *local;
686-
struct net_pkt *raw_pkt;
687-
688-
local = (struct sockaddr_ll *)&conn->local_addr;
689-
690-
if (local->sll_ifindex !=
691-
net_if_get_by_iface(net_pkt_iface(pkt))) {
692-
continue;
693-
}
694-
695-
NET_DBG("[%p] raw match found cb %p ud %p",
696-
conn, conn->cb, conn->user_data);
697-
698-
raw_pkt = net_pkt_clone(pkt, CLONE_TIMEOUT);
699-
if (!raw_pkt) {
700-
goto drop;
701-
}
702-
703-
if (conn->cb(conn, raw_pkt, ip_hdr,
704-
proto_hdr, conn->user_data) ==
705-
NET_DROP) {
706-
net_stats_update_per_proto_drop(
707-
pkt_iface, proto);
708-
net_pkt_unref(raw_pkt);
709-
} else {
710-
net_stats_update_per_proto_recv(
711-
pkt_iface, proto);
712-
}
713-
724+
ret = conn_raw_socket(pkt, conn);
725+
if (ret == NET_DROP) {
726+
goto drop;
727+
} else if (ret == NET_CONTINUE) {
728+
continue;
729+
} else if (ret == NET_OK) {
714730
raw_pkt_delivered = true;
715731
}
716732
} else if (IS_ENABLED(CONFIG_NET_SOCKETS_CAN)) {

0 commit comments

Comments
 (0)