net: Add IPv4 addresses to network interface
Allow user to assign IPv4 addresses to a network interface. Change-Id: I77be4ed5eb0231eb12b4ad47cb6076c8f4238124 Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
c3deb96dd7
commit
cf5c1db262
4 changed files with 118 additions and 8 deletions
|
@ -148,6 +148,18 @@ struct net_if {
|
||||||
|
|
||||||
uint8_t hop_limit;
|
uint8_t hop_limit;
|
||||||
#endif /* CONFIG_NET_IPV6 */
|
#endif /* CONFIG_NET_IPV6 */
|
||||||
|
|
||||||
|
#if defined(CONFIG_NET_IPV4)
|
||||||
|
#define NET_IF_MAX_IPV4_ADDR CONFIG_NET_IFACE_UNICAST_IPV4_ADDR_COUNT
|
||||||
|
#define NET_IF_MAX_IPV4_MADDR CONFIG_NET_IFACE_MCAST_IPV4_ADDR_COUNT
|
||||||
|
struct {
|
||||||
|
/** Unicast IP addresses */
|
||||||
|
struct net_if_addr unicast[NET_IF_MAX_IPV4_ADDR];
|
||||||
|
|
||||||
|
/** Multicast IP addresses */
|
||||||
|
struct net_if_mcast_addr mcast[NET_IF_MAX_IPV4_MADDR];
|
||||||
|
} ipv4;
|
||||||
|
#endif /* CONFIG_NET_IPV4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -236,6 +248,26 @@ struct net_if_mcast_addr *net_if_ipv6_maddr_add(struct net_if *iface,
|
||||||
*/
|
*/
|
||||||
struct net_if_mcast_addr *net_if_ipv6_maddr_lookup(struct in6_addr *addr);
|
struct net_if_mcast_addr *net_if_ipv6_maddr_lookup(struct in6_addr *addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if this IPv4 address belongs to one of the interfaces.
|
||||||
|
* @param addr IPv4 address
|
||||||
|
* @return Pointer to interface address, NULL if not found.
|
||||||
|
*/
|
||||||
|
struct net_if_addr *net_if_ipv4_addr_lookup(struct in_addr *addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add a IPv4 address to an interface
|
||||||
|
* @param iface Network interface
|
||||||
|
* @param addr IPv4 address
|
||||||
|
* @param addr_type IPv4 address type
|
||||||
|
* @param vlifetime Validity time for this address
|
||||||
|
* @return Pointer to interface address, NULL if cannot be added
|
||||||
|
*/
|
||||||
|
struct net_if_addr *net_if_ipv4_addr_add(struct net_if *iface,
|
||||||
|
struct in_addr *addr,
|
||||||
|
enum net_addr_type addr_type,
|
||||||
|
uint32_t vlifetime);
|
||||||
|
|
||||||
struct net_if_api {
|
struct net_if_api {
|
||||||
void (*init)(struct net_if *iface);
|
void (*init)(struct net_if *iface);
|
||||||
int (*send)(struct net_if *iface, struct net_buf *buf);
|
int (*send)(struct net_if *iface, struct net_buf *buf);
|
||||||
|
|
|
@ -229,6 +229,12 @@ static inline bool net_is_ipv6_prefix(uint8_t *addr1, uint8_t *addr2,
|
||||||
(addr2[16 - bytes] & ((8 - remain) << 8)));
|
(addr2[16 - bytes] & ((8 - remain) << 8)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern struct net_if_addr *net_if_ipv4_addr_lookup(struct in_addr *addr);
|
||||||
|
static inline bool net_is_my_ipv4_addr(struct in_addr *addr)
|
||||||
|
{
|
||||||
|
return net_if_ipv4_addr_lookup(addr) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,6 +30,21 @@ config NET_IPV6
|
||||||
Enable IPv6 support. This should be selected by default as there is
|
Enable IPv6 support. This should be selected by default as there is
|
||||||
limited set of network bearers provided that support IPv4.
|
limited set of network bearers provided that support IPv4.
|
||||||
|
|
||||||
|
config NET_IFACE_UNICAST_IPV6_ADDR_COUNT
|
||||||
|
int "Max number of unicast IPv6 addresses assigned to network interface"
|
||||||
|
depends on NET_IPV6
|
||||||
|
default 1
|
||||||
|
|
||||||
|
config NET_IFACE_MCAST_IPV6_ADDR_COUNT
|
||||||
|
int "Max number of multicast IPv6 addresses assigned to network interface"
|
||||||
|
depends on NET_IPV6
|
||||||
|
default 1
|
||||||
|
|
||||||
|
config NET_IFACE_IPV6_PREFIX_COUNT
|
||||||
|
int "Max number of IPv6 prefixes assigned to network interface"
|
||||||
|
depends on NET_IPV6
|
||||||
|
default 2
|
||||||
|
|
||||||
config NET_IPV4
|
config NET_IPV4
|
||||||
bool "Enable IPv4"
|
bool "Enable IPv4"
|
||||||
default n
|
default n
|
||||||
|
@ -37,18 +52,16 @@ config NET_IPV4
|
||||||
Enable IPv4 support. If this is enabled then the device is
|
Enable IPv4 support. If this is enabled then the device is
|
||||||
able to send and receive IPv4 network packets.
|
able to send and receive IPv4 network packets.
|
||||||
|
|
||||||
config NET_IFACE_UNICAST_IPV6_ADDR_COUNT
|
config NET_IFACE_UNICAST_IPV4_ADDR_COUNT
|
||||||
int "Max number of unicast IPv6 addresses assigned to network interface"
|
int "Max number of unicast IPv4 addresses assigned to network interface"
|
||||||
|
depends on NET_IPV4
|
||||||
default 1
|
default 1
|
||||||
|
|
||||||
config NET_IFACE_MCAST_IPV6_ADDR_COUNT
|
config NET_IFACE_MCAST_IPV4_ADDR_COUNT
|
||||||
int "Max number of multicast IPv6 addresses assigned to network interface"
|
int "Max number of multicast IPv4 addresses assigned to network interface"
|
||||||
|
depends on NET_IPV4
|
||||||
default 1
|
default 1
|
||||||
|
|
||||||
config NET_IFACE_IPV6_PREFIX_COUNT
|
|
||||||
int "Max number of IPv6 prefixes assigned to network interface"
|
|
||||||
default 2
|
|
||||||
|
|
||||||
config NET_TX_STACK_SIZE
|
config NET_TX_STACK_SIZE
|
||||||
int "TX fiber stack size"
|
int "TX fiber stack size"
|
||||||
default 1024
|
default 1024
|
||||||
|
|
|
@ -189,6 +189,65 @@ struct net_if_mcast_addr *net_if_ipv6_maddr_lookup(struct in6_addr *maddr)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct net_if_addr *net_if_ipv4_addr_lookup(struct in_addr *addr)
|
||||||
|
{
|
||||||
|
struct net_if *iface;
|
||||||
|
|
||||||
|
for (iface = __net_if_start; iface != __net_if_end; iface++) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) {
|
||||||
|
if (!iface->ipv4.unicast[i].is_used ||
|
||||||
|
iface->ipv4.unicast[i].address.family != AF_INET) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr->s4_addr32[0] ==
|
||||||
|
iface->ipv4.unicast[i].address.in_addr.s_addr[0]) {
|
||||||
|
return &iface->ipv4.unicast[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct net_if_addr *net_if_ipv4_addr_add(struct net_if *iface,
|
||||||
|
struct in_addr *addr,
|
||||||
|
enum net_addr_type addr_type,
|
||||||
|
uint32_t vlifetime)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) {
|
||||||
|
if (iface->ipv4.unicast[i].is_used) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
iface->ipv4.unicast[i].is_used = true;
|
||||||
|
iface->ipv4.unicast[i].address.family = AF_INET;
|
||||||
|
iface->ipv4.unicast[i].address.in_addr.s4_addr32[0] =
|
||||||
|
addr->s4_addr32[0];
|
||||||
|
iface->ipv4.unicast[i].addr_type = addr_type;
|
||||||
|
|
||||||
|
if (vlifetime) {
|
||||||
|
iface->ipv4.unicast[i].is_infinite = false;
|
||||||
|
|
||||||
|
/* FIXME - set the timer */
|
||||||
|
} else {
|
||||||
|
iface->ipv4.unicast[i].is_infinite = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
NET_DBG("[%d] interface %p address %s type %s added", i, iface,
|
||||||
|
net_sprint_ipv4_addr(addr),
|
||||||
|
net_addr_type2str(addr_type));
|
||||||
|
|
||||||
|
return &iface->ipv4.unicast[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int net_if_init(void)
|
int net_if_init(void)
|
||||||
{
|
{
|
||||||
struct net_if_api *api;
|
struct net_if_api *api;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue