File dhcpcd-3.2.3-renew-unicast.diff of Package dhcpcd.import4412

--- dhcp.c
+++ dhcp.c
@@ -333,6 +333,22 @@ ssize_t send_message (const interface_t *iface, const dhcp_t *dhcp,
 
 	message_length = p - m;
 
+	if (to.s_addr && to.s_addr != INADDR_BROADCAST) {
+		struct sockaddr_in sin_to;
+
+		memset(&sin_to, 0, sizeof(sin_to));
+		sin_to.sin_family = AF_INET;
+		sin_to.sin_addr.s_addr = to.s_addr;
+		sin_to.sin_port = htons(DHCP_SERVER_PORT);
+
+		logger (LOG_DEBUG, "sending %s with xid 0x%x to %s",
+			dhcp_message (type), xid, inet_ntoa(to));
+
+		return sendto(iface->listen_fd,
+				(unsigned char *) message, message_length,
+				0, (struct sockaddr *)&sin_to, sizeof(sin_to));
+	}
+
 	packet = xzalloc (sizeof (*packet));
 	make_dhcp_packet (packet, (unsigned char *) message, message_length,
 			  from, to);
@@ -340,6 +356,7 @@ ssize_t send_message (const interface_t *iface, const dhcp_t *dhcp,
 
 	logger (LOG_DEBUG, "sending %s with xid 0x%x",
 		dhcp_message (type), xid);
+
 	retval = send_packet (iface, ETHERTYPE_IP, (unsigned char *) packet,
 			      message_length +
 			      sizeof (packet->ip) + sizeof (packet->udp));
--- socket.c
+++ socket.c
@@ -461,8 +461,8 @@ int open_socket (interface_t *iface, int protocol)
 
 	/* We need to bind to a port, otherwise Linux generate ICMP messages
 	 * that cannot contect the port when we have an address.
-	 * We don't actually use this fd at all, instead using our packet
-	 * filter socket. */
+	 * We actually use this fd for unicast messages only, otherwise we're
+	 * using our packet filter socket. So read it as udp_fd ... */
 	if (iface->listen_fd == -1 && protocol == ETHERTYPE_IP) {
 		if ((fd = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
 			logger (LOG_ERR, "socket: %s", strerror (errno));
openSUSE Build Service is sponsored by