--- bootp.c (revision 723) +++ bootp.c (revision 727) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include @@ -75,6 +76,7 @@ #ifdef SUPPORT_DHCP static char expected_dhcpmsgtype = -1, dhcp_ok; struct in_addr dhcp_serverip; +static void vend_ident(u_char *); #endif /* Fetch required bootp infomation */ @@ -93,7 +95,9 @@ u_char header[HEADER_SIZE]; struct bootp rbootp; } rbuf; - +#ifdef SUPPORT_DHCP + char *vendor_ident; +#endif #ifdef BOOTP_DEBUG if (debug) printf("bootp: socket=%d\n", sock); @@ -132,9 +136,12 @@ */ if (flag & BOOTP_PXE) { bp->bp_vend[7] = TAG_CLASSID; - bp->bp_vend[8] = 9; - bcopy("PXEFBSD71", &bp->bp_vend[9], 9); - bp->bp_vend[18] = TAG_END; + vendor_ident=malloc(1024); + vend_ident(vendor_ident); + bp->bp_vend[8] = strlen(vendor_ident); + bcopy(vendor_ident, &bp->bp_vend[9], bp->bp_vend[8]); + free(vendor_ident); + bp->bp_vend[(9 + bp->bp_vend[8])] = TAG_END; } else bp->bp_vend[7] = TAG_END; #else @@ -175,9 +182,12 @@ bcopy(&leasetime, &bp->bp_vend[21], 4); if (flag & BOOTP_PXE) { bp->bp_vend[25] = TAG_CLASSID; - bp->bp_vend[26] = 9; - bcopy("PXEClient", &bp->bp_vend[27], 9); - bp->bp_vend[36] = TAG_END; + vendor_ident=malloc(1024); + vend_ident(vendor_ident); + bp->bp_vend[8] = strlen(vendor_ident); + bcopy(vendor_ident, &bp->bp_vend[27], bp->bp_vend[26]); + free(vendor_ident); + bp->bp_vend[(27 + bp->bp_vend[26])] = TAG_END; } else bp->bp_vend[25] = TAG_END; @@ -390,6 +400,21 @@ } return(0); } +#ifdef SUPPORT_DHCP +static void +vend_ident(cp) + u_char *cp; +{ + char default_vendor_ident[] = "PXEClient:FBSD"; +#ifdef __i386__ + sprintf(cp,"%s:i386:%d",default_vendor_ident,__FreeBSD_version); +#elif __amd64__ + sprintf(cp,"%s:amd64:%d",default_vendor_ident,__FreeBSD_version); +#else + sprintf(cp,"%s:%d",default_vendor_ident,__FreeBSD_version); +#endif +} +#endif #ifdef BOOTP_VEND_CMU static void