Module Name: src Committed By: roy Date: Fri Jul 10 12:16:31 UTC 2009
Modified Files: src/sys/lib/libsa: bootp.c src/sys/nfs: nfs_bootdhcp.c Log Message: Use a function to add extra data to the vendor area so that data added remains constant for both DISCOVER and REQUEST messages. To generate a diff of this commit: cvs rdiff -u -r1.36 -r1.37 src/sys/lib/libsa/bootp.c cvs rdiff -u -r1.50 -r1.51 src/sys/nfs/nfs_bootdhcp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/lib/libsa/bootp.c diff -u src/sys/lib/libsa/bootp.c:1.36 src/sys/lib/libsa/bootp.c:1.37 --- src/sys/lib/libsa/bootp.c:1.36 Fri Jul 10 02:55:42 2009 +++ src/sys/lib/libsa/bootp.c Fri Jul 10 12:16:31 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bootp.c,v 1.36 2009/07/10 02:55:42 roy Exp $ */ +/* $NetBSD: bootp.c,v 1.37 2009/07/10 12:16:31 roy Exp $ */ /* * Copyright (c) 1992 Regents of the University of California. @@ -89,6 +89,33 @@ */ int bootp_flags; +static void +bootp_addvend(u_char *area) +{ +#ifdef SUPPORT_DHCP + char vci[64]; + int vcilen; + + *area++ = TAG_PARAM_REQ; + *area++ = 6; + *area++ = TAG_SUBNET_MASK; + *area++ = TAG_GATEWAY; + *area++ = TAG_HOSTNAME; + *area++ = TAG_DOMAINNAME; + *area++ = TAG_ROOTPATH; + *area++ = TAG_SWAPSERVER; + + /* Insert a NetBSD Vendor Class Identifier option. */ + sprintf(vci, "NetBSD:%s:libsa", MACHINE); + vcilen = strlen(vci); + *area++ = TAG_CLASSID; + *area++ = vcilen; + (void)memcpy(area, vci, vcilen); + area += vcilen; +#endif + *area = TAG_END; +} + /* Fetch required bootp information */ void bootp(int sock) @@ -103,11 +130,7 @@ u_char header[HEADER_SIZE]; struct bootp rbootp; } rbuf; -#ifdef SUPPORT_DHCP - char vci[64]; - int vcilen; unsigned int index; -#endif #ifdef BOOTP_DEBUG if (debug) @@ -135,33 +158,13 @@ MACPY(d->myea, bp->bp_chaddr); (void)strncpy((char *)bp->bp_file, bootfile, sizeof(bp->bp_file)); (void)memcpy(bp->bp_vend, vm_rfc1048, sizeof(vm_rfc1048)); -#ifdef SUPPORT_DHCP index = 4; +#ifdef SUPPORT_DHCP bp->bp_vend[index++] = TAG_DHCP_MSGTYPE; bp->bp_vend[index++] = 1; bp->bp_vend[index++] = DHCPDISCOVER; - /* Request the parameters we need. */ - bp->bp_vend[index++] = TAG_PARAM_REQ; - bp->bp_vend[index++] = 6; - bp->bp_vend[index++] = TAG_SUBNET_MASK; - bp->bp_vend[index++] = TAG_GATEWAY; - bp->bp_vend[index++] = TAG_HOSTNAME; - bp->bp_vend[index++] = TAG_DOMAINNAME; - bp->bp_vend[index++] = TAG_ROOTPATH; - bp->bp_vend[index++] = TAG_SWAPSERVER; - /* - * Insert a NetBSD Vendor Class Identifier option. - */ - sprintf(vci, "NetBSD:%s:libsa", MACHINE); - vcilen = strlen(vci); - bp->bp_vend[index++] = TAG_CLASSID; - bp->bp_vend[index++] = vcilen; - (void)memcpy(&bp->bp_vend[index], vci, vcilen); - index += vcilen; - bp->bp_vend[9 + vcilen] = TAG_END; -#else - bp->bp_vend[4] = TAG_END; #endif + bootp_addvend(&bp->bp_vend[index]); d->myip.s_addr = INADDR_ANY; d->myport = htons(IPPORT_BOOTPC); @@ -199,25 +202,7 @@ leasetime = htonl(300); (void)memcpy(&bp->bp_vend[index], &leasetime, 4); index += 4; - /* Request the parameters we need. */ - bp->bp_vend[index++] = TAG_PARAM_REQ; - bp->bp_vend[index++] = 6; - bp->bp_vend[index++] = TAG_SUBNET_MASK; - bp->bp_vend[index++] = TAG_GATEWAY; - bp->bp_vend[index++] = TAG_HOSTNAME; - bp->bp_vend[index++] = TAG_DOMAINNAME; - bp->bp_vend[index++] = TAG_ROOTPATH; - bp->bp_vend[index++] = TAG_SWAPSERVER; - /* - * Insert a NetBSD Vendor Class Identifier option. - */ - sprintf(vci, "NetBSD:%s:libsa", MACHINE); - vcilen = strlen(vci); - bp->bp_vend[index++] = TAG_CLASSID; - bp->bp_vend[index++] = vcilen; - (void)memcpy(&bp->bp_vend[index], vci, vcilen); - index += vcilen; - bp->bp_vend[index] = TAG_END; + bootp_addvend(&bp->bp_vend[index]); expected_dhcpmsgtype = DHCPACK; Index: src/sys/nfs/nfs_bootdhcp.c diff -u src/sys/nfs/nfs_bootdhcp.c:1.50 src/sys/nfs/nfs_bootdhcp.c:1.51 --- src/sys/nfs/nfs_bootdhcp.c:1.50 Fri Jul 10 02:41:39 2009 +++ src/sys/nfs/nfs_bootdhcp.c Fri Jul 10 12:16:31 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_bootdhcp.c,v 1.50 2009/07/10 02:41:39 roy Exp $ */ +/* $NetBSD: nfs_bootdhcp.c,v 1.51 2009/07/10 12:16:31 roy Exp $ */ /*- * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc. @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.50 2009/07/10 02:41:39 roy Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.51 2009/07/10 12:16:31 roy Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs_boot.h" @@ -445,6 +445,34 @@ return (-1); } +static void +bootp_addvend(u_char *area) +{ +#ifdef NFS_BOOT_DHCP + char vci[64]; + int vcilen; + + *area++ = TAG_PARAM_REQ; + *area++ = 6; + *area++ = TAG_SUBNET_MASK; + *area++ = TAG_GATEWAY; + *area++ = TAG_HOST_NAME; + *area++ = TAG_DOMAIN_NAME; + *area++ = TAG_ROOT_PATH; + *area++ = TAG_SWAP_SERVER; + + /* Insert a NetBSD Vendor Class Identifier option. */ + snprintf(vci, sizeof(vci), "%s:%s:kernel:%s", ostype, MACHINE, + osrelease); + vcilen = strlen(vci); + *area++ = TAG_CLASSID; + *area++ = vcilen; + (void)memcpy(area, vci, vcilen); + area += vcilen; +#endif + *area = TAG_END; +} + static int bootpc_call(struct nfs_diskless *nd, struct lwp *lwp, int *flags) { @@ -458,11 +486,7 @@ const u_char *haddr; u_char hafmt, halen; struct bootpcontext bpc; -#ifdef NFS_BOOT_DHCP - char vci[64]; - int vcilen; unsigned int index; -#endif error = socreate(AF_INET, &so, SOCK_DGRAM, 0, lwp, NULL); if (error) { @@ -586,34 +610,13 @@ #endif /* Fill-in the vendor data. */ memcpy(bootp->bp_vend, vm_rfc1048, 4); -#ifdef NFS_BOOT_DHCP index = 4; +#ifdef NFS_BOOT_DHCP bootp->bp_vend[index++] = TAG_DHCP_MSGTYPE; bootp->bp_vend[index++] = 1; bootp->bp_vend[index++] = DHCPDISCOVER; - /* Request the paramters we need. */ - bootp->bp_vend[index++] = TAG_PARAM_REQ; - bootp->bp_vend[index++] = 6; - bootp->bp_vend[index++] = TAG_SUBNET_MASK; - bootp->bp_vend[index++] = TAG_GATEWAY; - bootp->bp_vend[index++] = TAG_HOST_NAME; - bootp->bp_vend[index++] = TAG_DOMAIN_NAME; - bootp->bp_vend[index++] = TAG_ROOT_PATH; - bootp->bp_vend[index++] = TAG_SWAP_SERVER; - /* - * Insert a NetBSD Vendor Class Identifier option. - */ - snprintf(vci, sizeof(vci), "%s:%s:kernel:%s", ostype, MACHINE, - osrelease); - vcilen = strlen(vci); - bootp->bp_vend[index++] = TAG_CLASSID; - bootp->bp_vend[index++] = vcilen; - memcpy(&bootp->bp_vend[index], vci, vcilen); - index += vcilen; - bootp->bp_vend[index] = TAG_END; -#else - bootp->bp_vend[index] = TAG_END; #endif + bootp_addvend(&bootp->bp_vend[index]); bpc.xid = xid; bpc.haddr = haddr; @@ -649,23 +652,7 @@ leasetime = htonl(300); memcpy(&bootp->bp_vend[index], &leasetime, 4); index += 4; - /* Request the paramters we need. */ - bootp->bp_vend[index++] = TAG_PARAM_REQ; - bootp->bp_vend[index++] = 6; - bootp->bp_vend[index++] = TAG_SUBNET_MASK; - bootp->bp_vend[index++] = TAG_GATEWAY; - bootp->bp_vend[index++] = TAG_HOST_NAME; - bootp->bp_vend[index++] = TAG_DOMAIN_NAME; - bootp->bp_vend[index++] = TAG_ROOT_PATH; - bootp->bp_vend[index++] = TAG_SWAP_SERVER; - /* - * Insert a NetBSD Vendor Class Identifier option. - */ - bootp->bp_vend[index++] = TAG_CLASSID; - bootp->bp_vend[index++] = vcilen; - memcpy(&bootp->bp_vend[index], vci, vcilen); - index += vcilen; - bootp->bp_vend[index] = TAG_END; + bootp_addvend(&bootp->bp_vend[index]); bpc.expected_dhcpmsgtype = DHCPACK;