static int dhcp4_set_hostname(Link *link) { _cleanup_free_ char *hostname = NULL; const char *hn; int r; assert(link); if (!link->network->dhcp_send_hostname) hn = NULL; else if (link->network->dhcp_hostname) hn = link->network->dhcp_hostname; else { r = gethostname_strict(&hostname); if (r < 0 && r != -ENXIO) /* ENXIO: no hostname set or hostname is "localhost" */ return r; hn = hostname; } r = sd_dhcp_client_set_hostname(link->dhcp_client, hn); if (r == -EINVAL && hostname) /* Ignore error when the machine's hostname is not suitable to send in DHCP packet. */ log_link_warning_errno(link, r, "DHCP4 CLIENT: Failed to set hostname from kernel hostname, ignoring: %m"); else if (r < 0) return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set hostname: %m"); return 0; }
static int dhcp4_set_hostname(Link *link) { _cleanup_free_ char *hostname = NULL; const char *hn; int r; assert(link); if (!link->network->dhcp_send_hostname) hn = NULL; else if (link->network->dhcp_hostname) hn = link->network->dhcp_hostname; else { r = gethostname_strict(&hostname); if (r < 0 && r != -ENXIO) /* ENXIO: no hostname set or hostname is "localhost" */ return r; hn = hostname; } return sd_dhcp_client_set_hostname(link->dhcp_client, hn); }
static int lldp_send_packet( int ifindex, const struct ether_addr *address, const void *packet, size_t packet_size) { union sockaddr_union sa = { .ll.sll_family = AF_PACKET, .ll.sll_protocol = htobe16(ETHERTYPE_LLDP), .ll.sll_ifindex = ifindex, .ll.sll_halen = ETH_ALEN, }; _cleanup_close_ int fd = -1; ssize_t l; assert(ifindex > 0); assert(address); assert(packet || packet_size <= 0); memcpy(sa.ll.sll_addr, address, ETH_ALEN); fd = socket(PF_PACKET, SOCK_RAW|SOCK_CLOEXEC, IPPROTO_RAW); if (fd < 0) return -errno; l = sendto(fd, packet, packet_size, MSG_NOSIGNAL, &sa.sa, sizeof(sa.ll)); if (l < 0) return -errno; if ((size_t) l != packet_size) return -EIO; return 0; } static int link_send_lldp(Link *link) { char machine_id_string[SD_ID128_STRING_MAX]; _cleanup_free_ char *hostname = NULL, *pretty_hostname = NULL; _cleanup_free_ void *packet = NULL; size_t packet_size = 0; sd_id128_t machine_id; uint16_t caps; usec_t ttl; int r; assert(link); if (!link->network || link->network->lldp_emit == LLDP_EMIT_NO) return 0; assert(link->network->lldp_emit < _LLDP_EMIT_MAX); r = sd_id128_get_machine(&machine_id); if (r < 0) return r; (void) gethostname_strict(&hostname); (void) parse_env_file("/etc/machine-info", NEWLINE, "PRETTY_HOSTNAME", &pretty_hostname, NULL); assert_cc(LLDP_TX_INTERVAL_USEC * LLDP_TX_HOLD + 1 <= (UINT16_MAX - 1) * USEC_PER_SEC); ttl = DIV_ROUND_UP(LLDP_TX_INTERVAL_USEC * LLDP_TX_HOLD + 1, USEC_PER_SEC); caps = (link->network && link->network->ip_forward != ADDRESS_FAMILY_NO) ? SD_LLDP_SYSTEM_CAPABILITIES_ROUTER : SD_LLDP_SYSTEM_CAPABILITIES_STATION; r = lldp_make_packet(link->network->lldp_emit, &link->mac, sd_id128_to_string(machine_id, machine_id_string), link->ifname, (uint16_t) ttl, link->network ? link->network->description : NULL, hostname, pretty_hostname, SD_LLDP_SYSTEM_CAPABILITIES_STATION|SD_LLDP_SYSTEM_CAPABILITIES_BRIDGE|SD_LLDP_SYSTEM_CAPABILITIES_ROUTER, caps, &packet, &packet_size); if (r < 0) return r; return lldp_send_packet(link->ifindex, lldp_multicast_addr + link->network->lldp_emit, packet, packet_size); }