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

📄 dhcp_01.c

📁 umon bootloader source code, support mips cpu.
💻 C
字号:
/* dhcp_01.c:
 *	This is the PPA-specific code used for Videotron Market trial.
 *	It was built from the dhcp_00.c DHCP-extension template file.
 *
 *	General notice:
 *	This code is part of a boot-monitor package developed as a generic base
 *	platform for embedded system designs.  As such, it is likely to be
 *	distributed to various projects beyond the control of the original
 *	author.  Please notify the author of any enhancements made or bugs found
 *	so that all may benefit from the changes.  In addition, notification back
 *	to the author will allow the new user to pick up changes that may have
 *	been made by other users after this version of the code was distributed.
 *
 *	Note1: the majority of this code was edited with 4-space tabs.
 *	Note2: as more and more contributions are accepted, the term "author"
 *		   is becoming a mis-representation of credit.
 *
 *	Original author:	Ed Sutter
 *	Email:				esutter@lucent.com
 *	Phone:				908-582-2351
 */

#include "config.h"
#include "cpuio.h"
#include "ether.h"
#include "tfs.h"
#include "tfsprivate.h"
#include "string.h"
#include "stddefs.h"

/* Vendor specific option definitions: */
#define VS_PROXYIP		1
#define VS_PHONENUM		2
#define VS_CODER		3
#define VS_PPADHCPSRVR	4
#define VS_MINNETDELAY	5
#define VS_MAXNETDELAY	6
#define VS_APPINFO		7
#define VS_CODERCTL		8
#define VS_NAMEVAL		99

#define PPADHCPSRVR_STR	"PPADHCPSRVR"

/* ValidDHCPOffer():
 *	Target issued the DISCOVER, the incoming packet is the server's
 *	OFFER reply.  If the offer contains the vendor specific
 *	VS_PPADHCPSRVR option and the string within that
 *	option is correct, then accept the offer; by issuing a request.
 */
ValidDHCPOffer(struct	dhcphdr *dhdr)
{
	uchar	*op, *op1;

	op = op1 = 0;
	op1 = DhcpGetOption(DHCPOPT_VENDORSPECIFICINFO,dhdr+1);
	if (op1) {
		op = DhcpGetOption(VS_PPADHCPSRVR,op1+2);
	}
	if (op) {
		if (!strncmp(op+2,PPADHCPSRVR_STR,sizeof(PPADHCPSRVR_STR)-1)) {
			return(1);
		}
	}
	return(0);
}

/* buildDhcpHdr():
 *	Called by dhcpboot.c to allow application-specific header stuff to
 *	be added to header.  Return 0 if generic stuff in dhcpboot.c is to be
 *	used; else return 1 and the calling code will assume this function is
 *	dealing with it (see dhcpboot.c for basic idea).
 */
int
buildDhcpHdr(struct dhcphdr *dhcpdata)
{
	return(0);
}

/* DhcpBootpDone():
 *	Called at the end of the Bootp or Dhcp transaction.
 *	Input...
 *	bootp:	1 if BOOTP; else DHCP.
 *	dhdr:	pointer to dhcp or bootp header.
 *	vsize:	size of vendor specific area (for bootp this is fixed at 64, 
 *			but for dhcp it is variable).
 */
void
DhcpBootpDone(int bootp, struct dhcphdr *dhdr, int vsize)
{
	return;
}

void
SetPPAOption(type,op1,varname)
int		type;
uchar	*op1;
char	*varname;
{
	uchar	*op, tmp;

	op = DhcpGetOption(type,op1+2);
	if (op) {
		tmp = op[*(op+1)+2];
		op[*(op+1)+2] = 0;
		DhcpSetEnv(varname,op+2);
		op[*(op+1)+2] = tmp;
	}
}

/* DhcpVendorSpecific():
 *	Process vendor specific stuff within the incoming dhcp header.
 */
DhcpVendorSpecific(struct	dhcphdr *dhdr)
{
	ulong	ip;
	uchar	*op, *op1, buf[16], tmp;

	op = op1 = 0;
	op1 = DhcpGetOption(DHCPOPT_VENDORSPECIFICINFO,dhdr+1);
	if (op1) {
		/* Get PROXY_IP and BPROXY_IP (optionally): */
		op = DhcpGetOption(VS_PROXYIP,op1+2);
		if (op) {
			memcpy(&ip,op+2,4);
			DhcpSetEnv("PROXY_IP",IpToString(ip,buf));
			if (*(op+1) == 8) {
				memcpy(&ip,op+6,4);
				DhcpSetEnv("BPROXY_IP",IpToString(ip,buf));
			}
		}

		/* Get PPA phone numbers (1 or 2). */
		op = DhcpGetOption(VS_PHONENUM,op1+2);
		if (op) {
			char *space;
			tmp = op[*(op+1)+2];
			op[*(op+1)+2] = 0;
			space = strchr(op+2,' ');
			if (space) {
				*space = 0;
				DhcpSetEnv("LINE0_NUMBER",op+2);
				DhcpSetEnv("LINE1_NUMBER",space+1);
				*space = ' ';
			}
			else
				DhcpSetEnv("LINE0_NUMBER",op+2);
			op[*(op+1)+2] = tmp;
		}

		/* Set Coder type: */
		SetPPAOption(VS_CODER,op1,"CODER");

		/* Set Coder control: */
		SetPPAOption(VS_CODERCTL,op1,"CODERCTL");

		/* Set minimum network delay setting: */
		SetPPAOption(VS_MINNETDELAY,op1,"MIN_NET_DELAY");

		/* Set maximum network delay setting: */
		SetPPAOption(VS_MAXNETDELAY,op1,"MAX_NET_DELAY");

		/* Set appinfo: */
		SetPPAOption(VS_APPINFO,op1,"APPINFO");
	}

	/* Check for VS_NAMEVAL here...
	 * If the Vendor-Specific-Information is present, and within that
	 * information there is a sub-option of VS_NAMEVAL,
	 * then consider the content of that sub-option to be one or more
	 * strings (separated by a comma) of the format "VARNAME=VALUE".
	 * This is used to allow the DHCP server to configure shell variables
	 * into the environment prior to the monitor turning over control to
	 * the application.
	 * Two examples of VS_NAMEVAL strings:
	 * First, just one name-value combination...
	 * 	VARNAME=VALUE
	 * Second, a multiple name-value combination...
	 * 	VARNAME=VALUE,VAR1=ABC,IP=1.2.3.4
	 */

	op = op1 = 0;
	op1 = DhcpGetOption(DHCPOPT_VENDORSPECIFICINFO,dhdr+1);
	if (op1)
		op = DhcpGetOption(VS_NAMEVAL,op1+2);
	if (op) {
		int		len;
		uchar	*end, tmp;
		uchar	*name, *value, *eqsign, *comma, *base;

		op++;
		len =  (int)*op++;
		base = op;
		tmp = base[len];
		base[len] = 0;
		end = base + len;
		while (op < end) {
			eqsign = (uchar *)strchr(op,'=');
			if (!eqsign)
				break;
			name = op;
			*eqsign = 0;
			value = eqsign+1;
			comma = (uchar *)strchr(value,',');
			if (comma) {
				*comma = 0;
				op = comma+1;
			}
			else
				op = end;
			DhcpSetEnv(name,value);
			*eqsign = '=';
			*comma = ',';
		}
		base[len] = tmp;
	}
}

int
printDhcpVSopt(int vsopt, int vsoptlen, char *options)
{
	switch(vsopt) {
	case VS_PROXYIP:
		for(i=0;i<vsoptlen;i++)
			printf("%d ",(unsigned int)*options++);
		break;
	case VS_CODER:
	case VS_NAMEVAL:
	case VS_MINNETDELAY:
	case VS_MAXNETDELAY:
	case VS_PPADHCPSRVR:
	case VS_PHONENUM:
	case VS_APPINFO:
		for(i=0;i<vsoptlen;i++)
			printf("%c",*options++);
		break;
	default:
		return(0);
	}
	return(1);
}

⌨️ 快捷键说明

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