⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootp.c

📁 ARM的bootloader代码.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
    *e++ = 3;		/* Router Option */    *cnt += 1;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS)    *e++ = 6;		/* DNS Server(s) */    *cnt += 1;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_HOSTNAME)    *e++ = 12;		/* Hostname */    *cnt += 1;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTFILESIZE)    *e++ = 13;		/* Boot File Size */    *cnt += 1;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTPATH)    *e++ = 17;		/* Boot path */    *cnt += 1;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NISDOMAIN)    *e++ = 40;		/* NIS Domain name request */    *cnt += 1;#endif    *e++ = 255;		/* End of the list */    return e - start ;}#else	/* CFG_CMD_DHCP *//* *	Warning: no field size check - change CONFIG_BOOTP_MASK at your own risk! */static int BootpExtended (u8 *e){    u8 *start = e ;    *e++ =  99;		/* RFC1048 Magic Cookie */    *e++ = 130;    *e++ =  83;    *e++ =  99;#if (CONFIG_COMMANDS & CFG_CMD_DHCP)    *e++ = 53;		/* DHCP Message Type */    *e++ = 1;    *e++ = DHCP_DISCOVER;    *e++ = 57;		/* Maximum DHCP Message Size */    *e++ = 2;    *e++ = (576-312+OPT_SIZE) >> 16;    *e++ = (576-312+OPT_SIZE) & 0xff;#endif	/* CFG_CMD_DHCP */#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_SUBNETMASK)    *e++ =  1;		/* Subnet mask request */    *e++ =  4;     e  +=  4;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_GATEWAY)    *e++ =  3;		/* Default gateway request */    *e++ =  4;     e  +=  4;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_DNS)    *e++ =  6;		/* Domain Name Server */    *e++ =  4;     e  +=  4;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_HOSTNAME)    *e++ = 12;		/* Host name request */    *e++ = 32;     e  += 32;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTFILESIZE)    *e++ = 13;		/* Boot file size */    *e++ =  2;     e  +=  2;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_BOOTPATH)    *e++ = 17;		/* Boot path */    *e++ = 32;     e  += 32;#endif#if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_NISDOMAIN)    *e++ = 40;		/* NIS Domain name request */    *e++ = 32;     e  += 32;#endif    *e++ = 255;		/* End of the list */    return e - start ;}#endif	/* CFG_CMD_DHCP */voidBootpRequest (void){	volatile uchar *pkt, *iphdr;	Bootp_t *bp;	int ext_len, pktlen, iplen;#if (CONFIG_COMMANDS & CFG_CMD_DHCP)	dhcp_state = INIT;#endif	printf("BOOTP broadcast %d\n", ++BootpTry);	pkt = NetTxPacket;	memset ((void*)pkt, 0, PKTSIZE);	NetSetEther(pkt, NetBcastAddr, PROT_IP);	pkt += ETHER_HDR_SIZE;	/*	 * Next line results in incorrect packet size being transmitted, resulting	 * in errors in some DHCP servers, reporting missing bytes.  Size must be	 * set in packet header after extension length has been determined.	 * C. Hallinan, DS4.COM, Inc.	 */	/* NetSetIP(pkt, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, sizeof (Bootp_t)); */	iphdr = pkt;	/* We need this later for NetSetIP() */	pkt += IP_HDR_SIZE;	bp = (Bootp_t *)pkt;	bp->bp_op = OP_BOOTREQUEST;	bp->bp_htype = HWT_ETHER;	bp->bp_hlen = HWL_ETHER;	bp->bp_hops = 0;	bp->bp_secs = SWAP16( get_timer(0) / CFG_HZ);	NetWriteIP((vuchar*)&bp->bp_ciaddr, 0);	NetWriteIP((vuchar*)&bp->bp_yiaddr, 0);	NetWriteIP((vuchar*)&bp->bp_siaddr, 0);	NetWriteIP((vuchar*)&bp->bp_giaddr, 0);	NetCopyEther(bp->bp_chaddr, NetOurEther);	copy_filename (bp->bp_file, BootFile, sizeof(bp->bp_file));	/* Request additional information from the BOOTP/DHCP server */#if (CONFIG_COMMANDS & CFG_CMD_DHCP)	ext_len = DhcpExtended(bp->bp_vend, DHCP_DISCOVER, 0, 0);#else	ext_len = BootpExtended(bp->bp_vend);#endif	/* CFG_CMD_DHCP */	/*	 *	Bootp ID is the lower 4 bytes of our ethernet address	 *	plus the current time in HZ.	 */	BootpID = ((ulong)NetOurEther[2] << 24)		| ((ulong)NetOurEther[3] << 16)		| ((ulong)NetOurEther[4] << 8)		| (ulong)NetOurEther[5];	BootpID += get_timer(0);	memcpy(&bp->bp_id, &BootpID, sizeof(bp->bp_id));	/*	 * Calculate proper packet lengths taking into account the	 * variable size of the options field	 */	pktlen = BOOTP_SIZE - sizeof(bp->bp_vend) + ext_len;	iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + ext_len;	NetSetIP(iphdr, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, iplen);	NetSetTimeout(SELECT_TIMEOUT * CFG_HZ, BootpTimeout);#if (CONFIG_COMMANDS & CFG_CMD_DHCP)	dhcp_state = SELECTING;	NetSetHandler(DhcpHandler);#else	NetSetHandler(BootpHandler);#endif	/* CFG_CMD_DHCP */	NetSendPacket(NetTxPacket, pktlen);}#if (CONFIG_COMMANDS & CFG_CMD_DHCP)void DhcpOptionsProcess(char *popt){	char *end = popt + BOOTP_HDR_SIZE;	int oplen, size;	while ( popt < end && *popt != 0xff ) {		oplen = *(popt + 1);		switch(*popt) {			case  1:				NetOurSubnetMask = *(IPaddr_t *)(popt + 2);				break;			case  3:				NetOurGatewayIP = *(IPaddr_t *)(popt + 2);				break;			case  6:				NetOurDNSIP = *(IPaddr_t *)(popt +2);				break;			case 12:				size = truncate_sz ("Host Name",						    sizeof(NetOurHostName),						    oplen);				memcpy(&NetOurHostName, popt+2, size);				NetOurHostName[size] = 0 ;				break;			case 15:		/* Ignore Domain Name Option */				break;			case 17:				size = truncate_sz ("Root Path",						    sizeof(NetOurRootPath),						    oplen);				memcpy(&NetOurRootPath, popt+2, size);				NetOurRootPath[size] = 0 ;				break;			case 51:				dhcp_leasetime = *(unsigned int *)(popt + 2);				break;			case 53:		/* Ignore Message Type Option */				break;			case 54:				NetServerIP = *(IPaddr_t *)(popt+2);				break;			case 58:		/* Ignore Renewal Time Option */				break;			case 59:		/* Ignore Rebinding Time Option */				break;			default:				printf("*** Unhandled DHCP Option in OFFER/ACK: %d\n",					*popt);				break;		}		popt += oplen + 2;	/* Process next option */	}}static int DhcpMessageType(unsigned char *popt){	ulong vendmagic;	memcpy(&vendmagic, popt, 4);	if (SWAP32(vendmagic) != BOOTP_VENDOR_MAGIC)		return -1;	popt += 4;	while ( *popt != 0xff ) {		if ( *popt == 53 )	/* DHCP Message Type */			return *(popt + 2);		popt += *(popt + 1) + 2;	/* Scan through all options */	}	return -1;}void DhcpSendRequestPkt(Bootp_t *bp_offer){	volatile uchar *pkt, *iphdr;	Bootp_t *bp;	int pktlen, iplen, extlen;	debug ("DhcpSendRequestPkt: Sending DHCPREQUEST\n");	pkt = NetTxPacket;	memset ((void*)pkt, 0, PKTSIZE);	NetSetEther(pkt, NetBcastAddr, PROT_IP);	pkt += ETHER_HDR_SIZE;	iphdr = pkt;		/* We'll need this later to set proper pkt size */	pkt += IP_HDR_SIZE;	bp = (Bootp_t *)pkt;	bp->bp_op = OP_BOOTREQUEST;	bp->bp_htype = HWT_ETHER;	bp->bp_hlen = HWL_ETHER;	bp->bp_hops = 0;	bp->bp_secs = SWAP16( get_timer(0) / CFG_HZ);	NetCopyIP((vuchar*)&bp->bp_ciaddr, (vuchar*)&bp_offer->bp_ciaddr);	NetCopyIP((vuchar*)&bp->bp_yiaddr, (vuchar*)&bp_offer->bp_yiaddr);	NetCopyIP((vuchar*)&bp->bp_siaddr, (vuchar*)&bp_offer->bp_siaddr);	NetCopyIP((vuchar*)&bp->bp_giaddr, (vuchar*)&bp_offer->bp_giaddr);	NetCopyEther(bp->bp_chaddr, NetOurEther);	/*	 * ID is the id of the OFFER packet	 */	memcpy(bp->bp_id, bp_offer->bp_id, sizeof(bp->bp_id);	/*	 * Copy options from OFFER packet if present	 */	extlen = DhcpExtended(bp->bp_vend, DHCP_REQUEST, NetServerIP, bp->bp_yiaddr);	pktlen = BOOTP_SIZE - sizeof(bp->bp_vend) + extlen;	iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;	NetSetIP(iphdr, 0xffffffffL, PORT_BOOTPS, PORT_BOOTPC, iplen);	debug ("Transmitting DHCPREQUEST packet: len = %d\n", pktlen);	NetSendPacket(NetTxPacket, pktlen);}/* *	Handle DHCP received packets. */static voidDhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len){	Bootp_t *bp = (Bootp_t *)pkt;	debug ("DHCPHandler: got packet: (src=%d, dst=%d, len=%d) state: %d\n",		src, dest, len, dhcp_state);	if (BootpCheckPkt(pkt, dest, src, len))	/* Filter out pkts we don't want */		return;	debug ("DHCPHandler: got DHCP packet: (src=%d, dst=%d, len=%d) state: %d\n",		src, dest, len, dhcp_state);	switch (dhcp_state) {	case SELECTING:		/*		 * Wait an appropriate time for any potential DHCPOFFER packets		 * to arrive.  Then select one, and generate DHCPREQUEST response.		 * If filename is in format we recognize, assume it is a valid		 * OFFER from a server we want.		 */		debug ("DHCP: state=SELECTING bp_file: \"%s\"\n", bp->bp_file);#ifdef CFG_BOOTFILE_PREFIX		if (strncmp(bp->bp_file,			    CFG_BOOTFILE_PREFIX,			    strlen(CFG_BOOTFILE_PREFIX)) == 0 ) {#endif	/* CFG_BOOTFILE_PREFIX */			debug ("TRANSITIONING TO REQUESTING STATE\n");			dhcp_state = REQUESTING;#if 0			if ((*(uint *)bp->bp_vend) == BOOTP_VENDOR_MAGIC)				DhcpOptionsProcess(&bp->bp_vend[4]);#endif			BootpCopyNetParams(bp);	/* Store net params from reply */			NetSetTimeout(TIMEOUT * CFG_HZ, BootpTimeout);			DhcpSendRequestPkt(bp);#ifdef CFG_BOOTFILE_PREFIX		}#endif	/* CFG_BOOTFILE_PREFIX */		return;		break;	case REQUESTING:		debug ("DHCP State: REQUESTING\n");		if ( DhcpMessageType(bp->bp_vend) == DHCP_ACK ) {			if ((*(uint *)bp->bp_vend) == BOOTP_VENDOR_MAGIC)				DhcpOptionsProcess(&bp->bp_vend[4]);			BootpCopyNetParams(bp);	/* Store net params from reply */			dhcp_state = BOUND;			printf("DHCP client bound to address ");			print_IPaddr(NetOurIP);			printf("\n");			/* Send ARP request to get TFTP server ethernet address.			 * This automagically starts TFTP, too.			 */			ArpRequest();			return;		}		break;	default:		printf("DHCP: INVALID STATE\n");		break;	}}void DhcpRequest(void){	BootpRequest();}#endif	/* CFG_CMD_DHCP */#endif /* CFG_CMD_NET */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -