net: socket: packet: Add support to SOCK_DGRAM packet sockets
Allow user to create SOCK_DGRAM type AF_PACKET socket. This allows user to send raw IP packets without specifying L2 (like Ethernet) headers. Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
3d8bae814e
commit
2ba4d5c2f0
5 changed files with 109 additions and 24 deletions
|
@ -594,7 +594,28 @@ static int ethernet_send(struct net_if *iface, struct net_pkt *pkt)
|
|||
ptype = htons(NET_ETH_PTYPE_IPV6);
|
||||
} else if (IS_ENABLED(CONFIG_NET_SOCKETS_PACKET) &&
|
||||
net_pkt_family(pkt) == AF_PACKET) {
|
||||
goto send;
|
||||
struct net_context *context = net_pkt_context(pkt);
|
||||
|
||||
if (context && net_context_get_type(context) == SOCK_DGRAM) {
|
||||
struct sockaddr_ll *dst_addr;
|
||||
struct sockaddr_ll_ptr *src_addr;
|
||||
|
||||
/* The destination address is set in remote for this
|
||||
* socket type.
|
||||
*/
|
||||
dst_addr = (struct sockaddr_ll *)&context->remote;
|
||||
src_addr = (struct sockaddr_ll_ptr *)&context->local;
|
||||
|
||||
net_pkt_lladdr_dst(pkt)->addr = dst_addr->sll_addr;
|
||||
net_pkt_lladdr_dst(pkt)->len =
|
||||
sizeof(struct net_eth_addr);
|
||||
net_pkt_lladdr_src(pkt)->addr = src_addr->sll_addr;
|
||||
net_pkt_lladdr_src(pkt)->len =
|
||||
sizeof(struct net_eth_addr);
|
||||
ptype = dst_addr->sll_protocol;
|
||||
} else {
|
||||
goto send;
|
||||
}
|
||||
} else if (IS_ENABLED(CONFIG_NET_GPTP) && net_pkt_is_gptp(pkt)) {
|
||||
ptype = htons(NET_ETH_PTYPE_PTP);
|
||||
} else if (IS_ENABLED(CONFIG_NET_LLDP) && net_pkt_is_lldp(pkt)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue