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:
Aska Wu 2017-08-09 12:43:24 +08:00 committed by Jukka Rissanen
parent 1eb244cf6c
commit 1a2f24f920
2 changed files with 68 additions and 0 deletions

View File

@ -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

View File

@ -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)
{