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

📄 rtemsmain.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
	pppd_kill_link = 0;	if (demand)	    demand_discard();	t = need_holdoff? holdoff: 0;	if (holdoff_hook)	    t = (*holdoff_hook)();	if (t > 0) {	    new_phase(PHASE_HOLDOFF);	    TIMEOUT(holdoff_end, NULL, t);	    do {   	        wait_input(timeleft(&timo));		calltimeout();		if (pppd_kill_link) {		    pppd_kill_link = 0;		    new_phase(PHASE_DORMANT); /* allow signal to end holdoff */		}	    } while (pppd_phase == PHASE_HOLDOFF);	    if (!persist)		break;	}    }    die(pppd_status);    return pppd_status;}/* * holdoff_end - called via a timeout when the holdoff period ends. */static voidholdoff_end(arg)    void *arg;{    new_phase(PHASE_DORMANT);}/* List of protocol names, to make our messages a little more informative. */struct protocol_list {    u_short	proto;    const char	*name;} protocol_list[] = {    { 0x21,	"IP" },    { 0x23,	"OSI Network Layer" },    { 0x25,	"Xerox NS IDP" },    { 0x27,	"DECnet Phase IV" },    { 0x29,	"Appletalk" },    { 0x2b,	"Novell IPX" },    { 0x2d,	"VJ compressed TCP/IP" },    { 0x2f,	"VJ uncompressed TCP/IP" },    { 0x31,	"Bridging PDU" },    { 0x33,	"Stream Protocol ST-II" },    { 0x35,	"Banyan Vines" },    { 0x39,	"AppleTalk EDDP" },    { 0x3b,	"AppleTalk SmartBuffered" },    { 0x3d,	"Multi-Link" },    { 0x3f,	"NETBIOS Framing" },    { 0x41,	"Cisco Systems" },    { 0x43,	"Ascom Timeplex" },    { 0x45,	"Fujitsu Link Backup and Load Balancing (LBLB)" },    { 0x47,	"DCA Remote Lan" },    { 0x49,	"Serial Data Transport Protocol (PPP-SDTP)" },    { 0x4b,	"SNA over 802.2" },    { 0x4d,	"SNA" },    { 0x4f,	"IP6 Header Compression" },    { 0x6f,	"Stampede Bridging" },    { 0xfb,	"single-link compression" },    { 0xfd,	"1st choice compression" },    { 0x0201,	"802.1d Hello Packets" },    { 0x0203,	"IBM Source Routing BPDU" },    { 0x0205,	"DEC LANBridge100 Spanning Tree" },    { 0x0231,	"Luxcom" },    { 0x0233,	"Sigma Network Systems" },    { 0x8021,	"Internet Protocol Control Protocol" },    { 0x8023,	"OSI Network Layer Control Protocol" },    { 0x8025,	"Xerox NS IDP Control Protocol" },    { 0x8027,	"DECnet Phase IV Control Protocol" },    { 0x8029,	"Appletalk Control Protocol" },    { 0x802b,	"Novell IPX Control Protocol" },    { 0x8031,	"Bridging NCP" },    { 0x8033,	"Stream Protocol Control Protocol" },    { 0x8035,	"Banyan Vines Control Protocol" },    { 0x803d,	"Multi-Link Control Protocol" },    { 0x803f,	"NETBIOS Framing Control Protocol" },    { 0x8041,	"Cisco Systems Control Protocol" },    { 0x8043,	"Ascom Timeplex" },    { 0x8045,	"Fujitsu LBLB Control Protocol" },    { 0x8047,	"DCA Remote Lan Network Control Protocol (RLNCP)" },    { 0x8049,	"Serial Data Control Protocol (PPP-SDCP)" },    { 0x804b,	"SNA over 802.2 Control Protocol" },    { 0x804d,	"SNA Control Protocol" },    { 0x804f,	"IP6 Header Compression Control Protocol" },    { 0x006f,	"Stampede Bridging Control Protocol" },    { 0x80fb,	"Single Link Compression Control Protocol" },    { 0x80fd,	"Compression Control Protocol" },    { 0xc021,	"Link Control Protocol" },    { 0xc023,	"Password Authentication Protocol" },    { 0xc025,	"Link Quality Report" },    { 0xc027,	"Shiva Password Authentication Protocol" },    { 0xc029,	"CallBack Control Protocol (CBCP)" },    { 0xc081,	"Container Control Protocol" },    { 0xc223,	"Challenge Handshake Authentication Protocol" },    { 0xc281,	"Proprietary Authentication Protocol" },    { 0,	NULL },};/* * protocol_name - find a name for a PPP protocol. */const char *protocol_name(proto)    int proto;{    struct protocol_list *lp;    for (lp = protocol_list; lp->proto != 0; ++lp)	if (proto == lp->proto)	    return lp->name;    return NULL;}/* * get_input - called when incoming data is available. */static voidget_input(void){    int len, i;    u_char *p;    u_short protocol;    struct protent *protp;    p = inpacket_buf;	/* point to beginning of packet buffer */    len = read_packet(inpacket_buf);    if (len < 0)	return;    if (len == 0) {	notice("Modem hangup");	hungup = 1;	pppd_status = EXIT_HANGUP;	lcp_lowerdown(0);	/* serial link is no longer available */	link_terminated(0);	return;    }    if (debug /*&& (debugflags & DBG_INPACKET)*/)	dbglog("rcvd %P", p, len);    if (len < PPP_HDRLEN) {	MAINDEBUG(("io(): Received short packet."));	return;    }    p += 2;				/* Skip address and control */    GETSHORT(protocol, p);    len -= PPP_HDRLEN;    /*     * Toss all non-LCP packets unless LCP is OPEN.     */    if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) {	MAINDEBUG(("get_input: Received non-LCP packet when LCP not open."));	return;    }    /*     * Until we get past the authentication phase, toss all packets     * except LCP, LQR and authentication packets.     */    if (pppd_phase <= PHASE_AUTHENTICATE	&& !(protocol == PPP_LCP || protocol == PPP_LQR	     || protocol == PPP_PAP || protocol == PPP_CHAP)) {	MAINDEBUG(("get_input: discarding proto 0x%x in phase %d",		   protocol, pppd_phase));	return;    }    /*     * Upcall the proper protocol input routine.     */    for (i = 0; (protp = protocols[i]) != NULL; ++i) {	if (protp->protocol == protocol && protp->enabled_flag) {	    (*protp->input)(0, p, len);	    return;	}        if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag	    && protp->datainput != NULL) {	    (*protp->datainput)(0, p, len);	    return;	}    }    if (debug) {	const char *pname = protocol_name(protocol);	if (pname != NULL)	    warn("Unsupported protocol '%s' (0x%x) received", pname, protocol);	else	    warn("Unsupported protocol 0x%x received", protocol);    }    lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN);    return;}/* * new_phase - signal the start of a new phase of pppd's operation. */voidnew_phase(p)    int p;{    pppd_phase = p;    if (new_phase_hook)	(*new_phase_hook)(p);}/* * die - clean up state and exit with the specified status. */voiddie(status)    int status;{    cleanup();}/* * cleanup - restore anything which needs to be restored before we exit *//* ARGSUSED */static voidcleanup(){    sys_cleanup();    if (fd_ppp >= 0)	disestablish_ppp(ttyfd);    if (real_ttyfd >= 0)	close_tty();    sys_close();}/* * close_tty - restore the terminal device and close it. */static voidclose_tty(){    /* drop dtr to hang up */    if (!default_device && modem) {	setdtr(real_ttyfd, 0);	/*	 * This sleep is in case the serial port has CLOCAL set by default,	 * and consequently will reassert DTR when we close the device.	 */	sleep(1);    }    restore_tty(real_ttyfd);    close(real_ttyfd);    real_ttyfd = -1;}/* * update_link_stats - get stats at link termination. */voidupdate_link_stats(u)    int u;{    struct timeval now;    char numbuf[32];    if (!get_ppp_stats(u, &link_stats)	|| gettimeofday(&now, NULL) < 0)	return;    link_connect_time = now.tv_sec - start_time.tv_sec;    link_stats_valid = 1;    slprintf(numbuf, sizeof(numbuf), "%d", link_connect_time);    slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_out);    slprintf(numbuf, sizeof(numbuf), "%d", link_stats.bytes_in);}struct	callout {    struct timeval	c_time;		/* time at which to call routine */    void		*c_arg;		/* argument to routine */    void		(*c_func) __P((void *)); /* routine */    struct		callout *c_next;};static struct callout *callout = NULL;	/* Callout list */static struct timeval timenow;		/* Current time *//* * timeout - Schedule a timeout. * * Note that this timeout takes the number of seconds, NOT hz (as in * the kernel). */voidppptimeout(func, arg, time)    void (*func) __P((void *));    void *arg;    int time;{    struct callout *newp, *p, **pp;      MAINDEBUG(("Timeout %p:%p in %d seconds.", func, arg, time));      /*     * Allocate timeout.     */    if ((newp = (struct callout *) malloc(sizeof(struct callout))) == NULL)	fatal("Out of memory in timeout()!");    newp->c_arg = arg;    newp->c_func = func;    gettimeofday(&timenow, NULL);    newp->c_time.tv_sec = timenow.tv_sec + time;    newp->c_time.tv_usec = timenow.tv_usec;      /*     * Find correct place and link it in.     */    for (pp = &callout; (p = *pp); pp = &p->c_next)	if (newp->c_time.tv_sec < p->c_time.tv_sec	    || (newp->c_time.tv_sec == p->c_time.tv_sec		&& newp->c_time.tv_usec < p->c_time.tv_usec))	    break;    newp->c_next = p;    *pp = newp;}/* * untimeout - Unschedule a timeout. */voiduntimeout(func, arg)    void (*func) __P((void *));    void *arg;{    struct callout **copp, *freep;      MAINDEBUG(("Untimeout %p:%p.", func, arg));      /*     * Find first matching timeout and remove it from the list.     */    for (copp = &callout; (freep = *copp); copp = &freep->c_next)	if (freep->c_func == func && freep->c_arg == arg) {	    *copp = freep->c_next;	    free((char *) freep);	    break;	}}/* * calltimeout - Call any timeout routines which are now due. */static voidcalltimeout(){    struct callout *p;    while (callout != NULL) {	p = callout;	if (gettimeofday(&timenow, NULL) < 0)	    fatal("Failed to get time of day: %m");	if (!(p->c_time.tv_sec < timenow.tv_sec	      || (p->c_time.tv_sec == timenow.tv_sec		  && p->c_time.tv_usec <= timenow.tv_usec)))	    break;		/* no, it's not time yet */	callout = p->c_next;	(*p->c_func)(p->c_arg);	free((char *) p);    }}/* * timeleft - return the length of time until the next timeout is due. */static struct timeval *timeleft(tvp)    struct timeval *tvp;{    if (callout == NULL)	return NULL;    gettimeofday(&timenow, NULL);    tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;    tvp->tv_usec = callout->c_time.tv_usec - timenow.tv_usec;    if (tvp->tv_usec < 0) {	tvp->tv_usec += 1000000;	tvp->tv_sec -= 1;    }    if (tvp->tv_sec < 0)	tvp->tv_sec = tvp->tv_usec = 0;    return tvp;}/* * device_script - run a program to talk to the serial device * (e.g. to run the connector or disconnector script). */static int device_script(int fd, int mode, char *program){    int    iReturn = -1;    char   pScript[128];    /* copyt script into temporary location */    strcpy(pScript, program);    /* check to see if dialer was initialized */    if ( !pppd_dialer ) {      /* set default dialer to chatmain */      pppd_dialer = chatmain;    }    /* check to see if dialer is set */    if ( pppd_dialer ) {      /* call the dialer */      iReturn = (*pppd_dialer)(fd, mode, program);    }    return ( -iReturn );}/* * novm - log an error message saying we ran out of memory, and die. */voidnovm(msg)    char *msg;{    fatal("Virtual memory exhausted allocating %s\n", msg);}

⌨️ 快捷键说明

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