chiark / gitweb /
units: rebuild /etc/passwd, the udev hwdb and the journal catalog files on boot
[elogind.git] / src / libsystemd-network / dhcp-packet.c
index fba9c46ef226fd9e3cf4d0bdbe2b67879c0e3aac..3e2fb96c27f3054633dc7430381a40f3deb22303 100644 (file)
@@ -38,8 +38,9 @@
 #define DHCP_CLIENT_MIN_OPTIONS_SIZE            312
 
 int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid,
-                      uint8_t type, uint8_t **opt, size_t *optlen) {
-        int err;
+                      uint8_t type, size_t optlen, size_t *optoffset) {
+        size_t offset = 0;
+        int r;
 
         assert(op == BOOTREQUEST || op == BOOTREPLY);
 
@@ -49,12 +50,12 @@ int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid,
         message->xid = htobe32(xid);
         message->magic = htobe32(DHCP_MAGIC_COOKIE);
 
-        *opt = (uint8_t *)(message + 1);
+        r = dhcp_option_append(message, optlen, &offset, 0,
+                               DHCP_OPTION_MESSAGE_TYPE, 1, &type);
+        if (r < 0)
+                return r;
 
-        err = dhcp_option_append(opt, optlen, DHCP_OPTION_MESSAGE_TYPE, 1,
-                                 &type);
-        if (err < 0)
-                return err;
+        *optoffset = offset;
 
         return 0;
 }
@@ -116,6 +117,8 @@ void dhcp_packet_append_ip_headers(DHCPPacket *packet, be32_t source_addr,
         packet->ip.ihl = DHCP_IP_SIZE / 4;
         packet->ip.tot_len = htobe16(len);
 
+        packet->ip.tos = IPTOS_CLASS_CS6;
+
         packet->ip.protocol = IPPROTO_UDP;
         packet->ip.saddr = source_addr;
         packet->ip.daddr = destination_addr;
@@ -141,48 +144,48 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum) {
         /* IP */
 
         if (packet->ip.version != IPVERSION) {
-                log_dhcp_client(client, "ignoring packet: not IPv4");
+                log_debug("ignoring packet: not IPv4");
                 return -EINVAL;
         }
 
         if (packet->ip.ihl < 5) {
-                log_dhcp_client(client, "ignoring packet: IPv4 IHL (%u words) invalid",
-                                packet->ip.ihl);
+                log_debug("ignoring packet: IPv4 IHL (%u words) invalid",
+                          packet->ip.ihl);
                 return -EINVAL;
         }
 
         hdrlen = packet->ip.ihl * 4;
         if (hdrlen < 20) {
-                log_dhcp_client(client, "ignoring packet: IPv4 IHL (%zu bytes) "
-                                "smaller than minimum (20 bytes)", hdrlen);
+                log_debug("ignoring packet: IPv4 IHL (%zu bytes) "
+                          "smaller than minimum (20 bytes)", hdrlen);
                 return -EINVAL;
         }
 
         if (len < hdrlen) {
-                log_dhcp_client(client, "ignoring packet: packet (%zu bytes) "
-                                "smaller than expected (%zu) by IP header", len,
-                                hdrlen);
+                log_debug("ignoring packet: packet (%zu bytes) "
+                          "smaller than expected (%zu) by IP header", len,
+                          hdrlen);
                 return -EINVAL;
         }
 
         /* UDP */
 
         if (packet->ip.protocol != IPPROTO_UDP) {
-                log_dhcp_client(client, "ignoring packet: not UDP");
+                log_debug("ignoring packet: not UDP");
                 return -EINVAL;
         }
 
         if (len < hdrlen + be16toh(packet->udp.len)) {
-                log_dhcp_client(client, "ignoring packet: packet (%zu bytes) "
-                                "smaller than expected (%zu) by UDP header", len,
-                                hdrlen + be16toh(packet->udp.len));
+                log_debug("ignoring packet: packet (%zu bytes) "
+                          "smaller than expected (%zu) by UDP header", len,
+                          hdrlen + be16toh(packet->udp.len));
                 return -EINVAL;
         }
 
         if (be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) {
-                log_dhcp_client(client, "ignoring packet: to port %u, which "
-                                "is not the DHCP client port (%u)",
-                                be16toh(packet->udp.dest), DHCP_PORT_CLIENT);
+                log_debug("ignoring packet: to port %u, which "
+                          "is not the DHCP client port (%u)",
+                          be16toh(packet->udp.dest), DHCP_PORT_CLIENT);
                 return -EINVAL;
         }
 
@@ -191,7 +194,7 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum) {
          */
 
         if (dhcp_packet_checksum(&packet->ip, hdrlen)) {
-                log_dhcp_client(client, "ignoring packet: invalid IP checksum");
+                log_debug("ignoring packet: invalid IP checksum");
                 return -EINVAL;
         }
 
@@ -201,7 +204,7 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum) {
 
                 if (dhcp_packet_checksum(&packet->ip.ttl,
                                   be16toh(packet->udp.len) + 12)) {
-                        log_dhcp_client(client, "ignoring packet: invalid UDP checksum");
+                        log_debug("ignoring packet: invalid UDP checksum");
                         return -EINVAL;
                 }
         }