net: pkt: Add net_pkt_get_src_addr()
Introduce net_pkt_get_src_addr() as a helper function to get the source address and port from the packet header. Signed-off-by: Aska Wu <aska.wu@linaro.org>
This commit is contained in:
parent
1eb244cf6c
commit
1a2f24f920
@ -1381,6 +1381,19 @@ void net_pkt_get_info(struct k_mem_slab **rx,
|
||||
struct net_buf_pool **rx_data,
|
||||
struct net_buf_pool **tx_data);
|
||||
|
||||
/**
|
||||
* @brief Get source socket address.
|
||||
*
|
||||
* @param pkt Nework packet
|
||||
* @param addr Source socket address
|
||||
* @param addrlen The length of source socket address
|
||||
* @return 0 on success, <0 otherwise.
|
||||
*/
|
||||
|
||||
int net_pkt_get_src_addr(struct net_pkt *pkt,
|
||||
struct sockaddr *addr,
|
||||
socklen_t addrlen);
|
||||
|
||||
#if defined(CONFIG_NET_DEBUG_NET_PKT)
|
||||
/**
|
||||
* @brief Debug helper to print out the buffer allocations
|
||||
|
||||
@ -1663,6 +1663,61 @@ void net_pkt_get_info(struct k_mem_slab **rx,
|
||||
}
|
||||
}
|
||||
|
||||
int net_pkt_get_src_addr(struct net_pkt *pkt, struct sockaddr *addr,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
enum net_ip_protocol proto;
|
||||
sa_family_t family;
|
||||
|
||||
if (!addr || !pkt) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
family = net_pkt_family(pkt);
|
||||
|
||||
if (IS_ENABLED(CONFIG_NET_IPV6) && family == AF_INET6) {
|
||||
struct sockaddr_in6 *addr6 = net_sin6(addr);
|
||||
|
||||
if (addrlen < sizeof(struct sockaddr_in6)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
net_ipaddr_copy(&addr6->sin6_addr, &NET_IPV6_HDR(pkt)->src);
|
||||
proto = NET_IPV6_HDR(pkt)->nexthdr;
|
||||
|
||||
if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
|
||||
addr6->sin6_port = net_pkt_tcp_data(pkt)->src_port;
|
||||
} else if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
|
||||
addr6->sin6_port = net_pkt_udp_data(pkt)->src_port;
|
||||
} else {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
} else if (IS_ENABLED(CONFIG_NET_IPV4) && family == AF_INET) {
|
||||
struct sockaddr_in *addr4 = net_sin(addr);
|
||||
|
||||
if (addrlen < sizeof(struct sockaddr_in)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
net_ipaddr_copy(&addr4->sin_addr, &NET_IPV4_HDR(pkt)->src);
|
||||
proto = NET_IPV4_HDR(pkt)->proto;
|
||||
|
||||
if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
|
||||
addr4->sin_port = net_pkt_tcp_data(pkt)->src_port;
|
||||
} else if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
|
||||
addr4->sin_port = net_pkt_udp_data(pkt)->src_port;
|
||||
} else {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
} else {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_NET_DEBUG_NET_PKT)
|
||||
void net_pkt_print(void)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user