]> git.lizzy.rs Git - plan9front.git/commitdiff
ip/dhcpd: work around raspberry pi pxe firmware by providing dhcp option 66
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 11 Apr 2021 18:20:41 +0000 (20:20 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 11 Apr 2021 18:20:41 +0000 (20:20 +0200)
The raspberry pi 4 PXE firmware insists on finding the tftp
server address by parsing dhcp option 66 as an ip address
string.

sys/src/cmd/ip/dhcpd/dhcpd.c

index 7ca52a0493ff007d679c8b919ecd3a4a66ab695e..f6323f5359aa0086e08700cb4d5129aaa92b8d86 100644 (file)
@@ -1136,8 +1136,7 @@ miscoptions(Req *rp, uchar *ip)
        uchar *addrs[8];
        uchar *op, *omax;
        uchar x[nelem(addrs)*IPaddrlen], vopts[Maxoptlen];
-       char *p;
-       char *attr[100], **a;
+       char ip4str[16], *p, *attr[100], **a;
        Ndbtuple *t;
        Iplifc *lifc;
 
@@ -1279,6 +1278,21 @@ miscoptions(Req *rp, uchar *ip)
                case OBttl:
                        byteopt(rp, OBttl, 255);
                        break;
+
+               case ODtftpserver:
+                       /* 
+                        * This option actually should contain a hostname, BUT:
+                        * It appears that Rpi4 PXE firmware ignores the siaddr
+                        * and instead insists on this (DHCP option 66) to contain
+                        * the IP address string of the TFTP server.
+                        */
+                       snprint(ip4str, sizeof(ip4str), "%V", rp->bp->siaddr);
+                       stringopt(rp, ODtftpserver, ip4str);
+                       break;
+               case ODbootfile:
+                       if(*rp->bp->file)
+                               stringopt(rp, ODbootfile, rp->bp->file);
+                       break;
                }
 
        if (*rp->vendorclass != '\0') {