亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pppipcp.c

?? uCLinux下的一個TCP/IP協議棧源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 *  PPPIPCP.C	-- negotiate IP parameters
 *
 *	This implementation of PPP is declared to be in the public domain.
 *
 *	Acknowledgements and correction history may be found in PPP.C
 */

#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include "global.h"
#include "mbuf.h"
#include "iface.h"
#include "slhc.h"
#include "ppp.h"
#include "pppfsm.h"
#include "pppipcp.h"
#include "cmdparse.h"
#include "files.h"
#include "trace.h"


/* These defaults are defined in the PPP RFCs, and must not be changed */
static struct ipcp_value_s ipcp_default = {
	FALSE,			/* no need to negotiate defaults */

	0L,			/* no source address */
	0L,			/* no destination address */

	0,			/* no compression protocol */
	0,			/* no slots */
	0			/* no slot compression */
};

/* for test purposes, accept anything we understand */
static uint16 ipcp_negotiate = IPCP_N_ADDRESS | IPCP_N_COMPRESS;

static byte_t option_length[] = {
	 0,		/* unused */
	10,		/* address */
	 6		/* compression */
};


static int doipcp_local(int argc, char *argv[], void *p);
static int doipcp_open(int argc, char *argv[], void *p);
static int doipcp_pool(int argc, char *argv[], void *p);
static int doipcp_remote(int argc, char *argv[], void *p);

static int doipcp_address(int argc, char *argv[], void *p);
static int doipcp_compress(int argc, char *argv[], void *p);
static int doipcp_default(int argc, char *argv[], void *p);

static void ipcp_option(struct mbuf **bpp,
			struct ipcp_value_s *value_p,
			byte_t o_type,
			byte_t o_length,
			struct mbuf **copy_bpp);
static void ipcp_makeoptions(struct mbuf **bpp,
			struct ipcp_value_s *value_p,
			uint16 negotiating);
static struct mbuf *ipcp_makereq(struct fsm_s *fsm_p);

static int ipcp_check(struct mbuf **bpp,
			struct ipcp_s *ipcp_p,
			struct ipcp_side_s *side_p,
			struct option_hdr *option_p,
			int request);

static int ipcp_request(struct fsm_s *fsm_p,
			struct config_hdr *config,
			struct mbuf **data);
static int ipcp_ack(struct fsm_s *fsm_p,
			struct config_hdr *config,
			struct mbuf **data);
static int ipcp_nak(struct fsm_s *fsm_p,
			struct config_hdr *config,
			struct mbuf **data);
static int ipcp_reject(struct fsm_s *fsm_p,
			struct config_hdr *config,
			struct mbuf **data);

static void ipcp_reset(struct fsm_s *fsm_p);

static int32 ipcp_addr_idle(int32 addr);
static int32 ipcp_lookuppeer(char *peerid);
static int32 ipcp_poolnext(struct ipcp_s *ipcp_p);

static void ipcp_starting(struct fsm_s *fsm_p);
static void ipcp_stopping(struct fsm_s *fsm_p);

static void ipcp_closing(struct fsm_s *fsm_p);
static void ipcp_opening(struct fsm_s *fsm_p);

static void ipcp_free(struct fsm_s *fsm_p);


static struct fsm_constant_s ipcp_constants = {
	"IPcp",
	PPP_IPCP_PROTOCOL,
	0x00FE,				/* codes 1-7 recognized */

	IPcp,
	IPCP_REQ_TRY,
	IPCP_NAK_TRY,
	IPCP_TERM_TRY,
	IPCP_TIMEOUT * 1000L,

	ipcp_free,

	ipcp_reset,
	ipcp_starting,
	ipcp_opening,
	ipcp_closing,
	ipcp_stopping,

	ipcp_makereq,
	ipcp_request,
	ipcp_ack,
	ipcp_nak,
	ipcp_reject,
};


/************************************************************************/

/* "ppp <iface> ipcp" subcommands */
static struct cmds IPcpcmds[] = {
	"close",	doppp_close,	0,	0,	NULL,
	"listen",	doppp_passive,	0,	0,	NULL,
	"local",	doipcp_local,	0,	0,	NULL,
	"open",		doipcp_open,	0,	0,	NULL,
	"pool",		doipcp_pool,	0,	0,	NULL,
	"remote",	doipcp_remote,	0,	0,	NULL,
	"timeout",	doppp_timeout,	0,	0,	NULL,
	"try",		doppp_try,	0,	0,	NULL,
	NULL,
};

/* "ppp <iface> ipcp {local | remote}" subcommands */
static struct cmds IPcpside_cmds[] = {
	"address",	doipcp_address,	0,	0,	NULL,
	"compress",	doipcp_compress,0,	0,	NULL,
	"default",	doipcp_default,	0,	0,	NULL,
	NULL,
};


int
doppp_ipcp(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	register struct iface *ifp = p;
	register struct ppp_s *ppp_p = ifp->edv;

	return subcmd(IPcpcmds, argc, argv, &(ppp_p->fsm[IPcp]));
}


static int
doipcp_local(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct fsm_s *fsm_p = p;
	struct ipcp_s *ipcp_p = fsm_p->pdv;
	return subcmd(IPcpside_cmds, argc, argv, &(ipcp_p->local));
}


static int
doipcp_open(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct fsm_s *fsm_p = p;

	doppp_active( argc, argv, p );

	if ( fsm_p->ppp_p->phase == pppREADY ) {
		fsm_start( fsm_p );
	}
	return 0;
}


/* Set a pool of peer addresses for PPP interface */
static int
doipcp_pool(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct fsm_s *fsm_p = p;
	struct ipcp_s *ipcp_p = fsm_p->pdv;
	int32 pool_addr;
	int pool_cnt;

	if (argc < 2) {
		if ( ipcp_p->peer_min == 0L ) {
			printf("None");
		} else {
			printf("%s thru ", inet_ntoa(ipcp_p->peer_min));
			printf("%s\n", inet_ntoa(ipcp_p->peer_max));
		}
		return 0;
	}

	if ((pool_addr = resolve(argv[1])) == 0L) {
		printf(Badhost,argv[1]);
	}

	/* May specify a consecutive range of addresses; otherwise assume 1 */
	if (argc < 3)
		pool_cnt = 1;
	else
		pool_cnt = (int)strtol( argv[2], NULL, 0 );

	if (pool_cnt <= 0) {
		printf("Pool count %s (%d) must be > 0\n");
		return -1;
	}

	ipcp_p->peer_min = pool_addr;
	ipcp_p->peer_max = pool_addr + pool_cnt - 1;
	return 0;
}


static int
doipcp_remote(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct fsm_s *fsm_p = p;
	struct ipcp_s *ipcp_p = fsm_p->pdv;
	return subcmd(IPcpside_cmds, argc, argv, &(ipcp_p->remote));
}


/************************************************************************/
/* Set addresses for PPP interface */
static int
doipcp_address(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct ipcp_side_s *side_p = p;
	int32 x32;

	if (argc < 2) {
		printf("%s\n", inet_ntoa(side_p->want.address));
		return 0;
	} else if ( stricmp(argv[1],"allow") == 0 ) {
		return bit16cmd( &(side_p->will_negotiate), IPCP_N_ADDRESS,
			"Allow Address", --argc, &argv[1] );
	}
	if ((x32 = resolve(argv[1])) == 0L) {
		printf(Badhost,argv[1]);
	}
	side_p->want.address = x32;
	side_p->want.negotiate |= IPCP_N_ADDRESS;
	return 0;
}


/* Set IP compression type for PPP interface */
static int
doipcp_compress(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct ipcp_side_s *side_p = p;

	if (argc < 2) {
		if ( side_p->want.negotiate & IPCP_N_COMPRESS ) {
			switch ( side_p->want.compression ) {
			case PPP_COMPR_PROTOCOL:
				printf("TCP header compression enabled; "
					"Slots = %d, slot compress = %x\n",
					side_p->want.slots,
					side_p->want.slot_compress);
				break;
			default:
				printf("0x%04x\n", side_p->want.compression);
				break;
			};
		} else {
			printf("None\n");
		}
	} else if ( stricmp(argv[1],"allow") == 0 ) {
		return bit16cmd( &(side_p->will_negotiate), IPCP_N_COMPRESS,
			"Allow Compression", --argc, &argv[1] );
	} else if ( stricmp(argv[1],"tcp") == 0
		 || stricmp(argv[1],"vj") == 0 ) {
		side_p->want.compression = PPP_COMPR_PROTOCOL;
		if ( argc >= 3 ) {
			side_p->want.slots = strtol(argv[2],NULL,0);
			if ( side_p->want.slots < 1 || side_p->want.slots > 255 ) {
				printf( "slots must be in range 1 to 255" );
				return 1;
			}
		} else {
			side_p->want.slots = IPCP_SLOT_DEFAULT;
		}
		if ( argc >= 4 ) {
			side_p->want.slot_compress = strtol(argv[3],NULL,0);
		} else {
			side_p->want.slot_compress = IPCP_SLOT_COMPRESS;
		}
		side_p->want.negotiate |= IPCP_N_COMPRESS;
	} else if (stricmp(argv[1],"none") == 0) {
		side_p->want.negotiate &= ~IPCP_N_COMPRESS;
	} else {
		printf("allow tcp none\n");
		return 1;
	}
	return 0;
}


static int
doipcp_default(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct ipcp_side_s *side_p = p;

	ASSIGN( side_p->want, ipcp_default );
	return 0;
}


/************************************************************************/
/*			E V E N T   P R O C E S S I N G			*/
/************************************************************************/

static void
ipcp_option( bpp, value_p, o_type, o_length, copy_bpp )
struct mbuf **bpp;
struct ipcp_value_s *value_p;
byte_t o_type;
byte_t o_length;
struct mbuf **copy_bpp;
{
	struct mbuf *bp;
	register uint8 *cp;
	register int toss = o_length - OPTION_HDR_LEN;

	if ((bp = alloc_mbuf(o_length)) == NULL) {
		return;
	}
	cp = bp->data;
	*cp++ = o_type;
	*cp++ = o_length;

	switch ( o_type ) {
	case IPCP_ADDRESS:
		cp = put32(cp, value_p->address);
		cp = put32(cp, value_p->other);
		toss -= 8;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS) {
	trace_log(PPPiface, "    making IP source address: %s",
		inet_ntoa(value_p->address));
	trace_log(PPPiface, "    making IP destination address %s",
		inet_ntoa(value_p->other));
}
#endif
		break;

	case IPCP_COMPRESS:
		cp = put16(cp, value_p->compression);
		toss -= 2;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS)
	trace_log(PPPiface, "    making IP compression 0x%04x",
		value_p->compression);
#endif
		if ( value_p->compression == PPP_COMPR_PROTOCOL ) {
			*cp++ = value_p->slots - 1;
			*cp++ = value_p->slot_compress;
			toss -= 2;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS)
	trace_log(PPPiface, "    with IP compression slots %d, flag %x",
		value_p->slots,
		value_p->slot_compress);
#endif
		}
		break;

	default:
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS)
	trace_log(PPPiface, "    making unimplemented type %d", o_type);
#endif
		break;
	};

	while ( toss-- > 0 ) {
		*cp++ = pullchar(copy_bpp);
	}
	bp->cnt += o_length;
	append(bpp, &bp);
}


/************************************************************************/
/* Build a list of options */
static void
ipcp_makeoptions(bpp, value_p, negotiating)
struct mbuf **bpp;
struct ipcp_value_s *value_p;
uint16 negotiating;
{
	register int o_type;

	PPP_DEBUG_ROUTINES("ipcp_makeoptions()");

	for ( o_type = 1; o_type <= IPCP_OPTION_LIMIT; o_type++ ) {
		if (negotiating & (1 << o_type)) {
			ipcp_option( bpp, value_p,
				o_type, option_length[ o_type ], NULL);
		}
	}
}


/************************************************************************/
/* Build a request to send to remote host */
static struct mbuf *
ipcp_makereq(fsm_p)
struct fsm_s *fsm_p;
{
	struct ipcp_s *ipcp_p = fsm_p->pdv;
	struct mbuf *req_bp = NULL;

	PPP_DEBUG_ROUTINES("ipcp_makereq()");

	ipcp_makeoptions( &req_bp, &(ipcp_p->local.work),
				ipcp_p->local.work.negotiate );
	return(req_bp);
}


/************************************************************************/
/* Check the options, updating the working values.
 * Returns -1 if ran out of data, ACK/NAK/REJ as appropriate.
 */
static int
ipcp_check( bpp, ipcp_p, side_p, option_p, request )
struct mbuf **bpp;
struct ipcp_s *ipcp_p;
struct ipcp_side_s *side_p;
struct option_hdr *option_p;
int request;
{
	int toss = option_p->len - OPTION_HDR_LEN;
	int option_result = CONFIG_ACK;		/* Assume good values */
	int test;

	switch(option_p->type) {
	case IPCP_ADDRESS:
		side_p->work.address = pull32(bpp);
		side_p->work.other = pull32(bpp);
		toss -= 8;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS) {
	trace_log(PPPiface, "    checking IP source address: %s",
		inet_ntoa(side_p->work.address));
	trace_log(PPPiface, "    checking IP destination address %s",
		inet_ntoa(side_p->work.other));
}
#endif
		if ( !request ) {
			/* override any undesirable changes */
			if (ipcp_p->remote.want.address != 0L) {
				ipcp_p->local.work.other
					= ipcp_p->remote.want.address;
			}
			if (ipcp_p->local.want.address != 0L) {
				ipcp_p->local.work.address
					= ipcp_p->local.want.address;
			}
			break;
		}

		/* Ensure that addresses match */
		if (ipcp_p->remote.work.address == ipcp_p->remote.want.address) {
			if (ipcp_p->remote.want.address == 0L) {
				/* don't know address either */
				option_result = CONFIG_REJ;
			}
		} else if (ipcp_p->remote.want.address == 0L) {
			ipcp_p->local.work.other = ipcp_p->remote.work.address;
		} else {
			ipcp_p->remote.work.address = ipcp_p->remote.want.address;
			option_result = CONFIG_NAK;
		}

		if (ipcp_p->remote.work.other == ipcp_p->local.want.address) {
			if (ipcp_p->local.want.address == 0L) {
				/* don't know address either */
				option_result = CONFIG_REJ;
			}
		} else if (ipcp_p->local.want.address == 0L) {
			ipcp_p->local.work.address = ipcp_p->remote.work.other;
		} else {
			option_result = CONFIG_NAK;
			ipcp_p->remote.work.other = ipcp_p->local.want.address;
		}
		break;

	case IPCP_COMPRESS:
		side_p->work.compression = pull16(bpp);
		toss -= 2;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS)
	trace_log(PPPiface, "    checking IP compression 0x%04x",
		side_p->work.compression);
#endif
		/* Check if requested type is acceptable */
		switch ( side_p->work.compression ) {
		case PPP_COMPR_PROTOCOL:
			if ( (test = pullchar(bpp)) == -1 ) {
				return -1;
			}
			if ( (side_p->work.slots = test + 1) < IPCP_SLOT_LO) {
				side_p->work.slots = IPCP_SLOT_LO;
				option_result = CONFIG_NAK;
			} else if (side_p->work.slots > IPCP_SLOT_HI) {
				side_p->work.slots = IPCP_SLOT_HI;
				option_result = CONFIG_NAK;
			}

			if ( (test = pullchar(bpp)) == -1 ) {
				return -1;
			}
			if ( (side_p->work.slot_compress = test) > 1 ) {
				side_p->work.slot_compress = 1;
				option_result = CONFIG_NAK;
			}
			toss -= 2;
#ifdef PPP_DEBUG_OPTIONS
if (PPPtrace & PPP_DEBUG_OPTIONS)
	trace_log(PPPiface, "    with IP compression slots %d, flag %x",
		side_p->work.slots,
		side_p->work.slot_compress);
#endif
			break;

		default:
			if ( side_p->want.negotiate & IPCP_N_COMPRESS ) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品主播直播| 日韩一区二区中文字幕| 精品视频免费在线| 国产欧美日韩久久| 丝袜美腿亚洲综合| 欧美亚洲一区二区在线| 国产欧美日韩不卡免费| 麻豆91免费观看| 欧美探花视频资源| 亚洲欧美日韩综合aⅴ视频| 国产精品一级在线| 欧美一二三四在线| 亚洲一区二区三区中文字幕| av在线综合网| 中文在线资源观看网站视频免费不卡| 久久国产福利国产秒拍| 7777精品伊人久久久大香线蕉| 亚洲视频免费观看| 成人av在线播放网址| 日本一区二区高清| 国产成人精品一区二区三区四区| 日韩欧美美女一区二区三区| 亚洲成av人影院在线观看网| 在线亚洲免费视频| 亚洲综合小说图片| 欧美视频三区在线播放| 亚洲一区二区欧美| 欧美日韩国产大片| 亚洲高清不卡在线| 欧美日韩视频一区二区| 香蕉久久夜色精品国产使用方法| 91黄色免费看| 亚洲成av人**亚洲成av**| 欧美视频在线一区| 亚洲成人精品一区| 91精品国产色综合久久ai换脸| 亚洲v精品v日韩v欧美v专区| 欧美日韩在线精品一区二区三区激情| 一区二区三区精品视频在线| 91成人免费电影| 肉色丝袜一区二区| 日韩免费在线观看| 国产一区二区三区免费播放| 国产午夜亚洲精品不卡| 成人高清免费观看| 亚洲精品一二三四区| 欧美精品三级在线观看| 青椒成人免费视频| 久久免费电影网| www.99精品| 亚洲国产精品嫩草影院| 欧美一级欧美三级| 国产精品乡下勾搭老头1| 中文字幕在线不卡视频| 欧美日韩一区二区不卡| 九九**精品视频免费播放| 国产欧美一区二区精品秋霞影院| 成人v精品蜜桃久久一区| 亚洲一区二区偷拍精品| 欧美va日韩va| 91丨九色丨黑人外教| 午夜a成v人精品| 国产欧美一区二区精品性| 日本精品一级二级| 久久99国产精品免费| 国产精品久久久久久久久久久免费看| 精品视频1区2区| 国产成人午夜99999| 亚洲va欧美va人人爽午夜| 久久久亚洲综合| 欧美亚洲动漫另类| 国产成人av在线影院| 亚洲黄色免费网站| 精品女同一区二区| 欧美综合一区二区| 国产成a人亚洲| 青青草91视频| 亚洲大片在线观看| 国产精品久久久久久久浪潮网站| 日韩一区二区三区免费看 | 丁香婷婷综合色啪| 婷婷夜色潮精品综合在线| 国产日韩三级在线| 欧美大尺度电影在线| 91老师国产黑色丝袜在线| 国产在线视频一区二区| 亚洲主播在线观看| 国产精品剧情在线亚洲| 日韩精品一区二区三区swag| 欧美午夜精品久久久久久孕妇 | 日本特黄久久久高潮| 亚洲日本在线a| 国产欧美日韩精品在线| 日韩免费福利电影在线观看| 欧美日韩在线观看一区二区 | 欧美一区三区四区| 欧美视频一区在线| 在线视频一区二区三| 91美女在线观看| aaa国产一区| 国产成人亚洲综合a∨婷婷| 激情久久五月天| 蜜臀久久99精品久久久久宅男| 亚洲综合激情网| 亚洲精品欧美在线| 一区二区成人在线视频| 亚洲欧美另类久久久精品| 国产精品三级av在线播放| 国产午夜亚洲精品理论片色戒| 久久综合九色欧美综合狠狠| 日韩欧美黄色影院| 精品免费一区二区三区| xf在线a精品一区二区视频网站| 欧美一级片在线| 精品国产91乱码一区二区三区| 日韩一区和二区| 2019国产精品| 国产欧美在线观看一区| 国产精品久久久久影视| 亚洲色图在线播放| 亚洲激情欧美激情| 日韩精品亚洲一区二区三区免费| 一区二区成人在线| 全国精品久久少妇| 国产黑丝在线一区二区三区| 成人av网站在线观看免费| 91猫先生在线| 欧美区在线观看| 日韩欧美三级在线| 国产女人水真多18毛片18精品视频| 国产欧美日韩在线视频| 亚洲天堂网中文字| 亚洲成人福利片| 精品一区二区三区蜜桃| 成人综合激情网| 91九色02白丝porn| 欧美一二三区在线| 欧美经典三级视频一区二区三区| 18成人在线观看| 日韩av电影免费观看高清完整版| 国内精品视频666| 97精品电影院| 91麻豆精品国产91久久久| 久久久国际精品| 亚洲精品乱码久久久久久日本蜜臀| 亚洲成精国产精品女| 国产成人亚洲精品狼色在线| 在线观看欧美日本| 26uuu亚洲综合色欧美| 一区二区三区在线视频免费| 免费在线看成人av| 99久久精品99国产精品| 91精品麻豆日日躁夜夜躁| 日本一区二区三区高清不卡| 亚洲成人资源网| 成人av高清在线| 欧美疯狂做受xxxx富婆| 国产精品久久久久三级| 青草国产精品久久久久久| 91免费视频网| 欧美精品一区二| 亚洲成人免费看| 97se亚洲国产综合在线| 欧美成人伊人久久综合网| 亚洲日本中文字幕区| 狠狠色综合日日| 欧美日韩一区三区| 亚洲天堂久久久久久久| 国产一区二区成人久久免费影院| 欧美这里有精品| 国产精品久久久久久亚洲伦 | 婷婷综合五月天| 99精品一区二区三区| 久久午夜电影网| 首页国产欧美日韩丝袜| 色先锋aa成人| 成人免费一区二区三区在线观看| 国产一区二三区好的| 91精品国产一区二区三区蜜臀 | 亚洲天堂久久久久久久| 大尺度一区二区| 2023国产精华国产精品| 日韩国产成人精品| 欧美日韩国产影片| 一区二区视频免费在线观看| 99麻豆久久久国产精品免费优播| 欧美zozo另类异族| 麻豆freexxxx性91精品| 欧美精品v国产精品v日韩精品| 亚洲人成影院在线观看| 成人h精品动漫一区二区三区| 欧美激情在线免费观看| 国产精品一区二区三区网站| 欧美videofree性高清杂交| 蜜桃传媒麻豆第一区在线观看| 欧美高清视频www夜色资源网| 午夜婷婷国产麻豆精品| 欧美酷刑日本凌虐凌虐| 丝袜国产日韩另类美女| 日韩精品专区在线|