net: ip: Add helpers for packet socket support

Various defines and helpers for supporting packet sockets.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
Jukka Rissanen 2018-11-09 10:22:26 +02:00
commit 49e6abab26

View file

@ -42,11 +42,13 @@ extern "C" {
#define PF_UNSPEC 0 /* Unspecified. */
#define PF_INET 1 /* IP protocol family version 4. */
#define PF_INET6 2 /* IP protocol family version 6. */
#define PF_PACKET 3 /* Packet family. */
/** Address families. */
#define AF_UNSPEC PF_UNSPEC
#define AF_INET PF_INET
#define AF_INET6 PF_INET6
#define AF_PACKET PF_PACKET
/** Protocol numbers from IANA */
enum net_ip_protocol {
@ -69,6 +71,7 @@ enum net_ip_protocol_secure {
enum net_sock_type {
SOCK_STREAM = 1,
SOCK_DGRAM,
SOCK_RAW
};
#define ntohs(x) sys_be16_to_cpu(x)
@ -130,14 +133,68 @@ struct sockaddr_in_ptr {
struct in_addr *sin_addr; /* IPv4 address */
};
#if defined(CONFIG_NET_IPV4) && !defined(CONFIG_NET_IPV6)
struct sockaddr_ll {
sa_family_t sll_family; /* Always AF_PACKET */
u16_t sll_protocol; /* Physical-layer protocol */
int sll_ifindex; /* Interface number */
u16_t sll_hatype; /* ARP hardware type */
u8_t sll_pkttype; /* Packet type */
u8_t sll_halen; /* Length of address */
u8_t sll_addr[8]; /* Physical-layer address */
};
struct sockaddr_ll_ptr {
sa_family_t sll_family; /* Always AF_PACKET */
u16_t sll_protocol; /* Physical-layer protocol */
int sll_ifindex; /* Interface number */
u16_t sll_hatype; /* ARP hardware type */
u8_t sll_pkttype; /* Packet type */
u8_t sll_halen; /* Length of address */
u8_t *sll_addr; /* Physical-layer address */
};
/* Packet types. */
#define PACKET_HOST 0 /* To us */
#define PACKET_BROADCAST 1 /* To all */
#define PACKET_MULTICAST 2 /* To group */
#define PACKET_OTHERHOST 3 /* To someone else */
#define PACKET_OUTGOING 4 /* Originated by us */
#define PACKET_LOOPBACK 5
#define PACKET_FASTROUTE 6
/* Note: These macros are defined in a specific order.
* The largest sockaddr size is the last one.
*/
#if defined(CONFIG_NET_IPV4)
#undef NET_SOCKADDR_MAX_SIZE
#undef NET_SOCKADDR_PTR_MAX_SIZE
#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in))
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in_ptr))
#else
#endif
#if defined(CONFIG_NET_SOCKETS_PACKET)
#undef NET_SOCKADDR_MAX_SIZE
#undef NET_SOCKADDR_PTR_MAX_SIZE
#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_ll))
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_ll_ptr))
#endif
#if defined(CONFIG_NET_IPV6)
#undef NET_SOCKADDR_MAX_SIZE
#undef NET_SOCKADDR_PTR_MAX_SIZE
#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
#endif
#if !defined(CONFIG_NET_IPV4)
#if !defined(CONFIG_NET_IPV6)
#if !defined(CONFIG_NET_SOCKETS_PACKET)
#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
#endif
#endif
#endif
struct sockaddr {
sa_family_t sa_family;
char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
@ -991,6 +1048,20 @@ struct sockaddr_in_ptr *net_sin_ptr(const struct sockaddr_ptr *addr)
return (struct sockaddr_in_ptr *)addr;
}
/**
* @brief Get sockaddr_ll_ptr from sockaddr_ptr. This is a helper so that
* the code calling this function can be made shorter.
*
* @param addr Socket address
*
* @return Pointer to linklayer socket address
*/
static inline
struct sockaddr_ll_ptr *net_sll_ptr(const struct sockaddr_ptr *addr)
{
return (struct sockaddr_ll_ptr *)addr;
}
/**
* @brief Convert a string to IP address.
*