Summary of systemd modifications for the Anonymity Profiles

Option A

  1. Add UseAnonymityProfile configuration variable:

    src/network/networkd-network-gperf.gperf
    
    DHCP.UseAnonymityProfile, config_parse_bool, 0, offsetof(Network,
    dhcp_use_anonymity_profile)
    
  2. Add dhcp_use_anonymity_profile variable and network_apply_anonymity_profile_if_set function:

    src/network/networkd-network.h
    
    bool dhcp_use_anonymity_profile;
    
    int network_apply_anonymity_profile_if_set(Network *network);
    
  3. Implement function network_apply_anonymity_profile_if_set:

    src/network/networkd-network.c
    
    /* RFC7844*/
    int network_apply_anonymity_profile_if_set(Network *network) {
        if (network->dhcp_use_anonymity_profile) {
                /* RFC7844 3.7
                   SHOULD NOT send the Host Name option */
                network->dhcp_send_hostname = false;
                /* RFC 7844 3:
                   MAY contain the Client Identifier option
                   Section 3.5:
                   clients MUST use client identifiers based solely
                   on the link-layer address */
                network->dhcp_client_identifier = DHCP_CLIENT_ID_MAC;
                /* RFC 7844 3.10:
                   SHOULD NOT use the Vendor Class Identifier option */
                network->dhcp_vendor_class_identifier = NULL;
                /* RFC 7844 3:
                   SHOULD NOT contain any other option. */
                network->dhcp_use_mtu = false;
                network->dhcp_use_routes = false;
    
                network->dhcp_use_timezone = false;
                /* FIXME RFC7844: check if the following options are needed */
                network->dhcp_use_ntp = false;
                network->dhcp_use_dns = false;
                network->dhcp_use_domains = false;
                /* FIXME: check options for ipv6 */
                // network->ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_NO;
        }
        return 0;
    }
    

Unordered parts of code modified/to modify

src/network/networkd-dhcp4.c

if (!link->network->dhcp_use_anonymity_profile) {
  r = sd_dhcp_client_set_request_option_defaults(link->dhcp_client);

src/systemd/sd-dhcp-client.h

int sd_dhcp_client_set_request_option_defaults(
        sd_dhcp_client *client);

src/libsystemd-network/sd-dhcp-client.c

int sd_dhcp_client_set_request_option_defaults(sd_dhcp_client *client) {

// FIXME RFC788: set this here instead of
// sd_dhcp_client_set_request_option_defaults? (defined here and called in networkd-dhcp4.c)
// bool anonymity_profile;

/* RFC2131 section 3.5:
   in its initial DHCPDISCOVER or DHCPREQUEST message, a
   client may provide the server with a list of specific
   parameters the client is interested in. If the client
   includes a list of parameters in a DHCPDISCOVER message,
   it MUST include that list in any subsequent DHCPREQUEST
   messages.
 */
/* RFC7844: parameter request list is not set now by default,
   so it must be checked that there are actually options. */
if(client->req_opts_size > 0) {
        r = dhcp_option_append(

/* FIXME RFC7844: there should not be a REBOOT state */

/* RFC7844 section 3
   SHOULD NOT contain any other option.
   Link->Network->dhcp_use_anonymity_profile is already set here,
   but client struct does not have this field
   The code to set default options for PARAMETER_REQUEST_LIST
   is moved to a function */

src/network/networkd-link.c

r = sd_dhcp_client_start(link->dhcp_client);

src/network/networkd-manager.c

src/libsystemd-network/dhcp-internal.h

src/libsystemd-network/dhcp-packet.c

src/libsystemd-network/dhcp-protocol.h

src/libsystemd-network/test-dhcp-client.c

src/libsystemd-network/test-dhcp-option.c

src/?/sd-dhcp-lease.c