Skip to content

Commit 54dbfe2

Browse files
mrfuchscfriedt
authored andcommitted
net: ethernet: Refactor IPv4 to MAC multicast address conversion
Refactor IPv4 multicast address to MAC multicast address conversion into its own function, so it can be reused by drivers as it is already possible for IPv6 multicast addresses. Signed-off-by: Markus Fuchs <[email protected]>
1 parent 01a01de commit 54dbfe2

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

include/net/ethernet.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,15 @@ const struct net_eth_addr *net_eth_broadcast_addr(void);
681681

682682
/** @endcond */
683683

684+
/**
685+
* @brief Convert IPv4 multicast address to Ethernet address.
686+
*
687+
* @param ipv4_addr IPv4 multicast address
688+
* @param mac_addr Output buffer for Ethernet address
689+
*/
690+
void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr,
691+
struct net_eth_addr *mac_addr);
692+
684693
/**
685694
* @brief Convert IPv6 multicast address to Ethernet address.
686695
*

subsys/net/l2/ethernet/ethernet.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ const struct net_eth_addr *net_eth_broadcast_addr(void)
4545
return &broadcast_eth_addr;
4646
}
4747

48+
void net_eth_ipv4_mcast_to_mac_addr(const struct in_addr *ipv4_addr,
49+
struct net_eth_addr *mac_addr)
50+
{
51+
/* RFC 1112 6.4. Extensions to an Ethernet Local Network Module
52+
* "An IP host group address is mapped to an Ethernet multicast
53+
* address by placing the low-order 23-bits of the IP address into
54+
* the low-order 23 bits of the Ethernet multicast address
55+
* 01-00-5E-00-00-00 (hex)."
56+
*/
57+
mac_addr->addr[0] = 0x01;
58+
mac_addr->addr[1] = 0x00;
59+
mac_addr->addr[2] = 0x5e;
60+
mac_addr->addr[3] = ipv4_addr->s4_addr[1];
61+
mac_addr->addr[4] = ipv4_addr->s4_addr[2];
62+
mac_addr->addr[5] = ipv4_addr->s4_addr[3];
63+
64+
mac_addr->addr[3] &= 0x7f;
65+
}
66+
4867
void net_eth_ipv6_mcast_to_mac_addr(const struct in6_addr *ipv6_addr,
4968
struct net_eth_addr *mac_addr)
5069
{
@@ -348,14 +367,7 @@ static bool ethernet_fill_in_dst_on_ipv4_mcast(struct net_pkt *pkt,
348367
if (net_pkt_family(pkt) == AF_INET &&
349368
net_ipv4_is_addr_mcast(&NET_IPV4_HDR(pkt)->dst)) {
350369
/* Multicast address */
351-
dst->addr[0] = 0x01;
352-
dst->addr[1] = 0x00;
353-
dst->addr[2] = 0x5e;
354-
dst->addr[3] = NET_IPV4_HDR(pkt)->dst.s4_addr[1];
355-
dst->addr[4] = NET_IPV4_HDR(pkt)->dst.s4_addr[2];
356-
dst->addr[5] = NET_IPV4_HDR(pkt)->dst.s4_addr[3];
357-
358-
dst->addr[3] &= 0x7f;
370+
net_eth_ipv4_mcast_to_mac_addr(&NET_IPV4_HDR(pkt)->dst, dst);
359371

360372
return true;
361373
}

0 commit comments

Comments
 (0)