static int dhcp4_update_address(Link *link, struct in_addr *address, struct in_addr *netmask, uint32_t lifetime) { _cleanup_address_free_ Address *addr = NULL; unsigned prefixlen; int r; assert(address); assert(netmask); assert(lifetime); prefixlen = in_addr_netmask_to_prefixlen(netmask); r = address_new_dynamic(&addr); if (r < 0) return r; addr->family = AF_INET; addr->in_addr.in.s_addr = address->s_addr; addr->cinfo.ifa_prefered = lifetime; addr->cinfo.ifa_valid = lifetime; addr->prefixlen = prefixlen; addr->broadcast.s_addr = address->s_addr | ~netmask->s_addr; /* use update rather than configure so that we will update the * lifetime of an existing address if it has already been configured */ r = address_update(addr, link, &dhcp4_address_handler); if (r < 0) return r; return 0; }
static int dhcp6_address_update(Link *link, struct in6_addr *ip6_addr, uint8_t prefixlen, uint32_t lifetime_preferred, uint32_t lifetime_valid) { int r; _cleanup_address_free_ Address *addr = NULL; r = address_new_dynamic(&addr); if (r < 0) return r; addr->family = AF_INET6; memcpy(&addr->in_addr.in6, ip6_addr, sizeof(*ip6_addr)); addr->flags = IFA_F_NOPREFIXROUTE; addr->prefixlen = prefixlen; addr->cinfo.ifa_prefered = lifetime_preferred; addr->cinfo.ifa_valid = lifetime_valid; log_link_struct(link, LOG_INFO, "MESSAGE=%-*s: DHCPv6 address "SD_ICMP6_ADDRESS_FORMAT_STR"/%d timeout preferred %d valid %d", IFNAMSIZ, link->ifname, SD_ICMP6_ADDRESS_FORMAT_VAL(addr->in_addr.in6), addr->prefixlen, lifetime_preferred, lifetime_valid, NULL); r = address_update(addr, link, dhcp6_address_handler); if (r < 0) log_link_warning(link, "Could not assign DHCPv6 address: %s", strerror(-r)); return r; }