]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/redboot/v2_0/src/net/bootp.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / redboot / v2_0 / src / net / bootp.c
index 3df9606695343cb2b88f00f727c8b987a94343ad..3a0c60acae5998a5ccd263cabbbea25a861eeab8 100644 (file)
@@ -87,7 +87,7 @@ static enum {
 #endif
 
 static void
-bootp_handler(udp_socket_t *skt, char *buf, int len,
+bootp_handler(udp_socket_t *skt, void *buf, int len,
              ip_route_t *src_route, word src_port)
 {
     bootp_header_t *b;
@@ -95,7 +95,7 @@ bootp_handler(udp_socket_t *skt, char *buf, int len,
     unsigned char *p, expected = 0;
 #endif
 
-    b = (bootp_header_t *)buf;
+    b = buf;
     if (bp_info) {
         memset(bp_info,0,sizeof *bp_info);
         if (len > sizeof *bp_info)
@@ -166,7 +166,7 @@ bootp_handler(udp_socket_t *skt, char *buf, int len,
 
 #define AddOption(p,d) do {memcpy(p,d,sizeof d); p += sizeof d;} while (0)
 
-static int get_xid()
+static int get_xid(void)
 {
 #if CYGINT_ISO_RAND
        return rand();
@@ -195,7 +195,6 @@ __bootp_find_local_ip(bootp_header_t *info)
 #endif
     int txSize;
     bool abort = false;
-    int xid;
 
 #ifdef CYGSEM_REDBOOT_NETWORKING_DHCP
     dhcpState = DHCP_NONE;
@@ -277,7 +276,7 @@ __bootp_find_local_ip(bootp_header_t *info)
        __udp_send((char *)&b, txSize, &r, IPPORT_BOOTPS, IPPORT_BOOTPC);
 
         // If we're retrying, inform the user
-        if (retry == (MAX_RETRIES-1))
+        if (retry == (MAX_RETRIES - 1))
             diag_printf("... waiting for BOOTP information\n");
 
        do {
@@ -318,7 +317,18 @@ __bootp_find_local_ip(bootp_header_t *info)
                                memcpy(&__bootp_dns_addr, p, 4);
                                __bootp_dns_set = 1;
                                break;
-#endif
+#ifdef CYGPKG_REDBOOT_NETWORKING_DNS_DHCP_DOMAIN
+                                                       case TAG_DOMAIN_NAME:
+                                                               if(optlen < sizeof(__bootp_dns_domain)) {
+                                                                       memcpy(__bootp_dns_domain, p, optlen);
+                                                                       __bootp_dns_domain[optlen] = '\0';
+                                                                       __bootp_dns_domain_set = 1;
+                                                               } else {
+                                                                       diag_printf("DNS domain name too long\n");
+                                                               }
+                                                               break;
+#endif //CYGPKG_REDBOOT_NETWORKING_DNS_DHCP_DOMAIN
+#endif //CYGPKG_REDBOOT_NETWORKING_DNS
                             default:
                                 break;
                             }
@@ -340,12 +350,14 @@ __bootp_find_local_ip(bootp_header_t *info)
                return 0;
            }
 #endif
-            if (_rb_break(1)) {
-                // The user typed ^C on the console
-                abort = true;
-                break;
-            }
-           start--; /* account for time spent in _rb_break() */
+           if (retry < MAX_RETRIES) {
+               if (_rb_break(1)) {
+                   // The user typed ^C on the console
+                   abort = true;
+                   break;
+               }
+               start--; /* account for time spent in _rb_break() */
+           }
        } while ((int)(MS_TICKS_DELAY() - start) < RETRY_TIME);
     } while (!abort && (retry-- > 0));