kczekirda updated this revision to Diff 25936.
kczekirda marked 2 inline comments as done.

CHANGES SINCE LAST UPDATE
  https://reviews.freebsd.org/D9847?vs=25931&id=25936

REVISION DETAIL
  https://reviews.freebsd.org/D9847

AFFECTED FILES
  /usr/src/lib/libstand/bootp.c
  /usr/src/lib/libstand/bootp.h
  /usr/src/sys/boot/i386/libi386/pxe.c

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: kczekirda, tsoome, glebius, freebsd-net-list, #network, gnn, smh, bapt, 
oshogbo
Cc: smh
diff --git a//usr/src/sys/boot/i386/libi386/pxe.c.old b//usr/src/sys/boot/i386/libi386/pxe.c
--- a//usr/src/sys/boot/i386/libi386/pxe.c.old
+++ b//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) < 0) {
+				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);
diff --git a//usr/src/lib/libstand/bootp.c.old b//usr/src/lib/libstand/bootp.c
--- a//usr/src/lib/libstand/bootp.c.old
+++ b//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;
diff --git a//usr/src/lib/libstand/bootp.h.old b//usr/src/lib/libstand/bootp.h
--- a//usr/src/lib/libstand/bootp.h.old
+++ b//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_ */

_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to