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

📄 ccp.c

📁 经典的ppp程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (ccp_localstate[f->unit] & RACK_PENDING && id == f->reqid) {	    ccp_localstate[f->unit] &= ~(RACK_PENDING | RREQ_REPEAT);	    UNTIMEOUT(ccp_rack_timeout, f);	}	break;    default:	return 0;    }    return 1;}/* * ccp_protrej - peer doesn't talk CCP. */static voidccp_protrej(unit)    int unit;{    ccp_flags_set(unit, 0, 0);    fsm_lowerdown(&ccp_fsm[unit]);}/* * ccp_resetci - initialize at start of negotiation. */static voidccp_resetci(f)    fsm *f;{    ccp_options *go = &ccp_gotoptions[f->unit];    u_char opt_buf[16];    *go = ccp_wantoptions[f->unit];    all_rejected[f->unit] = 0;    /*     * Check whether the kernel knows about the various     * compression methods we might request.     */    if (go->bsd_compress) {	opt_buf[0] = CI_BSD_COMPRESS;	opt_buf[1] = CILEN_BSD_COMPRESS;	opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, BSD_MIN_BITS);	if (ccp_test(f->unit, opt_buf, CILEN_BSD_COMPRESS, 0) <= 0)	    go->bsd_compress = 0;    }    if (go->deflate) {	if (go->deflate_correct) {	    opt_buf[0] = CI_DEFLATE;	    opt_buf[1] = CILEN_DEFLATE;	    opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_WORKS);	    opt_buf[3] = DEFLATE_CHK_SEQUENCE;	    if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)		go->deflate_correct = 0;	}	if (go->deflate_draft) {	    opt_buf[0] = CI_DEFLATE_DRAFT;	    opt_buf[1] = CILEN_DEFLATE;	    opt_buf[2] = DEFLATE_MAKE_OPT(DEFLATE_MIN_WORKS);	    opt_buf[3] = DEFLATE_CHK_SEQUENCE;	    if (ccp_test(f->unit, opt_buf, CILEN_DEFLATE, 0) <= 0)		go->deflate_draft = 0;	}	if (!go->deflate_correct && !go->deflate_draft)	    go->deflate = 0;    }    if (go->predictor_1) {	opt_buf[0] = CI_PREDICTOR_1;	opt_buf[1] = CILEN_PREDICTOR_1;	if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_1, 0) <= 0)	    go->predictor_1 = 0;    }    if (go->predictor_2) {	opt_buf[0] = CI_PREDICTOR_2;	opt_buf[1] = CILEN_PREDICTOR_2;	if (ccp_test(f->unit, opt_buf, CILEN_PREDICTOR_2, 0) <= 0)	    go->predictor_2 = 0;    }}/* * ccp_cilen - Return total length of our configuration info. */static intccp_cilen(f)    fsm *f;{    ccp_options *go = &ccp_gotoptions[f->unit];    return (go->bsd_compress? CILEN_BSD_COMPRESS: 0)	+ (go->deflate? CILEN_DEFLATE: 0)	+ (go->predictor_1? CILEN_PREDICTOR_1: 0)	+ (go->predictor_2? CILEN_PREDICTOR_2: 0);}/* * ccp_addci - put our requests in a packet. */static voidccp_addci(f, p, lenp)    fsm *f;    u_char *p;    int *lenp;{    int res;    ccp_options *go = &ccp_gotoptions[f->unit];    u_char *p0 = p;    /*     * Add the compression types that we can receive, in decreasing     * preference order.  Get the kernel to allocate the first one     * in case it gets Acked.     */    if (go->deflate) {	p[0] = go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT;	p[1] = CILEN_DEFLATE;	p[2] = DEFLATE_MAKE_OPT(go->deflate_size);	p[3] = DEFLATE_CHK_SEQUENCE;	for (;;) {	    res = ccp_test(f->unit, p, CILEN_DEFLATE, 0);	    if (res > 0) {		p += CILEN_DEFLATE;		break;	    }	    if (res < 0 || go->deflate_size <= DEFLATE_MIN_WORKS) {		go->deflate = 0;		break;	    }	    --go->deflate_size;	    p[2] = DEFLATE_MAKE_OPT(go->deflate_size);	}	if (p != p0 && go->deflate_correct && go->deflate_draft) {	    p[0] = CI_DEFLATE_DRAFT;	    p[1] = CILEN_DEFLATE;	    p[2] = p[2 - CILEN_DEFLATE];	    p[3] = DEFLATE_CHK_SEQUENCE;	    p += CILEN_DEFLATE;	}    }    if (go->bsd_compress) {	p[0] = CI_BSD_COMPRESS;	p[1] = CILEN_BSD_COMPRESS;	p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);	if (p != p0) {	    p += CILEN_BSD_COMPRESS;	/* not the first option */	} else {	    for (;;) {		res = ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 0);		if (res > 0) {		    p += CILEN_BSD_COMPRESS;		    break;		}		if (res < 0 || go->bsd_bits <= BSD_MIN_BITS) {		    go->bsd_compress = 0;		    break;		}		--go->bsd_bits;		p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);	    }	}    }    /* XXX Should Predictor 2 be preferable to Predictor 1? */    if (go->predictor_1) {	p[0] = CI_PREDICTOR_1;	p[1] = CILEN_PREDICTOR_1;	if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_1, 0) <= 0) {	    go->predictor_1 = 0;	} else {	    p += CILEN_PREDICTOR_1;	}    }    if (go->predictor_2) {	p[0] = CI_PREDICTOR_2;	p[1] = CILEN_PREDICTOR_2;	if (p == p0 && ccp_test(f->unit, p, CILEN_PREDICTOR_2, 0) <= 0) {	    go->predictor_2 = 0;	} else {	    p += CILEN_PREDICTOR_2;	}    }    go->method = (p > p0)? p0[0]: -1;    *lenp = p - p0;}/* * ccp_ackci - process a received configure-ack, and return * 1 iff the packet was OK. */static intccp_ackci(f, p, len)    fsm *f;    u_char *p;    int len;{    ccp_options *go = &ccp_gotoptions[f->unit];    u_char *p0 = p;    if (go->deflate) {	if (len < CILEN_DEFLATE	    || p[0] != (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)	    || p[1] != CILEN_DEFLATE	    || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)	    || p[3] != DEFLATE_CHK_SEQUENCE)	    return 0;	p += CILEN_DEFLATE;	len -= CILEN_DEFLATE;	/* XXX Cope with first/fast ack */	if (len == 0)	    return 1;	if (go->deflate_correct && go->deflate_draft) {	    if (len < CILEN_DEFLATE		|| p[0] != CI_DEFLATE_DRAFT		|| p[1] != CILEN_DEFLATE		|| p[2] != DEFLATE_MAKE_OPT(go->deflate_size)		|| p[3] != DEFLATE_CHK_SEQUENCE)		return 0;	    p += CILEN_DEFLATE;	    len -= CILEN_DEFLATE;	}    }    if (go->bsd_compress) {	if (len < CILEN_BSD_COMPRESS	    || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS	    || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))	    return 0;	p += CILEN_BSD_COMPRESS;	len -= CILEN_BSD_COMPRESS;	/* XXX Cope with first/fast ack */	if (p == p0 && len == 0)	    return 1;    }    if (go->predictor_1) {	if (len < CILEN_PREDICTOR_1	    || p[0] != CI_PREDICTOR_1 || p[1] != CILEN_PREDICTOR_1)	    return 0;	p += CILEN_PREDICTOR_1;	len -= CILEN_PREDICTOR_1;	/* XXX Cope with first/fast ack */	if (p == p0 && len == 0)	    return 1;    }    if (go->predictor_2) {	if (len < CILEN_PREDICTOR_2	    || p[0] != CI_PREDICTOR_2 || p[1] != CILEN_PREDICTOR_2)	    return 0;	p += CILEN_PREDICTOR_2;	len -= CILEN_PREDICTOR_2;	/* XXX Cope with first/fast ack */	if (p == p0 && len == 0)	    return 1;    }    if (len != 0)	return 0;    return 1;}/* * ccp_nakci - process received configure-nak. * Returns 1 iff the nak was OK. */static intccp_nakci(f, p, len)    fsm *f;    u_char *p;    int len;{    ccp_options *go = &ccp_gotoptions[f->unit];    ccp_options no;		/* options we've seen already */    ccp_options try;		/* options to ask for next time */    memset(&no, 0, sizeof(no));    try = *go;    if (go->deflate && len >= CILEN_DEFLATE	&& p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)	&& p[1] == CILEN_DEFLATE) {	no.deflate = 1;	/*	 * Peer wants us to use a different code size or something.	 * Stop asking for Deflate if we don't understand his suggestion.	 */	if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL	    || DEFLATE_SIZE(p[2]) < DEFLATE_MIN_WORKS	    || p[3] != DEFLATE_CHK_SEQUENCE)	    try.deflate = 0;	else if (DEFLATE_SIZE(p[2]) < go->deflate_size)	    try.deflate_size = DEFLATE_SIZE(p[2]);	p += CILEN_DEFLATE;	len -= CILEN_DEFLATE;	if (go->deflate_correct && go->deflate_draft	    && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT	    && p[1] == CILEN_DEFLATE) {	    p += CILEN_DEFLATE;	    len -= CILEN_DEFLATE;	}    }    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS	&& p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {	no.bsd_compress = 1;	/*	 * Peer wants us to use a different number of bits	 * or a different version.	 */	if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION)	    try.bsd_compress = 0;	else if (BSD_NBITS(p[2]) < go->bsd_bits)	    try.bsd_bits = BSD_NBITS(p[2]);	p += CILEN_BSD_COMPRESS;	len -= CILEN_BSD_COMPRESS;    }    /*     * Predictor-1 and 2 have no options, so they can't be Naked.     *     * There may be remaining options but we ignore them.     */    if (f->state != OPENED)	*go = try;    return 1;}/* * ccp_rejci - reject some of our suggested compression methods. */static intccp_rejci(f, p, len)    fsm *f;    u_char *p;    int len;{    ccp_options *go = &ccp_gotoptions[f->unit];    ccp_options try;		/* options to request next time */    try = *go;    /*     * Cope with empty configure-rejects by ceasing to send     * configure-requests.     */    if (len == 0 && all_rejected[f->unit])	return -1;    if (go->deflate && len >= CILEN_DEFLATE	&& p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)	&& p[1] == CILEN_DEFLATE) {	if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)	    || p[3] != DEFLATE_CHK_SEQUENCE)	    return 0;		/* Rej is bad */	if (go->deflate_correct)	    try.deflate_correct = 0;	else	    try.deflate_draft = 0;	p += CILEN_DEFLATE;	len -= CILEN_DEFLATE;	if (go->deflate_correct && go->deflate_draft	    && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT	    && p[1] == CILEN_DEFLATE) {	    if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)		|| p[3] != DEFLATE_CHK_SEQUENCE)		return 0;		/* Rej is bad */	    try.deflate_draft = 0;	    p += CILEN_DEFLATE;	    len -= CILEN_DEFLATE;	}	if (!try.deflate_correct && !try.deflate_draft)	    try.deflate = 0;    }    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS	&& p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {	if (p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))	    return 0;	try.bsd_compress = 0;	p += CILEN_BSD_COMPRESS;	len -= CILEN_BSD_COMPRESS;    }    if (go->predictor_1 && len >= CILEN_PREDICTOR_1	&& p[0] == CI_PREDICTOR_1 && p[1] == CILEN_PREDICTOR_1) {	try.predictor_1 = 0;	p += CILEN_PREDICTOR_1;	len -= CILEN_PREDICTOR_1;    }    if (go->predictor_2 && len >= CILEN_PREDICTOR_2	&& p[0] == CI_PREDICTOR_2 && p[1] == CILEN_PREDICTOR_2) {	try.predictor_2 = 0;	p += CILEN_PREDICTOR_2;	len -= CILEN_PREDICTOR_2;    }    if (len != 0)	return 0;    if (f->state != OPENED)	*go = try;    return 1;}/* * ccp_reqci - processed a received configure-request. * Returns CONFACK, CONFNAK or CONFREJ and the packet modified * appropriately. */static intccp_reqci(f, p, lenp, dont_nak)    fsm *f;    u_char *p;    int *lenp;    int dont_nak;{    int ret, newret, res;    u_char *p0, *retp;    int len, clen, type, nb;    ccp_options *ho = &ccp_hisoptions[f->unit];

⌨️ 快捷键说明

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