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

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

?? ipcp.c

?? ppp協議的lwip源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*****************************************************************************
* ipcp.c - Network PPP IP Control Protocol program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* portions Copyright (c) 1997 by Global Election Systems Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY
*
* 03-01-01 Marc Boucher <marc@mbsi.ca>
*   Ported to lwIP.
* 97-12-08 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*	Original.
*****************************************************************************/
/*
 * ipcp.c - PPP IP Control Protocol.
 *
 * Copyright (c) 1989 Carnegie Mellon University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by Carnegie Mellon University.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#include "pppconf.h"
#if PPP_SUPPORT > 0
#include "ppp.h"
#include "auth.h"
#include "fsm.h"
#include "vj.h"
#include "ipcp.h"
#include "pppdebug.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/
/* #define OLD_CI_ADDRS 1 */	/* Support deprecated address negotiation. */

/*
 * Lengths of configuration options.
 */
#define CILEN_VOID	2
#define CILEN_COMPRESS	4	/* min length for compression protocol opt. */
#define CILEN_VJ	6	/* length for RFC1332 Van-Jacobson opt. */
#define CILEN_ADDR	6	/* new-style single address option */
#define CILEN_ADDRS	10	/* old-style dual address option */



/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/
/*
 * Callbacks for fsm code.  (CI = Configuration Information)
 */
static void ipcp_resetci (fsm *);	/* Reset our CI */
static int  ipcp_cilen (fsm *);	        /* Return length of our CI */
static void ipcp_addci (fsm *, u_char *, int *); /* Add our CI */
static int  ipcp_ackci (fsm *, u_char *, int);	/* Peer ack'd our CI */
static int  ipcp_nakci (fsm *, u_char *, int);	/* Peer nak'd our CI */
static int  ipcp_rejci (fsm *, u_char *, int);	/* Peer rej'd our CI */
static int  ipcp_reqci (fsm *, u_char *, int *, int); /* Rcv CI */
static void ipcp_up (fsm *);		/* We're UP */
static void ipcp_down (fsm *);		/* We're DOWN */
#if 0
static void ipcp_script (fsm *, char *); /* Run an up/down script */
#endif
static void ipcp_finished (fsm *);	/* Don't need lower layer */

/*
 * Protocol entry points from main code.
 */
static void ipcp_init (int);
static void ipcp_open (int);
static void ipcp_close (int, char *);
static void ipcp_lowerup (int);
static void ipcp_lowerdown (int);
static void ipcp_input (int, u_char *, int);
static void ipcp_protrej (int);

static void ipcp_clear_addrs (int);

#define CODENAME(x)	((x) == CONFACK ? "ACK" : \
			 (x) == CONFNAK ? "NAK" : "REJ")



/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/
/* global vars */
ipcp_options ipcp_wantoptions[NUM_PPP];	/* Options that we want to request */
ipcp_options ipcp_gotoptions[NUM_PPP];	/* Options that peer ack'd */
ipcp_options ipcp_allowoptions[NUM_PPP];	/* Options we allow peer to request */
ipcp_options ipcp_hisoptions[NUM_PPP];	/* Options that we ack'd */

fsm ipcp_fsm[NUM_PPP];		/* IPCP fsm structure */

struct protent ipcp_protent = {
    PPP_IPCP,
    ipcp_init,
    ipcp_input,
    ipcp_protrej,
    ipcp_lowerup,
    ipcp_lowerdown,
    ipcp_open,
    ipcp_close,
#if 0
    ipcp_printpkt,
    NULL,
#endif
    1,
    "IPCP",
#if 0
    ip_check_options,
    NULL,
    ip_active_pkt
#endif
};



/*****************************/
/*** LOCAL DATA STRUCTURES ***/
/*****************************/
/* local vars */
static int cis_received[NUM_PPP];		/* # Conf-Reqs received */
static int default_route_set[NUM_PPP];	/* Have set up a default route */

static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
    ipcp_resetci,		/* Reset our Configuration Information */
    ipcp_cilen,			/* Length of our Configuration Information */
    ipcp_addci,			/* Add our Configuration Information */
    ipcp_ackci,			/* ACK our Configuration Information */
    ipcp_nakci,			/* NAK our Configuration Information */
    ipcp_rejci,			/* Reject our Configuration Information */
    ipcp_reqci,			/* Request peer's Configuration Information */
    ipcp_up,			/* Called when fsm reaches OPENED state */
    ipcp_down,			/* Called when fsm leaves OPENED state */
    NULL,				/* Called when we want the lower layer up */
    ipcp_finished,		/* Called when we want the lower layer down */
    NULL,				/* Called when Protocol-Reject received */
    NULL,				/* Retransmission is necessary */
    NULL,				/* Called to handle protocol-specific codes */
    "IPCP"				/* String name of protocol */
};



/**********************************/
/*** LOCAL FUNCTION DEFINITIONS ***/
/**********************************/

/*
 * ipcp_init - Initialize IPCP.
 */
static void ipcp_init(int unit)
{
	fsm *f = &ipcp_fsm[unit];
	ipcp_options *wo = &ipcp_wantoptions[unit];
	ipcp_options *ao = &ipcp_allowoptions[unit];
	
	f->unit = unit;
	f->protocol = PPP_IPCP;
	f->callbacks = &ipcp_callbacks;
	fsm_init(&ipcp_fsm[unit]);
	
	memset(wo, 0, sizeof(*wo));
	memset(ao, 0, sizeof(*ao));
	
	wo->neg_addr = 1;
	wo->ouraddr = 0;
#if VJ_SUPPORT > 0
	wo->neg_vj = 1;
#else
	wo->neg_vj = 0;
#endif
	wo->vj_protocol = IPCP_VJ_COMP;
	wo->maxslotindex = MAX_SLOTS - 1;
	wo->cflag = 0;
	
	wo->default_route = 1;
	
	ao->neg_addr = 1;
#if VJ_SUPPORT > 0
	ao->neg_vj = 1;
#else
	ao->neg_vj = 0;
#endif
	ao->maxslotindex = MAX_SLOTS - 1;
	ao->cflag = 1;
	
	ao->default_route = 1;
}


/*
 * ipcp_open - IPCP is allowed to come up.
 */
static void ipcp_open(int unit)
{
	fsm_open(&ipcp_fsm[unit]);
}


/*
 * ipcp_close - Take IPCP down.
 */
static void ipcp_close(int unit, char *reason)
{
	fsm_close(&ipcp_fsm[unit], reason);
}


/*
 * ipcp_lowerup - The lower layer is up.
 */
static void ipcp_lowerup(int unit)
{
	fsm_lowerup(&ipcp_fsm[unit]);
}


/*
 * ipcp_lowerdown - The lower layer is down.
 */
static void ipcp_lowerdown(int unit)
{
	fsm_lowerdown(&ipcp_fsm[unit]);
}


/*
 * ipcp_input - Input IPCP packet.
 */
static void ipcp_input(int unit, u_char *p, int len)
{
	fsm_input(&ipcp_fsm[unit], p, len);
}


/*
 * ipcp_protrej - A Protocol-Reject was received for IPCP.
 *
 * Pretend the lower layer went down, so we shut up.
 */
static void ipcp_protrej(int unit)
{
	fsm_lowerdown(&ipcp_fsm[unit]);
}


/*
 * ipcp_resetci - Reset our CI.
 */
static void ipcp_resetci(fsm *f)
{
	ipcp_options *wo = &ipcp_wantoptions[f->unit];
	
	wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr;
	if (wo->ouraddr == 0)
		wo->accept_local = 1;
	if (wo->hisaddr == 0)
		wo->accept_remote = 1;
	/* Request DNS addresses from the peer */
	wo->req_dns1 = ppp_settings.usepeerdns;
	wo->req_dns2 = ppp_settings.usepeerdns;
	ipcp_gotoptions[f->unit] = *wo;
	cis_received[f->unit] = 0;
}


/*
 * ipcp_cilen - Return length of our CI.
 */
static int ipcp_cilen(fsm *f)
{
	ipcp_options *go = &ipcp_gotoptions[f->unit];
	ipcp_options *wo = &ipcp_wantoptions[f->unit];
	ipcp_options *ho = &ipcp_hisoptions[f->unit];
	
#define LENCIVJ(neg, old)	(neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)
#define LENCIADDR(neg, old)	(neg ? (old? CILEN_ADDRS : CILEN_ADDR) : 0)
#define LENCIDNS(neg)		(neg ? (CILEN_ADDR) : 0)
	
	/*
	 * First see if we want to change our options to the old
	 * forms because we have received old forms from the peer.
	 */
	if (wo->neg_addr && !go->neg_addr && !go->old_addrs) {
		/* use the old style of address negotiation */
		go->neg_addr = 1;
		go->old_addrs = 1;
	}
	if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
		/* try an older style of VJ negotiation */
		if (cis_received[f->unit] == 0) {
			/* keep trying the new style until we see some CI from the peer */
			go->neg_vj = 1;
		} else {
			/* use the old style only if the peer did */
			if (ho->neg_vj && ho->old_vj) {
				go->neg_vj = 1;
				go->old_vj = 1;
				go->vj_protocol = ho->vj_protocol;
			}
		}
	}
	
	return (LENCIADDR(go->neg_addr, go->old_addrs)
			+ LENCIVJ(go->neg_vj, go->old_vj) +
			LENCIDNS(go->req_dns1) +
			LENCIDNS(go->req_dns2));
}


/*
 * ipcp_addci - Add our desired CIs to a packet.
 */
static void ipcp_addci(fsm *f, u_char *ucp, int *lenp)
{
	ipcp_options *go = &ipcp_gotoptions[f->unit];
	int len = *lenp;
	
#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \
	if (neg) { \
		int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
		if (len >= vjlen) { \
			PUTCHAR(opt, ucp); \
			PUTCHAR(vjlen, ucp); \
			PUTSHORT(val, ucp); \
			if (!old) { \
				PUTCHAR(maxslotindex, ucp); \
				PUTCHAR(cflag, ucp); \
			} \
			len -= vjlen; \
		} else \
			neg = 0; \
	}
	
#define ADDCIADDR(opt, neg, old, val1, val2) \
	if (neg) { \
		int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \
		if (len >= addrlen) { \
			u32_t l; \
			PUTCHAR(opt, ucp); \
			PUTCHAR(addrlen, ucp); \
			l = ntohl(val1); \
			PUTLONG(l, ucp); \
			if (old) { \
				l = ntohl(val2); \
				PUTLONG(l, ucp); \
			} \
			len -= addrlen; \
		} else \
			neg = 0; \
	}

#define ADDCIDNS(opt, neg, addr) \
	if (neg) { \
		if (len >= CILEN_ADDR) { \
			u32_t l; \
			PUTCHAR(opt, ucp); \
			PUTCHAR(CILEN_ADDR, ucp); \
			l = ntohl(addr); \
			PUTLONG(l, ucp); \
			len -= CILEN_ADDR; \
		} else \
			neg = 0; \
	}
	
	ADDCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
			  go->old_addrs, go->ouraddr, go->hisaddr);
	
	ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
			go->maxslotindex, go->cflag);
	
	ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);

	ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);

	*lenp -= len;
}


/*
 * ipcp_ackci - Ack our CIs.
 *
 * Returns:
 *	0 - Ack was bad.
 *	1 - Ack was good.
 */
static int ipcp_ackci(fsm *f, u_char *p, int len)
{
	ipcp_options *go = &ipcp_gotoptions[f->unit];
	u_short cilen, citype, cishort;
	u32_t cilong;
	u_char cimaxslotindex, cicflag;
	
	/*
	 * CIs must be in exactly the same order that we sent...
	 * Check packet length and CI length at each step.
	 * If we find any deviations, then this packet is bad.
	 */
	
#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \
	if (neg) { \
		int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
		if ((len -= vjlen) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != vjlen || \
				citype != opt)  \
			goto bad; \
		GETSHORT(cishort, p); \
		if (cishort != val) \
			goto bad; \
		if (!old) { \
			GETCHAR(cimaxslotindex, p); \
			if (cimaxslotindex != maxslotindex) \
				goto bad; \
			GETCHAR(cicflag, p); \
			if (cicflag != cflag) \
				goto bad; \
		} \
	}
	
#define ACKCIADDR(opt, neg, old, val1, val2) \
	if (neg) { \

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99热精品一区二区| 伊人性伊人情综合网| 在线观看日韩电影| 99精品国产91久久久久久| 国产成人亚洲精品狼色在线| 国产风韵犹存在线视精品| 国产剧情一区二区三区| 国产在线视频不卡二| 国产原创一区二区| 精品一区二区在线观看| 国产精品66部| 盗摄精品av一区二区三区| www.欧美精品一二区| 91免费观看视频| 色素色在线综合| 欧美日韩国产影片| 欧美一区二区三区四区久久| 精品少妇一区二区三区免费观看 | 国产剧情一区在线| 国产精品一级片| 成人18视频日本| 在线影院国内精品| 在线播放中文一区| 久久亚洲春色中文字幕久久久| 国产日韩三级在线| 亚洲色图19p| 丝袜诱惑亚洲看片| 国产一区不卡在线| 色一情一伦一子一伦一区| 欧美中文字幕一区二区三区| 欧美高清精品3d| www亚洲一区| 亚洲精品久久久蜜桃| 青青草国产精品97视觉盛宴| 国产成人精品亚洲777人妖 | 亚洲自拍偷拍综合| 石原莉奈一区二区三区在线观看| 捆绑调教美女网站视频一区| 国产**成人网毛片九色| 欧美性猛片aaaaaaa做受| 日韩精品一区二区三区视频播放| 国产精品久久久久桃色tv| 五月天激情综合网| 成人网在线免费视频| 在线综合视频播放| 自拍偷拍国产亚洲| 九色综合国产一区二区三区| 91福利在线观看| 国产午夜精品一区二区三区视频| 一区二区在线电影| 国产河南妇女毛片精品久久久| 一本色道亚洲精品aⅴ| 26uuu精品一区二区在线观看| 国产精品理伦片| 黄网站免费久久| 欧美日韩你懂的| 中文字幕一区二区视频| 国产一区二区伦理| 3atv一区二区三区| 亚洲h动漫在线| 91丨九色丨蝌蚪丨老版| 国产日产欧美精品一区二区三区| 日韩欧美一区二区免费| 久久久精品国产免大香伊| 婷婷国产在线综合| 欧美中文一区二区三区| 亚洲手机成人高清视频| 成人激情午夜影院| 国产色产综合色产在线视频| 自拍视频在线观看一区二区| 日韩国产高清在线| 91免费观看在线| 久久久不卡网国产精品一区| 亚洲一区在线观看免费观看电影高清| 久久超碰97中文字幕| 制服丝袜亚洲网站| 中文字幕av一区二区三区高| 国产精品12区| 国产色爱av资源综合区| 国产精品一区免费在线观看| 久久久亚洲高清| 国产成人免费av在线| 国产亚洲精品aa| 成人午夜在线视频| 日韩一区在线播放| 91久久免费观看| 午夜精品福利在线| 欧美一区二区免费| 国产麻豆9l精品三级站| 久久免费国产精品| 波多野结衣在线一区| 亚洲日本在线视频观看| 在线影院国内精品| 日韩激情在线观看| 久久久精品国产免大香伊| 成人免费视频caoporn| 亚洲欧美一区二区三区孕妇| 欧美图区在线视频| 乱中年女人伦av一区二区| 久久久久久久久久久久久久久99| 成人在线一区二区三区| 亚洲精品免费一二三区| 欧美电影一区二区| 国产精品1区2区| 亚洲乱码精品一二三四区日韩在线 | 亚洲精品伦理在线| 9l国产精品久久久久麻豆| 亚洲精品免费一二三区| 6080yy午夜一二三区久久| 毛片不卡一区二区| 欧美国产精品一区二区| 一本大道综合伊人精品热热 | 日韩高清电影一区| 久久先锋影音av| 日韩一区二区在线播放| 国产麻豆精品在线观看| 亚洲综合男人的天堂| 精品久久久久av影院 | 亚洲视频在线观看一区| 91精品国产综合久久久久| 成人精品gif动图一区| 日韩精品午夜视频| 国产精品视频一二三区| 91精品国产入口| 91蜜桃婷婷狠狠久久综合9色| 日韩福利视频网| 亚洲欧美激情小说另类| 精品国产亚洲在线| 欧美日韩小视频| 9l国产精品久久久久麻豆| 另类小说综合欧美亚洲| 亚洲一区二区三区四区在线观看 | 日本女优在线视频一区二区| 日韩一区欧美小说| 久久九九全国免费| 日韩欧美一区二区视频| 欧美三级资源在线| 91小视频免费观看| 成人污视频在线观看| 激情成人综合网| 美腿丝袜一区二区三区| 亚洲第一狼人社区| 一区二区不卡在线播放 | 亚洲图片一区二区| 亚洲男人的天堂av| 日韩理论片一区二区| 国产精品不卡在线观看| 国产欧美综合在线观看第十页| 日韩一级片在线播放| 欧美肥大bbwbbw高潮| 欧美日韩一区二区三区四区| 91女人视频在线观看| 99精品黄色片免费大全| 95精品视频在线| 91在线无精精品入口| 91色在线porny| 99精品欧美一区二区蜜桃免费| 国产成人av影院| 国产91丝袜在线播放0| 国产精品一区二区果冻传媒| 国产一区91精品张津瑜| 国产精品一区二区x88av| 粉嫩高潮美女一区二区三区| 国产高清精品久久久久| 丰满亚洲少妇av| 99国产精品久久久久久久久久| 大胆亚洲人体视频| 91影院在线免费观看| 色综合夜色一区| 欧美系列在线观看| 日韩欧美在线不卡| 国产亚洲欧美日韩日本| 日韩一区在线播放| 午夜av一区二区三区| 精品一二三四在线| 高清shemale亚洲人妖| 91色视频在线| 欧美日韩黄色影视| 欧美精品一区二区久久久| 国产精品丝袜在线| 一区二区三区欧美日韩| 日韩黄色小视频| 国产成人亚洲精品狼色在线| 色婷婷久久一区二区三区麻豆| 欧美中文字幕不卡| 久久欧美一区二区| 一区二区三区波多野结衣在线观看| 亚洲成人精品一区| 国产一区二区调教| 一本大道久久a久久综合| 欧美二区三区的天堂| 中日韩免费视频中文字幕| 亚洲r级在线视频| 国产99久久久国产精品潘金| 91国内精品野花午夜精品| 欧美videos中文字幕| 亚洲激情自拍视频| 久久99国产精品免费| 欧美色精品天天在线观看视频| 精品国产91久久久久久久妲己|