This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 4c256e7  netutils/dhcpd: handshake the dhcpd message with server port.
4c256e7 is described below

commit 4c256e7db375e46267bfb7ae05b7a52e2d57b6db
Author: chao.an <[email protected]>
AuthorDate: Wed Feb 24 23:09:12 2021 +0800

    netutils/dhcpd: handshake the dhcpd message with server port.
    
    resolve the dhcpd compatibility issues on some strict system, such as 
Windows XP,7,10
    
    Signed-off-by: chao.an <[email protected]>
---
 netutils/dhcpd/dhcpd.c | 103 ++++++++++++++-----------------------------------
 1 file changed, 28 insertions(+), 75 deletions(-)

diff --git a/netutils/dhcpd/dhcpd.c b/netutils/dhcpd/dhcpd.c
index e7333d1..939da5b 100644
--- a/netutils/dhcpd/dhcpd.c
+++ b/netutils/dhcpd/dhcpd.c
@@ -883,45 +883,6 @@ static inline int dhcpd_socket(void)
 }
 
 /****************************************************************************
- * Name: dhcpd_openresponder
- ****************************************************************************/
-
-static inline int dhcpd_openresponder(void)
-{
-  struct sockaddr_in addr;
-  int sockfd;
-  int ret;
-
-  ninfo("Responder: %08" PRIx32 "\n", ntohl(g_state.ds_serverip));
-
-  /* Create a socket to listen for requests from DHCP clients */
-
-  sockfd = dhcpd_socket();
-  if (sockfd < 0)
-    {
-      nerr("ERROR: socket failed: %d\n", errno);
-      return ERROR;
-    }
-
-  /* Bind the socket to a local port. */
-
-  addr.sin_family      = AF_INET;
-  addr.sin_port        = 0;
-  addr.sin_addr.s_addr = g_state.ds_serverip;
-
-  ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
-  if (ret < 0)
-    {
-      nerr("ERROR: bind failed, port=%d addr=%08lx: %d\n",
-           addr.sin_port, (long)addr.sin_addr.s_addr, errno);
-      close(sockfd);
-      return ERROR;
-    }
-
-  return sockfd;
-}
-
-/****************************************************************************
  * Name: dhcpd_initpacket
  ****************************************************************************/
 
@@ -958,13 +919,11 @@ static void dhcpd_initpacket(uint8_t mtype)
  * Name: dhcpd_sendpacket
  ****************************************************************************/
 
-static int dhcpd_sendpacket(int bbroadcast)
+static int dhcpd_sendpacket(int sockfd, int bbroadcast)
 {
   struct sockaddr_in addr;
   in_addr_t ipaddr;
-  int sockfd;
   int len;
-  int ret = ERROR;
 
 #ifdef CONFIG_NETUTILS_DHCPD_IGNOREBROADCAST
   /* This is a hack.  I've had problems with Windows machines responding
@@ -1025,35 +984,29 @@ static int dhcpd_sendpacket(int bbroadcast)
    * cannot re-use the listener socket because it is not bound correctly
    */
 
-  sockfd = dhcpd_openresponder();
-  if (sockfd >= 0)
-    {
-      /* Then send the response to the DHCP client port at that address */
-
-      memset(&addr, 0, sizeof(struct sockaddr_in));
-      addr.sin_family      = AF_INET;
-      addr.sin_port        = HTONS(DHCP_CLIENT_PORT);
-      addr.sin_addr.s_addr = ipaddr;
+  /* Then send the response to the DHCP client port at that address */
 
-      /* Send the minimum sized packet that includes the END option */
+  memset(&addr, 0, sizeof(struct sockaddr_in));
+  addr.sin_family      = AF_INET;
+  addr.sin_port        = HTONS(DHCP_CLIENT_PORT);
+  addr.sin_addr.s_addr = ipaddr;
 
-      len = (g_state.ds_optend - (FAR uint8_t *)&g_state.ds_outpacket) + 1;
-      ninfo("sendto %08lx:%04x len=%d\n",
-            (long)ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port), len);
+  /* Send the minimum sized packet that includes the END option */
 
-      ret = sendto(sockfd, &g_state.ds_outpacket, len, 0,
-                   (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
-      close(sockfd);
-    }
+  len = (g_state.ds_optend - (FAR uint8_t *)&g_state.ds_outpacket) + 1;
+  ninfo("sendto %08lx:%04x len=%d\n",
+        (long)ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port), len);
 
-  return ret;
+  return sendto(sockfd, &g_state.ds_outpacket, len, 0,
+                (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
 }
 
 /****************************************************************************
  * Name: dhcpd_sendoffer
  ****************************************************************************/
 
-static inline int dhcpd_sendoffer(in_addr_t ipaddr, uint32_t leasetime)
+static inline int dhcpd_sendoffer(int sockfd, in_addr_t ipaddr,
+                                  uint32_t leasetime)
 {
   in_addr_t netaddr;
 #ifdef HAVE_DNSIP
@@ -1091,9 +1044,9 @@ static inline int dhcpd_sendoffer(in_addr_t ipaddr, 
uint32_t leasetime)
   /* Send the offer response */
 
 #ifdef CONFIG_NETUTILS_DHCPD_IGNOREBROADCAST
-  return dhcpd_sendpacket(true);
+  return dhcpd_sendpacket(sockfd, true);
 #else
-  return dhcpd_sendpacket(false);
+  return dhcpd_sendpacket(sockfd, false);
 #endif
 }
 
@@ -1101,20 +1054,20 @@ static inline int dhcpd_sendoffer(in_addr_t ipaddr, 
uint32_t leasetime)
  * Name: dhcpd_sendnak
  ****************************************************************************/
 
-static int dhcpd_sendnak(void)
+static int dhcpd_sendnak(int sockfd)
 {
   /* Initialize and send the NAK response */
 
   dhcpd_initpacket(DHCPNAK);
   memcpy(g_state.ds_outpacket.ciaddr, g_state.ds_inpacket.ciaddr, 4);
-  return dhcpd_sendpacket(true);
+  return dhcpd_sendpacket(sockfd, true);
 }
 
 /****************************************************************************
  * Name: dhcpd_sendack
  ****************************************************************************/
 
-int dhcpd_sendack(in_addr_t ipaddr)
+int dhcpd_sendack(int sockfd, in_addr_t ipaddr)
 {
   uint32_t leasetime = CONFIG_NETUTILS_DHCPD_LEASETIME;
   in_addr_t netaddr;
@@ -1153,9 +1106,9 @@ int dhcpd_sendack(in_addr_t ipaddr)
 #endif
 
 #ifdef CONFIG_NETUTILS_DHCPD_IGNOREBROADCAST
-  if (dhcpd_sendpacket(true) < 0)
+  if (dhcpd_sendpacket(sockfd, true) < 0)
 #else
-  if (dhcpd_sendpacket(false) < 0)
+  if (dhcpd_sendpacket(sockfd, false) < 0)
 #endif
     {
       return ERROR;
@@ -1169,7 +1122,7 @@ int dhcpd_sendack(in_addr_t ipaddr)
  * Name: dhcpd_discover
  ****************************************************************************/
 
-static inline int dhcpd_discover(void)
+static inline int dhcpd_discover(int sockfd)
 {
   struct lease_s *lease;
   in_addr_t ipaddr;
@@ -1241,14 +1194,14 @@ static inline int dhcpd_discover(void)
 
   /* Send the offer response */
 
-  return dhcpd_sendoffer(ipaddr, leasetime);
+  return dhcpd_sendoffer(sockfd, ipaddr, leasetime);
 }
 
 /****************************************************************************
  * Name: dhcpd_request
  ****************************************************************************/
 
-static inline int dhcpd_request(void)
+static inline int dhcpd_request(int sockfd)
 {
   struct lease_s *lease;
   in_addr_t ipaddr = 0;
@@ -1388,12 +1341,12 @@ static inline int dhcpd_request(void)
   if (response == DHCPACK)
     {
       ninfo("ACK IP %08lx\n", (long)ipaddr);
-      dhcpd_sendack(ipaddr);
+      dhcpd_sendack(sockfd, ipaddr);
     }
   else if (response == DHCPNAK)
     {
       ninfo("NAK IP %08lx\n", (long)ipaddr);
-      dhcpd_sendnak();
+      dhcpd_sendnak(sockfd);
     }
   else
     {
@@ -1604,12 +1557,12 @@ int dhcpd_run(FAR const char *interface)
         {
           case DHCPDISCOVER:
             ninfo("DHCPDISCOVER\n");
-            dhcpd_discover();
+            dhcpd_discover(sockfd);
             break;
 
           case DHCPREQUEST:
             ninfo("DHCPREQUEST\n");
-            dhcpd_request();
+            dhcpd_request(sockfd);
             break;
 
           case DHCPDECLINE:

Reply via email to