1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "netdev-util.h"
4 #include "networkd-address.h"
5 #include "networkd-link.h"
6 #include "string-table.h"
8 static const char * const netdev_local_address_type_table
[_NETDEV_LOCAL_ADDRESS_TYPE_MAX
] = {
9 [NETDEV_LOCAL_ADDRESS_IPV4LL
] = "ipv4_link_local",
10 [NETDEV_LOCAL_ADDRESS_IPV6LL
] = "ipv6_link_local",
11 [NETDEV_LOCAL_ADDRESS_DHCP4
] = "dhcp4",
12 [NETDEV_LOCAL_ADDRESS_DHCP6
] = "dhcp6",
13 [NETDEV_LOCAL_ADDRESS_SLAAC
] = "slaac",
16 DEFINE_STRING_TABLE_LOOKUP(netdev_local_address_type
, NetDevLocalAddressType
);
18 int link_get_local_address(
20 NetDevLocalAddressType type
,
23 union in_addr_union
*ret_address
) {
30 case NETDEV_LOCAL_ADDRESS_IPV4LL
:
31 assert(IN_SET(family
, AF_UNSPEC
, AF_INET
));
34 case NETDEV_LOCAL_ADDRESS_IPV6LL
:
35 assert(IN_SET(family
, AF_UNSPEC
, AF_INET6
));
38 case NETDEV_LOCAL_ADDRESS_DHCP4
:
39 assert(IN_SET(family
, AF_UNSPEC
, AF_INET
));
42 case NETDEV_LOCAL_ADDRESS_DHCP6
:
43 assert(IN_SET(family
, AF_UNSPEC
, AF_INET6
));
46 case NETDEV_LOCAL_ADDRESS_SLAAC
:
47 assert(IN_SET(family
, AF_UNSPEC
, AF_INET6
));
54 SET_FOREACH(a
, link
->addresses
) {
55 if (!address_exists(a
))
58 if (a
->family
!= family
)
61 if (in_addr_is_set(a
->family
, &a
->in_addr_peer
))
65 case NETDEV_LOCAL_ADDRESS_IPV4LL
:
66 if (a
->source
!= NETWORK_CONFIG_SOURCE_IPV4LL
)
69 case NETDEV_LOCAL_ADDRESS_IPV6LL
:
70 if (!in6_addr_is_link_local(&a
->in_addr
.in6
))
73 case NETDEV_LOCAL_ADDRESS_DHCP4
:
74 if (a
->source
!= NETWORK_CONFIG_SOURCE_DHCP4
)
77 case NETDEV_LOCAL_ADDRESS_DHCP6
:
78 if (a
->source
!= NETWORK_CONFIG_SOURCE_DHCP6
)
81 case NETDEV_LOCAL_ADDRESS_SLAAC
:
82 if (a
->source
!= NETWORK_CONFIG_SOURCE_NDISC
)
90 *ret_family
= a
->family
;
92 *ret_address
= a
->in_addr
;