mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 23:35:27 +00:00
netdev: New function netdev_get_ip_by_name().
This is like netdev_get_in4_by_name() but accepts any IP address instead of just an IPv4 address. It will acquire its first user in an upcoming commit. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Mark Michelson <mmichels@redhat.com>
This commit is contained in:
87
lib/netdev.c
87
lib/netdev.c
@@ -1142,39 +1142,74 @@ netdev_set_in4(struct netdev *netdev, struct in_addr addr, struct in_addr mask)
|
|||||||
: EOPNOTSUPP);
|
: EOPNOTSUPP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Obtains ad IPv4 address from device name and save the address in
|
static int
|
||||||
* in4. Returns 0 if successful, otherwise a positive errno value.
|
netdev_get_addresses_by_name(const char *device_name,
|
||||||
*/
|
struct in6_addr **addrsp, int *n_addrsp)
|
||||||
|
{
|
||||||
|
struct netdev *netdev;
|
||||||
|
int error = netdev_open(device_name, NULL, &netdev);
|
||||||
|
if (error) {
|
||||||
|
*addrsp = NULL;
|
||||||
|
*n_addrsp = 0;
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct in6_addr *masks;
|
||||||
|
error = netdev_get_addr_list(netdev, addrsp, &masks, n_addrsp);
|
||||||
|
netdev_close(netdev);
|
||||||
|
free(masks);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Obtains an IPv4 address from 'device_name' and save the address in '*in4'.
|
||||||
|
* Returns 0 if successful, otherwise a positive errno value. */
|
||||||
int
|
int
|
||||||
netdev_get_in4_by_name(const char *device_name, struct in_addr *in4)
|
netdev_get_in4_by_name(const char *device_name, struct in_addr *in4)
|
||||||
{
|
{
|
||||||
struct in6_addr *mask, *addr6;
|
struct in6_addr *addrs;
|
||||||
int err, n_in6, i;
|
int n;
|
||||||
struct netdev *dev;
|
int error = netdev_get_addresses_by_name(device_name, &addrs, &n);
|
||||||
|
|
||||||
err = netdev_open(device_name, NULL, &dev);
|
in4->s_addr = 0;
|
||||||
if (err) {
|
if (!error) {
|
||||||
return err;
|
error = ENOENT;
|
||||||
}
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (IN6_IS_ADDR_V4MAPPED(&addrs[i])) {
|
||||||
err = netdev_get_addr_list(dev, &addr6, &mask, &n_in6);
|
in4->s_addr = in6_addr_get_mapped_ipv4(&addrs[i]);
|
||||||
if (err) {
|
error = 0;
|
||||||
goto out;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n_in6; i++) {
|
|
||||||
if (IN6_IS_ADDR_V4MAPPED(&addr6[i])) {
|
|
||||||
in4->s_addr = in6_addr_get_mapped_ipv4(&addr6[i]);
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = -ENOENT;
|
free(addrs);
|
||||||
out:
|
|
||||||
free(addr6);
|
|
||||||
free(mask);
|
|
||||||
netdev_close(dev);
|
|
||||||
return err;
|
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Obtains an IPv4 or IPv6 address from 'device_name' and save the address in
|
||||||
|
* '*ss', representing IPv4 addressse as v6-mapped. Returns 0 if successful,
|
||||||
|
* otherwise a positive errno value. */
|
||||||
|
int
|
||||||
|
netdev_get_ip_by_name(const char *device_name, struct in6_addr *in6)
|
||||||
|
{
|
||||||
|
struct in6_addr *addrs;
|
||||||
|
int n;
|
||||||
|
int error = netdev_get_addresses_by_name(device_name, &addrs, &n);
|
||||||
|
|
||||||
|
*in6 = in6addr_any;
|
||||||
|
if (!error) {
|
||||||
|
error = ENOENT;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (!in6_is_lla(&addrs[i])) {
|
||||||
|
*in6 = addrs[i];
|
||||||
|
error = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(addrs);
|
||||||
|
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adds 'router' as a default IP gateway for the TCP/IP stack that corresponds
|
/* Adds 'router' as a default IP gateway for the TCP/IP stack that corresponds
|
||||||
|
@@ -282,6 +282,7 @@ void netdev_restore_flags(struct netdev_saved_flags *);
|
|||||||
/* TCP/IP stack interface. */
|
/* TCP/IP stack interface. */
|
||||||
int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask);
|
int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask);
|
||||||
int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4);
|
int netdev_get_in4_by_name(const char *device_name, struct in_addr *in4);
|
||||||
|
int netdev_get_ip_by_name(const char *device_name, struct in6_addr *);
|
||||||
int netdev_get_addr_list(const struct netdev *netdev, struct in6_addr **addr,
|
int netdev_get_addr_list(const struct netdev *netdev, struct in6_addr **addr,
|
||||||
struct in6_addr **mask, int *n_in6);
|
struct in6_addr **mask, int *n_in6);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user