1
0
mirror of https://github.com/systemd/systemd synced 2026-04-03 13:44:55 +02:00

Compare commits

...

8 Commits

Author SHA1 Message Date
Yu Watanabe
7e6abd25f4
Merge pull request #21200 from yuwata/sd-dhcp6-client-server-address
sd-dhcp6-client: introduce sd_dhcp6_lease_get_server_address()
2021-11-01 21:04:48 +09:00
Yu Watanabe
3b73ebc08a
Merge pull request #21199 from yuwata/sd-dhcp6-client-trivial-cleanups
sd-dhcp6-client: trivial cleanups
2021-11-01 21:04:05 +09:00
Yu Watanabe
c30f9aafed network: save server address to DHCPv6 addresses
The server address will be used in later commits.
2021-11-01 18:22:55 +09:00
Yu Watanabe
ef4edc1546 sd-dhcp6-client: introduce sd_dhcp6_lease_get_server_address() 2021-11-01 18:22:49 +09:00
Yu Watanabe
2c269a4e2a sd-lldp-tx: drop unused and useless function
sd-lldp-tx does not call any callback function. So, the function is
mostly useless.
2021-11-01 08:57:17 +00:00
Yu Watanabe
7f402e5b7b sd-dhcp6: drop unused functions 2021-11-01 08:56:42 +00:00
Yu Watanabe
01b4e90f32 sd-dhcp6-client: request IA_PD by default
For consistency with 0f5ef9b62a8f454208db69f3219c7484f87a068a.
2021-11-01 10:02:50 +09:00
Yu Watanabe
5e82251913 sd-dhcp6-client: always set suitable ARP type
Also, drops unnecessary comparisons.
2021-11-01 09:51:52 +09:00
7 changed files with 54 additions and 39 deletions

View File

@ -19,6 +19,7 @@ struct sd_dhcp6_lease {
uint8_t preference; uint8_t preference;
bool rapid_commit; bool rapid_commit;
triple_timestamp timestamp; triple_timestamp timestamp;
struct in6_addr server_address;
DHCP6IA ia; DHCP6IA ia;
DHCP6IA pd; DHCP6IA pd;
@ -48,9 +49,6 @@ int dhcp6_lease_get_preference(sd_dhcp6_lease *lease, uint8_t *preference);
int dhcp6_lease_set_rapid_commit(sd_dhcp6_lease *lease); int dhcp6_lease_set_rapid_commit(sd_dhcp6_lease *lease);
int dhcp6_lease_get_rapid_commit(sd_dhcp6_lease *lease, bool *rapid_commit); int dhcp6_lease_get_rapid_commit(sd_dhcp6_lease *lease, bool *rapid_commit);
int dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid);
int dhcp6_lease_get_pd_iaid(sd_dhcp6_lease *lease, be32_t *iaid);
int dhcp6_lease_add_dns(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen); int dhcp6_lease_add_dns(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
int dhcp6_lease_add_domains(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen); int dhcp6_lease_add_domains(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
int dhcp6_lease_add_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen); int dhcp6_lease_add_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);

View File

@ -251,10 +251,6 @@ int sd_dhcp6_client_set_mac(
return 0; return 0;
} }
if (client->mac_addr_len == addr_len &&
memcmp(&client->mac_addr, addr, addr_len) == 0)
return 0;
memcpy(&client->mac_addr, addr, addr_len); memcpy(&client->mac_addr, addr, addr_len);
client->mac_addr_len = addr_len; client->mac_addr_len = addr_len;
client->arp_type = arp_type; client->arp_type = arp_type;
@ -1342,7 +1338,13 @@ static int client_parse_message(
return 0; return 0;
} }
static int client_receive_reply(sd_dhcp6_client *client, DHCP6Message *reply, size_t len, const triple_timestamp *t) { static int client_receive_reply(
sd_dhcp6_client *client,
DHCP6Message *reply,
size_t len,
const triple_timestamp *t,
const struct in6_addr *server_address) {
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL; _cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
bool rapid_commit; bool rapid_commit;
int r; int r;
@ -1359,6 +1361,8 @@ static int client_receive_reply(sd_dhcp6_client *client, DHCP6Message *reply, si
return -ENOMEM; return -ENOMEM;
lease->timestamp = *t; lease->timestamp = *t;
if (server_address)
lease->server_address = *server_address;
r = client_parse_message(client, reply, len, lease); r = client_parse_message(client, reply, len, lease);
if (r < 0) if (r < 0)
@ -1379,7 +1383,13 @@ static int client_receive_reply(sd_dhcp6_client *client, DHCP6Message *reply, si
return DHCP6_STATE_BOUND; return DHCP6_STATE_BOUND;
} }
static int client_receive_advertise(sd_dhcp6_client *client, DHCP6Message *advertise, size_t len, const triple_timestamp *t) { static int client_receive_advertise(
sd_dhcp6_client *client,
DHCP6Message *advertise,
size_t len,
const triple_timestamp *t,
const struct in6_addr *server_address) {
_cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL; _cleanup_(sd_dhcp6_lease_unrefp) sd_dhcp6_lease *lease = NULL;
uint8_t pref_advertise = 0, pref_lease = 0; uint8_t pref_advertise = 0, pref_lease = 0;
int r; int r;
@ -1396,6 +1406,8 @@ static int client_receive_advertise(sd_dhcp6_client *client, DHCP6Message *adver
return r; return r;
lease->timestamp = *t; lease->timestamp = *t;
if (server_address)
lease->server_address = *server_address;
r = client_parse_message(client, advertise, len, lease); r = client_parse_message(client, advertise, len, lease);
if (r < 0) if (r < 0)
@ -1430,7 +1442,10 @@ static int client_receive_message(
/* This needs to be initialized with zero. See #20741. */ /* This needs to be initialized with zero. See #20741. */
CMSG_BUFFER_TYPE(CMSG_SPACE_TIMEVAL) control = {}; CMSG_BUFFER_TYPE(CMSG_SPACE_TIMEVAL) control = {};
struct iovec iov; struct iovec iov;
union sockaddr_union sa = {};
struct msghdr msg = { struct msghdr msg = {
.msg_name = &sa.sa,
.msg_namelen = sizeof(sa),
.msg_iov = &iov, .msg_iov = &iov,
.msg_iovlen = 1, .msg_iovlen = 1,
.msg_control = &control, .msg_control = &control,
@ -1439,6 +1454,7 @@ static int client_receive_message(
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
triple_timestamp t = {}; triple_timestamp t = {};
_cleanup_free_ DHCP6Message *message = NULL; _cleanup_free_ DHCP6Message *message = NULL;
struct in6_addr *server_address = NULL;
ssize_t buflen, len; ssize_t buflen, len;
int r = 0; int r = 0;
@ -1474,6 +1490,16 @@ static int client_receive_message(
return 0; return 0;
} }
/* msg_namelen == 0 happens when running the test-suite over a socketpair */
if (msg.msg_namelen > 0) {
if (msg.msg_namelen != sizeof(struct sockaddr_in6) || sa.in6.sin6_family != AF_INET6) {
log_dhcp6_client(client, "Received message from invalid source, ignoring.");
return 0;
}
server_address = &sa.in6.sin6_addr;
}
CMSG_FOREACH(cmsg, &msg) { CMSG_FOREACH(cmsg, &msg) {
if (cmsg->cmsg_level == SOL_SOCKET && if (cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SO_TIMESTAMP && cmsg->cmsg_type == SO_TIMESTAMP &&
@ -1498,7 +1524,7 @@ static int client_receive_message(
switch (client->state) { switch (client->state) {
case DHCP6_STATE_INFORMATION_REQUEST: case DHCP6_STATE_INFORMATION_REQUEST:
r = client_receive_reply(client, message, len, &t); r = client_receive_reply(client, message, len, &t, server_address);
if (r < 0) { if (r < 0) {
log_dhcp6_client_errno(client, r, "Failed to process received reply message, ignoring: %m"); log_dhcp6_client_errno(client, r, "Failed to process received reply message, ignoring: %m");
return 0; return 0;
@ -1511,7 +1537,7 @@ static int client_receive_message(
break; break;
case DHCP6_STATE_SOLICITATION: case DHCP6_STATE_SOLICITATION:
r = client_receive_advertise(client, message, len, &t); r = client_receive_advertise(client, message, len, &t, server_address);
if (r < 0) { if (r < 0) {
log_dhcp6_client_errno(client, r, "Failed to process received advertise message, ignoring: %m"); log_dhcp6_client_errno(client, r, "Failed to process received advertise message, ignoring: %m");
return 0; return 0;
@ -1527,7 +1553,7 @@ static int client_receive_message(
case DHCP6_STATE_RENEW: case DHCP6_STATE_RENEW:
case DHCP6_STATE_REBIND: case DHCP6_STATE_REBIND:
r = client_receive_reply(client, message, len, &t); r = client_receive_reply(client, message, len, &t, server_address);
if (r < 0) { if (r < 0) {
log_dhcp6_client_errno(client, r, "Failed to process received reply message, ignoring: %m"); log_dhcp6_client_errno(client, r, "Failed to process received reply message, ignoring: %m");
return 0; return 0;
@ -1862,7 +1888,7 @@ int sd_dhcp6_client_new(sd_dhcp6_client **ret) {
.ia_na.type = SD_DHCP6_OPTION_IA_NA, .ia_na.type = SD_DHCP6_OPTION_IA_NA,
.ia_pd.type = SD_DHCP6_OPTION_IA_PD, .ia_pd.type = SD_DHCP6_OPTION_IA_PD,
.ifindex = -1, .ifindex = -1,
.request_ia = DHCP6_REQUEST_IA_NA, .request_ia = DHCP6_REQUEST_IA_NA | DHCP6_REQUEST_IA_PD,
.fd = -1, .fd = -1,
.req_opts_len = ELEMENTSOF(default_req_opts), .req_opts_len = ELEMENTSOF(default_req_opts),
.hint_pd_prefix.iapdprefix.lifetime_preferred = (be32_t) -1, .hint_pd_prefix.iapdprefix.lifetime_preferred = (be32_t) -1,

View File

@ -24,6 +24,14 @@ int sd_dhcp6_lease_get_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_
return 0; return 0;
} }
int sd_dhcp6_lease_get_server_address(sd_dhcp6_lease *lease, struct in6_addr *ret) {
assert_return(lease, -EINVAL);
assert_return(ret, -EINVAL);
*ret = lease->server_address;
return 0;
}
int dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire) { int dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire) {
DHCP6Address *addr; DHCP6Address *addr;
uint32_t valid = 0, t; uint32_t valid = 0, t;
@ -130,24 +138,6 @@ int dhcp6_lease_get_rapid_commit(sd_dhcp6_lease *lease, bool *rapid_commit) {
return 0; return 0;
} }
int dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid) {
assert_return(lease, -EINVAL);
assert_return(iaid, -EINVAL);
*iaid = lease->ia.ia_na.id;
return 0;
}
int dhcp6_lease_get_pd_iaid(sd_dhcp6_lease *lease, be32_t *iaid) {
assert_return(lease, -EINVAL);
assert_return(iaid, -EINVAL);
*iaid = lease->pd.ia_pd.id;
return 0;
}
int sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease, struct in6_addr *addr, int sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease, struct in6_addr *addr,
uint32_t *lifetime_preferred, uint32_t *lifetime_preferred,
uint32_t *lifetime_valid) { uint32_t *lifetime_valid) {

View File

@ -514,12 +514,6 @@ int sd_lldp_tx_detach_event(sd_lldp_tx *lldp_tx) {
return 0; return 0;
} }
sd_event* sd_lldp_tx_get_event(sd_lldp_tx *lldp_tx) {
assert_return(lldp_tx, NULL);
return lldp_tx->event;
}
static usec_t lldp_tx_get_delay(sd_lldp_tx *lldp_tx) { static usec_t lldp_tx_get_delay(sd_lldp_tx *lldp_tx) {
assert(lldp_tx); assert(lldp_tx);

View File

@ -1129,6 +1129,7 @@ simple_log:
static int dhcp6_request_address( static int dhcp6_request_address(
Link *link, Link *link,
const struct in6_addr *server_address,
const struct in6_addr *ip6_addr, const struct in6_addr *ip6_addr,
usec_t lifetime_preferred_usec, usec_t lifetime_preferred_usec,
usec_t lifetime_valid_usec) { usec_t lifetime_valid_usec) {
@ -1142,6 +1143,7 @@ static int dhcp6_request_address(
return log_oom(); return log_oom();
addr->source = NETWORK_CONFIG_SOURCE_DHCP6; addr->source = NETWORK_CONFIG_SOURCE_DHCP6;
addr->provider.in6 = *server_address;
addr->family = AF_INET6; addr->family = AF_INET6;
addr->in_addr.in6 = *ip6_addr; addr->in_addr.in6 = *ip6_addr;
addr->flags = IFA_F_NOPREFIXROUTE; addr->flags = IFA_F_NOPREFIXROUTE;
@ -1169,6 +1171,7 @@ static int dhcp6_request_address(
} }
static int dhcp6_address_acquired(Link *link) { static int dhcp6_address_acquired(Link *link) {
struct in6_addr server_address;
usec_t timestamp_usec; usec_t timestamp_usec;
int r; int r;
@ -1179,6 +1182,10 @@ static int dhcp6_address_acquired(Link *link) {
if (!link->network->dhcp6_use_address) if (!link->network->dhcp6_use_address)
return 0; return 0;
r = sd_dhcp6_lease_get_server_address(link->dhcp6_lease, &server_address);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to get server address of DHCPv6 lease: %m");
r = sd_dhcp6_lease_get_timestamp(link->dhcp6_lease, clock_boottime_or_monotonic(), &timestamp_usec); r = sd_dhcp6_lease_get_timestamp(link->dhcp6_lease, clock_boottime_or_monotonic(), &timestamp_usec);
if (r < 0) if (r < 0)
return log_link_warning_errno(link, r, "Failed to get timestamp of DHCPv6 lease: %m"); return log_link_warning_errno(link, r, "Failed to get timestamp of DHCPv6 lease: %m");
@ -1191,7 +1198,7 @@ static int dhcp6_address_acquired(Link *link) {
if (r < 0) if (r < 0)
break; break;
r = dhcp6_request_address(link, &ip6_addr, r = dhcp6_request_address(link, &server_address, &ip6_addr,
usec_add(lifetime_preferred_sec * USEC_PER_SEC, timestamp_usec), usec_add(lifetime_preferred_sec * USEC_PER_SEC, timestamp_usec),
usec_add(lifetime_valid_sec * USEC_PER_SEC, timestamp_usec)); usec_add(lifetime_valid_sec * USEC_PER_SEC, timestamp_usec));
if (r < 0) if (r < 0)

View File

@ -30,6 +30,7 @@ _SD_BEGIN_DECLARATIONS;
typedef struct sd_dhcp6_lease sd_dhcp6_lease; typedef struct sd_dhcp6_lease sd_dhcp6_lease;
int sd_dhcp6_lease_get_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret); int sd_dhcp6_lease_get_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret);
int sd_dhcp6_lease_get_server_address(sd_dhcp6_lease *lease, struct in6_addr *ret);
void sd_dhcp6_lease_reset_address_iter(sd_dhcp6_lease *lease); void sd_dhcp6_lease_reset_address_iter(sd_dhcp6_lease *lease);
int sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease, int sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease,

View File

@ -50,7 +50,6 @@ int sd_lldp_tx_is_running(sd_lldp_tx *lldp_tx);
int sd_lldp_tx_attach_event(sd_lldp_tx *lldp_tx, sd_event *event, int64_t priority); int sd_lldp_tx_attach_event(sd_lldp_tx *lldp_tx, sd_event *event, int64_t priority);
int sd_lldp_tx_detach_event(sd_lldp_tx *lldp_tx); int sd_lldp_tx_detach_event(sd_lldp_tx *lldp_tx);
sd_event *sd_lldp_tx_get_event(sd_lldp_tx *lldp_tx);
int sd_lldp_tx_set_ifindex(sd_lldp_tx *lldp_tx, int ifindex); int sd_lldp_tx_set_ifindex(sd_lldp_tx *lldp_tx, int ifindex);
int sd_lldp_tx_set_ifname(sd_lldp_tx *lldp_tx, const char *ifname); int sd_lldp_tx_set_ifname(sd_lldp_tx *lldp_tx, const char *ifname);