Page MenuHomeFreeBSD

D9847.id25915.diff
No OneTemporary

D9847.id25915.diff

Index: /usr/src/lib/libstand/bootp.h
===================================================================
--- /usr/src/lib/libstand/bootp.h
+++ /usr/src/lib/libstand/bootp.h
@@ -22,6 +22,8 @@
* $FreeBSD: head/lib/libstand/bootp.h 305125 2016-08-31 13:16:40Z bapt $
*/
+#ifndef _BOOTP_H_
+#define _BOOTP_H_
struct bootp {
unsigned char bp_op; /* packet opcode type */
@@ -145,3 +147,7 @@
/* v_flags values */
#define VF_SMASK 1 /* Subnet mask field contains valid data */
+
+int dhcp_try_rfc1048(u_char *cp, u_int len);
+
+#endif /* _BOOTP_H_ */
Index: /usr/src/lib/libstand/bootp.c
===================================================================
--- /usr/src/lib/libstand/bootp.c
+++ /usr/src/lib/libstand/bootp.c
@@ -344,6 +344,17 @@
return (-1);
}
+int
+dhcp_try_rfc1048(u_char *cp, u_int len)
+{
+
+ expected_dhcpmsgtype = DHCPACK;
+ if (bcmp(vm_rfc1048, cp, sizeof(vm_rfc1048)) == 0) {
+ return (vend_rfc1048(cp, len));
+ }
+ return (-1);
+}
+
static int
vend_rfc1048(cp, len)
u_char *cp;
Index: /usr/src/sys/boot/i386/libi386/pxe.c
===================================================================
--- /usr/src/sys/boot/i386/libi386/pxe.c
+++ /usr/src/sys/boot/i386/libi386/pxe.c
@@ -101,6 +101,7 @@
extern u_int16_t __pxenvseg;
extern u_int16_t __pxenvoff;
extern void __pxenventry(void);
+extern struct in_addr servip;
struct netif_dif pxe_ifs[] = {
/* dif_unit dif_nsel dif_stats dif_private */
@@ -276,17 +277,38 @@
}
if (pxe_debug)
printf("pxe_open: netif_open() succeeded\n");
+
+ if (socktodesc(pxe_sock) == NULL) {
+ printf("pxe_open: bad socket %d\n", pxe_sock);
+ return (ENXIO);
+ }
+
}
if (rootip.s_addr == 0) {
/*
- * Do a bootp/dhcp request to find out where our
+ * Try to extract the RFC1048 data from PXE.
+ * If fail do a bootp/dhcp request to find out where our
* NFS/TFTP server is. Even if we dont get back
* the proper information, fall back to the server
* which brought us to life and a default rootpath.
*/
- bootp(pxe_sock, BOOTP_PXE);
+
+ if (dhcp_try_rfc1048(bootplayer.vendor.d, BOOTP_DHCPVEND)) {
+ if (pxe_debug)
+ printf("pxe_open: no RFC1048 data in PXE Cache\n");
+ bootp(pxe_sock, BOOTP_PXE);
+ } else if (pxe_debug)
+ printf("pxe_open: loaded RFC1048 data from PXE Cache\n");
+ }
+
if (rootip.s_addr == 0)
rootip.s_addr = bootplayer.sip;
+ if (gateip.s_addr == 0)
+ gateip.s_addr = bootplayer.gip;
+ if (myip.s_addr == 0)
+ myip.s_addr = bootplayer.yip;
+ if (servip.s_addr == 0)
+ servip = rootip;
netproto = NET_NFS;
if (tftpip.s_addr != 0) {
@@ -323,6 +345,9 @@
printf("pxe_open: server addr: %s\n", inet_ntoa(rootip));
printf("pxe_open: server path: %s\n", rootpath);
printf("pxe_open: gateway ip: %s\n", inet_ntoa(gateip));
+ printf("pxe_open: my ip: %s\n", inet_ntoa(myip));
+ printf("pxe_open: netmask: %s\n", intoa(netmask));
+ printf("pxe_open: servip: %s\n", inet_ntoa(servip));
if (netproto == NET_TFTP) {
setenv("boot.tftproot.server", inet_ntoa(rootip), 1);

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 21, 4:33 AM (17 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15538175
Default Alt Text
D9847.id25915.diff (3 KB)

Event Timeline