Try to extract the RFC1048 data from PXE. If we get enough info we can skip
the bootp(). It removes unnecessary DHCP request from pxeloader. Submitted by: kczekirda Sponsored by: Oktawave Initiated by: Matthew Dillon Reviewed by: smh, gnn, bapt, oshogbo MFC after: 3 weeks Differential Revision: https://reviews.freebsd.org/D9847
This commit is contained in:
parent
312227566c
commit
4cd385d9e9
@ -344,6 +344,17 @@ time_t tleft;
|
|||||||
return (-1);
|
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
|
static int
|
||||||
vend_rfc1048(cp, len)
|
vend_rfc1048(cp, len)
|
||||||
u_char *cp;
|
u_char *cp;
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef _BOOTP_H_
|
||||||
|
#define _BOOTP_H_
|
||||||
|
|
||||||
struct bootp {
|
struct bootp {
|
||||||
unsigned char bp_op; /* packet opcode type */
|
unsigned char bp_op; /* packet opcode type */
|
||||||
@ -145,3 +147,7 @@ struct cmu_vend {
|
|||||||
|
|
||||||
/* v_flags values */
|
/* v_flags values */
|
||||||
#define VF_SMASK 1 /* Subnet mask field contains valid data */
|
#define VF_SMASK 1 /* Subnet mask field contains valid data */
|
||||||
|
|
||||||
|
int dhcp_try_rfc1048(u_char *cp, u_int len);
|
||||||
|
|
||||||
|
#endif /* _BOOTP_H_ */
|
||||||
|
@ -101,6 +101,7 @@ extern void __bangpxeentry(void);
|
|||||||
extern u_int16_t __pxenvseg;
|
extern u_int16_t __pxenvseg;
|
||||||
extern u_int16_t __pxenvoff;
|
extern u_int16_t __pxenvoff;
|
||||||
extern void __pxenventry(void);
|
extern void __pxenventry(void);
|
||||||
|
extern struct in_addr servip;
|
||||||
|
|
||||||
struct netif_dif pxe_ifs[] = {
|
struct netif_dif pxe_ifs[] = {
|
||||||
/* dif_unit dif_nsel dif_stats dif_private */
|
/* dif_unit dif_nsel dif_stats dif_private */
|
||||||
@ -276,17 +277,38 @@ pxe_open(struct open_file *f, ...)
|
|||||||
}
|
}
|
||||||
if (pxe_debug)
|
if (pxe_debug)
|
||||||
printf("pxe_open: netif_open() succeeded\n");
|
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) {
|
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
|
* NFS/TFTP server is. Even if we dont get back
|
||||||
* the proper information, fall back to the server
|
* the proper information, fall back to the server
|
||||||
* which brought us to life and a default rootpath.
|
* 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)
|
if (rootip.s_addr == 0)
|
||||||
rootip.s_addr = bootplayer.sip;
|
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;
|
netproto = NET_NFS;
|
||||||
if (tftpip.s_addr != 0) {
|
if (tftpip.s_addr != 0) {
|
||||||
@ -323,6 +345,9 @@ pxe_open(struct open_file *f, ...)
|
|||||||
printf("pxe_open: server addr: %s\n", inet_ntoa(rootip));
|
printf("pxe_open: server addr: %s\n", inet_ntoa(rootip));
|
||||||
printf("pxe_open: server path: %s\n", rootpath);
|
printf("pxe_open: server path: %s\n", rootpath);
|
||||||
printf("pxe_open: gateway ip: %s\n", inet_ntoa(gateip));
|
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) {
|
if (netproto == NET_TFTP) {
|
||||||
setenv("boot.tftproot.server", inet_ntoa(rootip), 1);
|
setenv("boot.tftproot.server", inet_ntoa(rootip), 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user