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

📄 ipcp.c

📁 自己精简过的PPPD代码。在嵌入中应用可以更好的发挥。比原先的小了很多
💻 C
📖 第 1 页 / 共 4 页
字号:
}/* * ipcp_init - Initialize IPCP. */static voidipcp_init(unit)    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 = wo->old_addrs = 1;    wo->neg_vj = 1;    wo->vj_protocol = IPCP_VJ_COMP;    wo->maxslotindex = MAX_STATES - 1; /* really max index */    wo->cflag = 1;    /* max slots and slot-id compression are currently hardwired in */    /* ppp_if.c to 16 and 1, this needs to be changed (among other */    /* things) gmc */    ao->neg_addr = ao->old_addrs = 1;    ao->neg_vj = 1;    ao->maxslotindex = MAX_STATES - 1;    ao->cflag = 1;    /*     * XXX These control whether the user may use the proxyarp     * and defaultroute options.     */    ao->proxy_arp = 1;    ao->default_route = 1;}/* * ipcp_open - IPCP is allowed to come up. */static voidipcp_open(unit)    int unit;{    fsm_open(&ipcp_fsm[unit]);    ipcp_is_open = 1;}/* * ipcp_close - Take IPCP down. */static voidipcp_close(unit, reason)    int unit;    char *reason;{    fsm_close(&ipcp_fsm[unit], reason);}/* * ipcp_lowerup - The lower layer is up. */static voidipcp_lowerup(unit)    int unit;{    fsm_lowerup(&ipcp_fsm[unit]);}/* * ipcp_lowerdown - The lower layer is down. */static voidipcp_lowerdown(unit)    int unit;{    fsm_lowerdown(&ipcp_fsm[unit]);}/* * ipcp_input - Input IPCP packet. */static voidipcp_input(unit, p, len)    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 voidipcp_protrej(unit)    int unit;{    fsm_lowerdown(&ipcp_fsm[unit]);}/* * ipcp_resetci - Reset our CI. * Called by fsm_sconfreq, Send Configure Request. */static voidipcp_resetci(f)    fsm *f;{    ipcp_options *wo = &ipcp_wantoptions[f->unit];    ipcp_options *go = &ipcp_gotoptions[f->unit];    ipcp_options *ao = &ipcp_allowoptions[f->unit];    wo->req_addr = (wo->neg_addr || wo->old_addrs) &&	(ao->neg_addr || ao->old_addrs);    if (wo->ouraddr == 0)	wo->accept_local = 1;    if (wo->hisaddr == 0)	wo->accept_remote = 1;    wo->req_dns1 = usepeerdns;	/* Request DNS addresses from the peer */    wo->req_dns2 = usepeerdns;    *go = *wo;    if (!ask_for_local)	go->ouraddr = 0;    if (ip_choose_hook) {	ip_choose_hook(&wo->hisaddr);	if (wo->hisaddr) {	    wo->accept_remote = 0;	}    }    BZERO(&ipcp_hisoptions[f->unit], sizeof(ipcp_options));}/* * ipcp_cilen - Return length of our CI. * Called by fsm_sconfreq, Send Configure Request. */static intipcp_cilen(f)    fsm *f;{    ipcp_options *go = &ipcp_gotoptions[f->unit];    ipcp_options *wo = &ipcp_wantoptions[f->unit];    ipcp_options *ho = &ipcp_hisoptions[f->unit];#define LENCIADDRS(neg)		(neg ? CILEN_ADDRS : 0)#define LENCIVJ(neg, old)	(neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)#define LENCIADDR(neg)		(neg ? 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 (go->neg_addr && go->old_addrs && !ho->neg_addr && ho->old_addrs)	go->neg_addr = 0;    if (wo->neg_vj && !go->neg_vj && !go->old_vj) {	/* try an older style of VJ negotiation */	/* 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 (LENCIADDRS(!go->neg_addr && go->old_addrs) +	    LENCIVJ(go->neg_vj, go->old_vj) +	    LENCIADDR(go->neg_addr) +	    LENCIDNS(go->req_dns1) +	    LENCIDNS(go->req_dns2)) ;}/* * ipcp_addci - Add our desired CIs to a packet. * Called by fsm_sconfreq, Send Configure Request. */static voidipcp_addci(f, ucp, lenp)    fsm *f;    u_char *ucp;    int *lenp;{    ipcp_options *go = &ipcp_gotoptions[f->unit];    int len = *lenp;#define ADDCIADDRS(opt, neg, val1, val2) \    if (neg) { \	if (len >= CILEN_ADDRS) { \	    u_int32_t l; \	    PUTCHAR(opt, ucp); \	    PUTCHAR(CILEN_ADDRS, ucp); \	    l = ntohl(val1); \	    PUTLONG(l, ucp); \	    l = ntohl(val2); \	    PUTLONG(l, ucp); \	    len -= CILEN_ADDRS; \	} else \	    go->old_addrs = 0; \    }#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, val) \    if (neg) { \	if (len >= CILEN_ADDR) { \	    u_int32_t l; \	    PUTCHAR(opt, ucp); \	    PUTCHAR(CILEN_ADDR, ucp); \	    l = ntohl(val); \	    PUTLONG(l, ucp); \	    len -= CILEN_ADDR; \	} else \	    neg = 0; \    }#define ADDCIDNS(opt, neg, addr) \    if (neg) { \	if (len >= CILEN_ADDR) { \	    u_int32_t l; \	    PUTCHAR(opt, ucp); \	    PUTCHAR(CILEN_ADDR, ucp); \	    l = ntohl(addr); \	    PUTLONG(l, ucp); \	    len -= CILEN_ADDR; \	} else \	    neg = 0; \    }    ADDCIADDRS(CI_ADDRS, !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);    ADDCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);    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. * Called by fsm_rconfack, Receive Configure ACK. * * Returns: *	0 - Ack was bad. *	1 - Ack was good. */static intipcp_ackci(f, p, len)    fsm *f;    u_char *p;    int len;{    ipcp_options *go = &ipcp_gotoptions[f->unit];    u_short cilen, citype, cishort;    u_int32_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 ACKCIADDRS(opt, neg, val1, val2) \    if (neg) { \	u_int32_t l; \	if ((len -= CILEN_ADDRS) < 0) \	    goto bad; \	GETCHAR(citype, p); \	GETCHAR(cilen, p); \	if (cilen != CILEN_ADDRS || \	    citype != opt) \	    goto bad; \	GETLONG(l, p); \	cilong = htonl(l); \	if (val1 != cilong) \	    goto bad; \	GETLONG(l, p); \	cilong = htonl(l); \	if (val2 != cilong) \	    goto 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, val) \    if (neg) { \	u_int32_t l; \	if ((len -= CILEN_ADDR) < 0) \	    goto bad; \	GETCHAR(citype, p); \	GETCHAR(cilen, p); \	if (cilen != CILEN_ADDR || \	    citype != opt) \	    goto bad; \	GETLONG(l, p); \	cilong = htonl(l); \	if (val != cilong) \	    goto bad; \    }#define ACKCIDNS(opt, neg, addr) \    if (neg) { \	u_int32_t l; \	if ((len -= CILEN_ADDR) < 0) \	    goto bad; \	GETCHAR(citype, p); \	GETCHAR(cilen, p); \	if (cilen != CILEN_ADDR || citype != opt) \	    goto bad; \	GETLONG(l, p); \	cilong = htonl(l); \	if (addr != cilong) \	    goto bad; \    }    ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,	       go->hisaddr);    ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,	    go->maxslotindex, go->cflag);    ACKCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);    ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);    ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);    /*     * If there are any remaining CIs, then this packet is bad.     */    if (len != 0)	goto bad;    return (1);bad:    IPCPDEBUG(("ipcp_ackci: received bad Ack!"));    return (0);}/* * ipcp_nakci - Peer has sent a NAK for some of our CIs. * This should not modify any state if the Nak is bad * or if IPCP is in the OPENED state. * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject. * * Returns: *	0 - Nak was bad. *	1 - Nak was good. */static intipcp_nakci(f, p, len, treat_as_reject)    fsm *f;    u_char *p;    int len;    int treat_as_reject;{    ipcp_options *go = &ipcp_gotoptions[f->unit];    u_char cimaxslotindex, cicflag;    u_char citype, cilen, *next;    u_short cishort;    u_int32_t ciaddr1, ciaddr2, l, cidnsaddr;    ipcp_options no;		/* options we've seen Naks for */    ipcp_options try;		/* options to request next time */    BZERO(&no, sizeof(no));    try = *go;    /*     * Any Nak'd 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 NAKCIADDRS(opt, neg, code) \    if ((neg) && \	(cilen = p[1]) == CILEN_ADDRS && \	len >= cilen && \	p[0] == opt) { \	len -= cilen; \	INCPTR(2, p); \	GETLONG(l, p); \	ciaddr1 = htonl(l); \	GETLONG(l, p); \	ciaddr2 = htonl(l); \	no.old_addrs = 1; \	code \    }#define NAKCIVJ(opt, neg, code) \    if (go->neg && \	((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \	len >= cilen && \	p[0] == opt) { \	len -= cilen; \	INCPTR(2, p); \	GETSHORT(cishort, p); \	no.neg = 1; \        code \    }#define NAKCIADDR(opt, neg, code) \    if (go->neg && \	(cilen = p[1]) == CILEN_ADDR && \	len >= cilen && \	p[0] == opt) { \	len -= cilen; \	INCPTR(2, p); \	GETLONG(l, p); \	ciaddr1 = htonl(l); \	no.neg = 1; \	code \    }#define NAKCIDNS(opt, neg, code) \    if (go->neg && \	((cilen = p[1]) == CILEN_ADDR) && \	len >= cilen && \	p[0] == opt) { \	len -= cilen; \	INCPTR(2, p); \	GETLONG(l, p); \	cidnsaddr = htonl(l); \	no.neg = 1; \	code \    }    /*     * Accept the peer's idea of {our,his} address, if different     * from our idea, only if the accept_{local,remote} flag is set.     */    NAKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs,	       if (treat_as_reject) {		   try.old_addrs = 0;	       } else {		   if (go->accept_local && ciaddr1) {		       /* take his idea of our address */		       try.ouraddr = ciaddr1;		   }		   if (go->accept_remote && ciaddr2) {		       /* take his idea of his address */		       try.hisaddr = ciaddr2;		   }	       }	);    /*     * Accept the peer's value of maxslotindex provided that it     * is less than what we asked for.  Turn off slot-ID compression     * if the peer wants.  Send old-style compress-type option if     * the peer wants.     */    NAKCIVJ(CI_COMPRESSTYPE, neg_vj,	    if (treat_as_reject) {		try.neg_vj = 0;	    } else if (cilen == CILEN_VJ) {		GETCHAR(cimaxslotindex, p);		GETCHAR(cicflag, p);		if (cishort == IPCP_VJ_COMP) {		    try.old_vj = 0;		    if (cimaxslotindex < go->maxslotindex)			try.maxslotindex = cimaxslotindex;		    if (!cicflag)			try.cflag = 0;		} else {		    try.neg_vj = 0;		}	    } else {		if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) {		    try.old_vj = 1;		    try.vj_protocol = cishort;		} else {		    try.neg_vj = 0;		}	    }	    );    NAKCIADDR(CI_ADDR, neg_addr,	      if (treat_as_reject) {		  try.neg_addr = 0;		  try.old_addrs = 0;	      } else if (go->accept_local && ciaddr1) {		  /* take his idea of our address */		  try.ouraddr = ciaddr1;	      }	      );    NAKCIDNS(CI_MS_DNS1, req_dns1,	     if (treat_as_reject) {		 try.req_dns1 = 0;	     } else {

⌨️ 快捷键说明

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