-/* Constuct a ip/udp header for a packet, and specify the source and dest hardware address */
-int raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
- uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex)
-{
- int fd;
- int result;
- struct sockaddr_ll dest;
- struct udp_dhcp_packet packet;
-
- if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) {
- DEBUG(LOG_ERR, "socket call failed: %m");
- return -1;
- }
-
- memset(&dest, 0, sizeof(dest));
- memset(&packet, 0, sizeof(packet));
-
- dest.sll_family = AF_PACKET;
- dest.sll_protocol = htons(ETH_P_IP);
- dest.sll_ifindex = ifindex;
- dest.sll_halen = 6;
- memcpy(dest.sll_addr, dest_arp, 6);
- if (bind(fd, (struct sockaddr *)&dest, sizeof(struct sockaddr_ll)) < 0) {
- DEBUG(LOG_ERR, "bind call failed: %m");
- close(fd);
- return -1;
- }
+ /* We were sending full-sized DHCP packets (zero padded),
+ * but some badly configured servers were seen dropping them.
+ * Apparently they drop all DHCP packets >576 *ethernet* octets big,
+ * whereas they may only drop packets >576 *IP* octets big
+ * (which for typical Ethernet II means 590 octets: 6+6+2 + 576).
+ *
+ * In order to work with those buggy servers,
+ * we truncate packets after end option byte.
+ *
+ * However, RFC 1542 says "The IP Total Length and UDP Length
+ * must be large enough to contain the minimal BOOTP header of 300 octets".
+ * Thus, we retain enough padding to not go below 300 BOOTP bytes.
+ * Some devices have filters which drop DHCP packets shorter than that.
+ */
+ padding = DHCP_OPTIONS_BUFSIZE - 1 - udhcp_end_option(packet.data.options);
+ if (padding > DHCP_SIZE - 300)
+ padding = DHCP_SIZE - 300;