From aee474b0cf18922c8b21ca56aae4067835c6a860 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 12 Oct 2001 13:43:05 +0000 Subject: 2001-10-12 Mike Siers * Update to stable working state. Congratulations Mike! :) * modem_example: Directory removed. * modem_example/16550.h, modem_example/README, modem_example/modem.c, modem_example/modem.h, modem_example/ppp.c, modem_example/ppp.h, modem_example/pppcompress.c: Files removed. * pppd/example/pppd.options: New file. * pppd/README, pppd/STATUS, pppd/cbcp.c, pppd/cbcp.h, pppd/chat.c, pppd/pppd.h, pppd/rtemsmain.c: Updated. --- c/src/exec/libnetworking/ChangeLog | 11 + c/src/libnetworking/ChangeLog | 11 + c/src/libnetworking/pppd/README | 4 + c/src/libnetworking/pppd/STATUS | 61 +- c/src/libnetworking/pppd/cbcp.c | 456 ++++++ c/src/libnetworking/pppd/cbcp.h | 26 + c/src/libnetworking/pppd/chat.c | 416 ++---- c/src/libnetworking/pppd/example/README | 7 + c/src/libnetworking/pppd/example/pppd.options | 9 + c/src/libnetworking/pppd/modem_example/16550.h | 110 -- c/src/libnetworking/pppd/modem_example/README | 7 - c/src/libnetworking/pppd/modem_example/modem.c | 1438 ------------------- c/src/libnetworking/pppd/modem_example/modem.h | 45 - c/src/libnetworking/pppd/modem_example/ppp.c | 1504 -------------------- c/src/libnetworking/pppd/modem_example/ppp.h | 7 - .../libnetworking/pppd/modem_example/pppcompress.c | 593 -------- c/src/libnetworking/pppd/pppd.h | 2 + c/src/libnetworking/pppd/rtemsmain.c | 10 +- 18 files changed, 705 insertions(+), 4012 deletions(-) create mode 100644 c/src/libnetworking/pppd/example/pppd.options delete mode 100644 c/src/libnetworking/pppd/modem_example/16550.h delete mode 100644 c/src/libnetworking/pppd/modem_example/README delete mode 100644 c/src/libnetworking/pppd/modem_example/modem.c delete mode 100644 c/src/libnetworking/pppd/modem_example/modem.h delete mode 100644 c/src/libnetworking/pppd/modem_example/ppp.c delete mode 100644 c/src/libnetworking/pppd/modem_example/ppp.h delete mode 100644 c/src/libnetworking/pppd/modem_example/pppcompress.c (limited to 'c/src') diff --git a/c/src/exec/libnetworking/ChangeLog b/c/src/exec/libnetworking/ChangeLog index c43670823c..5e34d26853 100644 --- a/c/src/exec/libnetworking/ChangeLog +++ b/c/src/exec/libnetworking/ChangeLog @@ -1,3 +1,14 @@ +2001-10-12 Mike Siers + + * Update to stable working state. Congratulations Mike! :) + * modem_example: Directory removed. + * modem_example/16550.h, modem_example/README, modem_example/modem.c, + modem_example/modem.h, modem_example/ppp.c, modem_example/ppp.h, + modem_example/pppcompress.c: Files removed. + * pppd/example/pppd.options: New file. + * pppd/README, pppd/STATUS, pppd/cbcp.c, pppd/cbcp.h, pppd/chat.c, + pppd/pppd.h, pppd/rtemsmain.c: Updated. + 2001-10-11 Ralf Corsepius * .cvsignore: Add autom4te.cache for autoconf > 2.52. diff --git a/c/src/libnetworking/ChangeLog b/c/src/libnetworking/ChangeLog index c43670823c..5e34d26853 100644 --- a/c/src/libnetworking/ChangeLog +++ b/c/src/libnetworking/ChangeLog @@ -1,3 +1,14 @@ +2001-10-12 Mike Siers + + * Update to stable working state. Congratulations Mike! :) + * modem_example: Directory removed. + * modem_example/16550.h, modem_example/README, modem_example/modem.c, + modem_example/modem.h, modem_example/ppp.c, modem_example/ppp.h, + modem_example/pppcompress.c: Files removed. + * pppd/example/pppd.options: New file. + * pppd/README, pppd/STATUS, pppd/cbcp.c, pppd/cbcp.h, pppd/chat.c, + pppd/pppd.h, pppd/rtemsmain.c: Updated. + 2001-10-11 Ralf Corsepius * .cvsignore: Add autom4te.cache for autoconf > 2.52. diff --git a/c/src/libnetworking/pppd/README b/c/src/libnetworking/pppd/README index 0615100344..7481988d83 100644 --- a/c/src/libnetworking/pppd/README +++ b/c/src/libnetworking/pppd/README @@ -16,5 +16,9 @@ provided the modem driver as well. The port was updated to 2.3.11 by Mike Siers who added an example test. + +Updated the chat program to return the correct errors and support +the ABORT commands. Removed some dead code and did a lot of +testing on a new Coldfire BSP. Version seems to be very stable. ================================================================= diff --git a/c/src/libnetworking/pppd/STATUS b/c/src/libnetworking/pppd/STATUS index 72aa80d792..ddb70c4b58 100644 --- a/c/src/libnetworking/pppd/STATUS +++ b/c/src/libnetworking/pppd/STATUS @@ -2,39 +2,28 @@ # $Id$ # - -Notes from Mike Siers -======================================== - -I know that several users have tried out this version of -pppd under RTEMS. It has been successfully used as both -a client and server. Below are the only issues that I -know of. - -1) Large packet ping causes RTEMS box to lock up - If you ping the RTEMS box over the ppp link with a packet - size greater than 1500, the RTEMS box locks up. I think - the problem is in the pppd ethernet driver. - -2) Upgrade the libnetworking/modem files - This upgrade did not modify the ppp ethernet driver files - in the libnetworking/modem directory. Would like to - upgrade these files. Hopefully, it will fix the large - packet ping problem. - -3) The files cbcp.c and cbcp.h provide a callback feature - that I have not tried to compile or use. The files in - this directory are identical to the 2.3.11 versions. - for completeness. - - -JOEL: Are the modifications to the original pppd such that the - real maintainers will accept them? - -No. The pppd 2.3.11 branch is an old branch. The current -version is 2.4.x and it contains alot of extra items that -just did not make sense to have in an embedded environment. -I could make the RTEMS changes compatible with the standard -2.3.11 release by using compilation flags. I have not -contacted the maintainers to see if they are interested. - +The pppd application seems to very stable. It has been tested using +the example application with the i386/pc586 and m68k/sbc5206e BSPs. +The tests were executed using a null modem serial cable to connect +with a UNIX box running either the ppp or pppd application and with +an external modem to dial up a local ISP. + +If you have problems getting your target to make consistent connections +with an ISP, the problem is most likely with the ppp options. First +try using the "novj" and "noaccomp" options. If you have questions +about what other option values are available for the rtems_pppd_set_option +function, please look at the pppd.8 man page file or the the source code. +The majority of options that are documented in man page should work +with this function call. + +The pppd application requires the BSP termios driver support task +driven I/O. Below is a list of known issues that need to be resolved: + + - pppd locks up when it receives large packet pings (> 1500 bytes) + - pppd occasionaly locks up with mbuf allocation error + (problem is rare and may be BSP related) + +If you find any other problems or fix some problems, please post your +changes to the RTEMS mailing list. + +Good Luck diff --git a/c/src/libnetworking/pppd/cbcp.c b/c/src/libnetworking/pppd/cbcp.c index e69de29bb2..eb60a8e249 100644 --- a/c/src/libnetworking/pppd/cbcp.c +++ b/c/src/libnetworking/pppd/cbcp.c @@ -0,0 +1,456 @@ +/* + * cbcp - Call Back Configuration Protocol. + * + * Copyright (c) 1995 Pedro Roque Marques + * 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 Pedro Roque Marques. The name of the author 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. + */ + +#define RCSID "$Id$" + +#include +#include +#include +#include + +#include "pppd.h" +#include "cbcp.h" +#include "fsm.h" +#include "lcp.h" + +static const char rcsid[] = RCSID; + +/* + * Options. + */ +static int setcbcp __P((char **)); + +static option_t cbcp_option_list[] = { + { "callback", o_special, setcbcp, + "Ask for callback" }, + { NULL } +}; + +/* + * Protocol entry points. + */ +static void cbcp_init __P((int unit)); +static void cbcp_open __P((int unit)); +static void cbcp_lowerup __P((int unit)); +static void cbcp_input __P((int unit, u_char *pkt, int len)); +static void cbcp_protrej __P((int unit)); +static int cbcp_printpkt __P((u_char *pkt, int len, + void (*printer) __P((void *, char *, ...)), + void *arg)); + +struct protent cbcp_protent = { + PPP_CBCP, + cbcp_init, + cbcp_input, + cbcp_protrej, + cbcp_lowerup, + NULL, + cbcp_open, + NULL, + cbcp_printpkt, + NULL, + 0, + "CBCP", + NULL, + cbcp_option_list, + NULL, + NULL, + NULL +}; + +cbcp_state cbcp[NUM_PPP]; + +/* internal prototypes */ + +static void cbcp_recvreq __P((cbcp_state *us, char *pckt, int len)); +static void cbcp_resp __P((cbcp_state *us)); +static void cbcp_up __P((cbcp_state *us)); +static void cbcp_recvack __P((cbcp_state *us, char *pckt, int len)); +static void cbcp_send __P((cbcp_state *us, u_char code, u_char *buf, int len)); + +/* option processing */ +static int +setcbcp(argv) + char **argv; +{ + lcp_wantoptions[0].neg_cbcp = 1; + cbcp_protent.enabled_flag = 1; + cbcp[0].us_number = strdup(*argv); + if (cbcp[0].us_number == 0) + novm("callback number"); + cbcp[0].us_type |= (1 << CB_CONF_USER); + cbcp[0].us_type |= (1 << CB_CONF_ADMIN); + return (1); +} + +/* init state */ +static void +cbcp_init(iface) + int iface; +{ + cbcp_state *us; + + us = &cbcp[iface]; + memset(us, 0, sizeof(cbcp_state)); + us->us_unit = iface; + us->us_type |= (1 << CB_CONF_NO); +} + +/* lower layer is up */ +static void +cbcp_lowerup(iface) + int iface; +{ + cbcp_state *us = &cbcp[iface]; + + dbglog("cbcp_lowerup"); + dbglog("want: %d", us->us_type); + + if (us->us_type == CB_CONF_USER) + dbglog("phone no: %s", us->us_number); +} + +static void +cbcp_open(unit) + int unit; +{ + dbglog("cbcp_open"); +} + +/* process an incomming packet */ +static void +cbcp_input(unit, inpacket, pktlen) + int unit; + u_char *inpacket; + int pktlen; +{ + u_char *inp; + u_char code, id; + u_short len; + + cbcp_state *us = &cbcp[unit]; + + inp = inpacket; + + if (pktlen < CBCP_MINLEN) { + error("CBCP packet is too small"); + return; + } + + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + +#if 0 + if (len > pktlen) { + error("CBCP packet: invalid length"); + return; + } +#endif + + len -= CBCP_MINLEN; + + switch(code) { + case CBCP_REQ: + us->us_id = id; + cbcp_recvreq(us, inp, len); + break; + + case CBCP_RESP: + dbglog("CBCP_RESP received"); + break; + + case CBCP_ACK: + if (id != us->us_id) + dbglog("id doesn't match: expected %d recv %d", + us->us_id, id); + + cbcp_recvack(us, inp, len); + break; + + default: + break; + } +} + +/* protocol was rejected by foe */ +void cbcp_protrej(int iface) +{ +} + +char *cbcp_codenames[] = { + "Request", "Response", "Ack" +}; + +char *cbcp_optionnames[] = { + "NoCallback", + "UserDefined", + "AdminDefined", + "List" +}; + +/* pretty print a packet */ +static int +cbcp_printpkt(p, plen, printer, arg) + u_char *p; + int plen; + void (*printer) __P((void *, char *, ...)); + void *arg; +{ + int code, opt, id, len, olen, delay; + u_char *pstart; + + if (plen < HEADERLEN) + return 0; + pstart = p; + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < HEADERLEN || len > plen) + return 0; + + if (code >= 1 && code <= sizeof(cbcp_codenames) / sizeof(char *)) + printer(arg, " %s", cbcp_codenames[code-1]); + else + printer(arg, " code=0x%x", code); + + printer(arg, " id=0x%x", id); + len -= HEADERLEN; + + switch (code) { + case CBCP_REQ: + case CBCP_RESP: + case CBCP_ACK: + while(len >= 2) { + GETCHAR(opt, p); + GETCHAR(olen, p); + + if (olen < 2 || olen > len) { + break; + } + + printer(arg, " <"); + len -= olen; + + if (opt >= 1 && opt <= sizeof(cbcp_optionnames) / sizeof(char *)) + printer(arg, " %s", cbcp_optionnames[opt-1]); + else + printer(arg, " option=0x%x", opt); + + if (olen > 2) { + GETCHAR(delay, p); + printer(arg, " delay = %d", delay); + } + + if (olen > 3) { + int addrt; + char str[256]; + + GETCHAR(addrt, p); + memcpy(str, p, olen - 4); + str[olen - 4] = 0; + printer(arg, " number = %s", str); + } + printer(arg, ">"); + break; + } + + default: + break; + } + + for (; len > 0; --len) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + + return p - pstart; +} + +/* received CBCP request */ +static void +cbcp_recvreq(us, pckt, pcktlen) + cbcp_state *us; + char *pckt; + int pcktlen; +{ + u_char type, opt_len, delay, addr_type; + char address[256]; + int len = pcktlen; + + address[0] = 0; + + while (len) { + dbglog("length: %d", len); + + GETCHAR(type, pckt); + GETCHAR(opt_len, pckt); + + if (opt_len > 2) + GETCHAR(delay, pckt); + + us->us_allowed |= (1 << type); + + switch(type) { + case CB_CONF_NO: + dbglog("no callback allowed"); + break; + + case CB_CONF_USER: + dbglog("user callback allowed"); + if (opt_len > 4) { + GETCHAR(addr_type, pckt); + memcpy(address, pckt, opt_len - 4); + address[opt_len - 4] = 0; + if (address[0]) + dbglog("address: %s", address); + } + break; + + case CB_CONF_ADMIN: + dbglog("user admin defined allowed"); + break; + + case CB_CONF_LIST: + break; + } + len -= opt_len; + } + + cbcp_resp(us); +} + +static void +cbcp_resp(us) + cbcp_state *us; +{ + u_char cb_type; + u_char buf[256]; + u_char *bufp = buf; + int len = 0; + + cb_type = us->us_allowed & us->us_type; + dbglog("cbcp_resp cb_type=%d", cb_type); + +#if 0 + if (!cb_type) + lcp_down(us->us_unit); +#endif + + if (cb_type & ( 1 << CB_CONF_USER ) ) { + dbglog("cbcp_resp CONF_USER"); + PUTCHAR(CB_CONF_USER, bufp); + len = 3 + 1 + strlen(us->us_number) + 1; + PUTCHAR(len , bufp); + PUTCHAR(5, bufp); /* delay */ + PUTCHAR(1, bufp); + BCOPY(us->us_number, bufp, strlen(us->us_number) + 1); + cbcp_send(us, CBCP_RESP, buf, len); + return; + } + + if (cb_type & ( 1 << CB_CONF_ADMIN ) ) { + dbglog("cbcp_resp CONF_ADMIN"); + PUTCHAR(CB_CONF_ADMIN, bufp); + len = 3; + PUTCHAR(len, bufp); + PUTCHAR(5, bufp); /* delay */ + cbcp_send(us, CBCP_RESP, buf, len); + return; + } + + if (cb_type & ( 1 << CB_CONF_NO ) ) { + dbglog("cbcp_resp CONF_NO"); + PUTCHAR(CB_CONF_NO, bufp); + len = 3; + PUTCHAR(len , bufp); + PUTCHAR(0, bufp); + cbcp_send(us, CBCP_RESP, buf, len); + start_networks(); + return; + } +} + +static void +cbcp_send(us, code, buf, len) + cbcp_state *us; + u_char code; + u_char *buf; + int len; +{ + u_char *outp; + int outlen; + + outp = outpacket_buf; + + outlen = 4 + len; + + MAKEHEADER(outp, PPP_CBCP); + + PUTCHAR(code, outp); + PUTCHAR(us->us_id, outp); + PUTSHORT(outlen, outp); + + if (len) + BCOPY(buf, outp, len); + + output(us->us_unit, outpacket_buf, outlen + PPP_HDRLEN); +} + +static void +cbcp_recvack(us, pckt, len) + cbcp_state *us; + char *pckt; + int len; +{ + u_char type, delay, addr_type; + int opt_len; + char address[256]; + + if (len) { + GETCHAR(type, pckt); + GETCHAR(opt_len, pckt); + + if (opt_len > 2) + GETCHAR(delay, pckt); + + if (opt_len > 4) { + GETCHAR(addr_type, pckt); + memcpy(address, pckt, opt_len - 4); + address[opt_len - 4] = 0; + if (address[0]) + dbglog("peer will call: %s", address); + } + if (type == CB_CONF_NO) + return; + } + + cbcp_up(us); +} + +/* ok peer will do callback */ +static void +cbcp_up(us) + cbcp_state *us; +{ + persist = 0; + lcp_close(0, "Call me back, please"); + status = EXIT_CALLBACK; +} diff --git a/c/src/libnetworking/pppd/cbcp.h b/c/src/libnetworking/pppd/cbcp.h index e69de29bb2..c2ab3f6899 100644 --- a/c/src/libnetworking/pppd/cbcp.h +++ b/c/src/libnetworking/pppd/cbcp.h @@ -0,0 +1,26 @@ +#ifndef CBCP_H +#define CBCP_H + +typedef struct cbcp_state { + int us_unit; /* Interface unit number */ + u_char us_id; /* Current id */ + u_char us_allowed; + int us_type; + char *us_number; /* Telefone Number */ +} cbcp_state; + +extern cbcp_state cbcp[]; + +extern struct protent cbcp_protent; + +#define CBCP_MINLEN 4 + +#define CBCP_REQ 1 +#define CBCP_RESP 2 +#define CBCP_ACK 3 + +#define CB_CONF_NO 1 +#define CB_CONF_USER 2 +#define CB_CONF_ADMIN 3 +#define CB_CONF_LIST 4 +#endif diff --git a/c/src/libnetworking/pppd/chat.c b/c/src/libnetworking/pppd/chat.c index 31273714b4..150081d4e5 100644 --- a/c/src/libnetworking/pppd/chat.c +++ b/c/src/libnetworking/pppd/chat.c @@ -14,6 +14,12 @@ * This software is in the public domain. * * ----------------- + * 22-May-99 added environment substitutuion, enabled with -E switch. + * Andreas Arens . + * + * 12-May-99 added a feature to read data to be sent from a file, + * if the send string starts with @. Idea from gpk . + * * added -T and -U option and \T and \U substitution to pass a phone * number into chat script. Two are needed for some ISDN TA applications. * Keith Dart @@ -74,18 +80,12 @@ * Columbus, OH 43221 * (614)451-1883 * - * */ -#ifndef lint -/* static char rcsid[] = ""; */ -#endif - #include #include #include #include -#include #include #include #include @@ -93,13 +93,13 @@ #include #include #include +#include +#include "pppd.h" #undef TERMIOS #define TERMIOS -#include - #define STR_LEN 1024 char temp2[STR_LEN]; @@ -142,39 +142,34 @@ static int _O = 0; /* Internal state */ char *program_name; -#define MAX_ABORTS 5 -#define MAX_REPORTS 5 +#define MAX_ABORTS 16 +#define MAX_REPORTS 16 #define DEFAULT_CHAT_TIMEOUT 45 -#define fcntl(a, b,c ) 0 -#define MAX_TIMEOUTS 10 - -int echo = 0; -int verbose = 0; -int to_log = 1; -int to_stderr = 0; -int Verbose = 0; -int quiet = 0; -int report = 0; -int exit_code = 0; -char *report_file = (char *) 0; -char *chat_file = (char *) 0; -char *phone_num = (char *) 0; -char *phone_num2 = (char *) 0; -int chat_timeout = DEFAULT_CHAT_TIMEOUT; -static int timeout = DEFAULT_CHAT_TIMEOUT; -int have_tty_parameters = 0; +#define MAX_TIMEOUTS 10 + +int echo = 0; +int quiet = 0; +int report = 0; +int use_env = 0; +int exit_code = 0; +char *report_file = (char *) 0; +char *chat_file = (char *) 0; +char *phone_num = (char *) 0; +char *phone_num2 = (char *) 0; +static int timeout = DEFAULT_CHAT_TIMEOUT; #ifdef TERMIOS #define term_parms struct termios -#define get_term_param(param) tcgetattr(ttyfd, param) -#define set_term_param(param) tcsetattr(ttyfd, TCSANOW, param) +#define get_term_param(param) tcgetattr(0, param) +#define set_term_param(param) tcsetattr(0, TCSANOW, param) struct termios saved_tty_parameters; #endif -char *abort_string[MAX_ABORTS]={"BUSY","NO DIALTONE","NO CARRIER","NO ASWER","RINGING\r\n\r\nRINGING"}; -char *fail_reason = (char *)0, - fail_buffer[50]; -int n_aborts = MAX_ABORTS, abort_next = 0, timeout_next = 0, echo_next = 0; +char *fail_reason = (char *)0; +char fail_buffer[50]; +char *abort_string[MAX_ABORTS]={"BUSY","NO DIALTONE","NO CARRIER","NO ANSWER","RING\r\nRING"}; +int n_aborts = 5; +int abort_next = 0, timeout_next = 0, echo_next = 0; int clear_abort_next = 0; char *report_string[MAX_REPORTS] ; @@ -186,19 +181,7 @@ int say_next = 0, hup_next = 0; void *dup_mem __P((void *b, size_t c)); void *copy_of __P((char *s)); -/* -SIGTYPE sigalrm __P((int signo)); -SIGTYPE sigint __P((int signo)); -SIGTYPE sigterm __P((int signo)); -SIGTYPE sighup __P((int signo)); -*/ -void unalarm __P((void)); -void init __P((void)); -void set_tty_parameters __P((void)); -void echo_stderr __P((int)); void break_sequence __P((void)); -void terminate __P((int status)); -void do_file __P((char *chat_file)); int get_string __P((register char *string)); int put_string __P((register char *s)); int write_char __P((int c)); @@ -208,19 +191,9 @@ void chat_send __P((register char *s)); char *character __P((int c)); void chat_expect __P((register char *s)); char *clean __P((register char *s, int sending)); -void break_sequence __P((void)); -void terminate __P((int status)); -void pack_array __P((char **array, int end)); char *expect_strtok __P((char *, char *)); -int vfmtmsg __P((char *, int, const char *, va_list)); /* vsprintf++ */ - -#if 0 -int usleep( long usec ); /* returns 0 if ok, else -1 */ -#endif - -extern int input_fd,output_fd; +int chatmain __P((char *)); -int main __P((int, char *[])); void *dup_mem(b, c) void *b; @@ -228,29 +201,22 @@ size_t c; { void *ans = malloc (c); if (!ans) - return NULL; + return NULL; - memcpy (ans, b, c); + memcpy(ans, b, c); return ans; } void *copy_of (s) char *s; { - return dup_mem (s, strlen (s) + 1); + return dup_mem(s, strlen (s) + 1); } -/* - * chat [ -v ] [-T number] [-U number] [ -t timeout ] [ -f chat-file ] \ - * [ -r report-file ] \ - * [...[[expect[-say[-expect...]] say expect[-say[-expect]] ...]]] - * - * Perform a UUCP-dialer-like chat script on stdin and stdout. - */ char *getnextcommand(char **string) { char *buf=*string,*res; - res=strchr(buf,'@'); + res=strchr(buf,'|'); if (res==NULL) return NULL; *res='\0'; @@ -258,8 +224,6 @@ char *getnextcommand(char **string) return buf; } - -extern int ttyfd; int chatmain(argv) char *argv; { @@ -268,78 +232,40 @@ char *argv; /* initialize exit code */ exit_code = 0; -printf("chat_main: %s\n", argv); + if ( debug ) { + dbglog("chat_main: %s\n", argv); + } /* get first expect string */ arg = getnextcommand(&argv); - while ( arg != NULL ) { + while (( arg != NULL ) && ( exit_code == 0 )) { /* process the expect string */ chat_expect(arg); - - /* get the next send string */ - arg = getnextcommand(&argv); - if ( arg != NULL ) { - /* process the send string */ - chat_send(arg); - - /* get the next expect string */ + if ( exit_code == 0 ) { + /* get the next send string */ arg = getnextcommand(&argv); + if ( arg != NULL ) { + /* process the send string */ + chat_send(arg); + + /* get the next expect string */ + arg = getnextcommand(&argv); + } } } - return 0; -} - - - -/* - * Print an error message and terminate. - */ - -void init() -{ - set_tty_parameters(); -} - -void set_tty_parameters() -{ - term_parms t; + if ( exit_code ) { + exit_code = -exit_code; + } - if (get_term_param (&t) < 0) - syslog(LOG_NOTICE,"Can't get terminal parameters:") - ; - - saved_tty_parameters = t; - have_tty_parameters = 1; - t.c_iflag |= IGNBRK | ISTRIP | IGNPAR; - t.c_oflag = 0; - t.c_lflag = 0; - t.c_cc[VERASE] = - t.c_cc[VKILL] = 0; - t.c_cc[VMIN] = 0; - t.c_cc[VTIME] = 1; - if (set_term_param (&t) < 0) - syslog(LOG_NOTICE,"Can't set terminal parameters:") - ; + return ( exit_code ); } void break_sequence() { - -/* tcsendbreak (0, 0);*/ + tcsendbreak(ttyfd, 0); } -/*void terminate(status) -int status; -{ - echo_stderr(-1); - - if (have_tty_parameters) { - if (set_term_param (&saved_tty_parameters) < 0) - fatal(2, "Can't restore terminal parameters: %m"); - } -} -*/ /* * 'Clean up' this string. */ @@ -347,10 +273,14 @@ char *clean(s, sending) register char *s; int sending; /* set to 1 when sending (putting) this string. */ { - char temp[STR_LEN], cur_chr; + char temp[STR_LEN], env_str[STR_LEN], cur_chr; register char *s1, *phchar; int add_return = sending; -#define isoctal(chr) (((chr) >= '0') && ((chr) <= '7')) +#define isoctal(chr) (((chr) >= '0') && ((chr) <= '7')) +#define isalnumx(chr) ((((chr) >= '0') && ((chr) <= '9')) \ + || (((chr) >= 'a') && ((chr) <= 'z')) \ + || (((chr) >= 'A') && ((chr) <= 'Z')) \ + || (chr) == '_') s1 = temp; while (*s) { @@ -367,6 +297,18 @@ int sending; /* set to 1 when sending (putting) this string. */ } continue; } + + if (use_env && cur_chr == '$') { /* ARI */ + phchar = env_str; + while (isalnumx(*s)) + *phchar++ = *s++; + *phchar = '\0'; + phchar = getenv(env_str); + if (phchar) + while (*phchar) + *s1++ = *phchar++; + continue; + } if (cur_chr != '\\') { *s1++ = cur_chr; @@ -400,13 +342,12 @@ int sending; /* set to 1 when sending (putting) this string. */ case 'd': if (sending) *s1++ = '\\'; - *s1++ = cur_chr; break; case 'T': if (sending && phone_num) { - for ( phchar = phone_num; *phchar != '\0'; phchar++) + for (phchar = phone_num; *phchar != '\0'; phchar++) *s1++ = *phchar; } else { @@ -417,7 +358,7 @@ int sending; /* set to 1 when sending (putting) this string. */ case 'U': if (sending && phone_num2) { - for ( phchar = phone_num2; *phchar != '\0'; phchar++) + for (phchar = phone_num2; *phchar != '\0'; phchar++) *s1++ = *phchar; } else { @@ -455,6 +396,13 @@ int sending; /* set to 1 when sending (putting) this string. */ *s1++ = 'N'; break; + case '$': /* ARI */ + if (use_env) { + *s1++ = cur_chr; + break; + } + /* FALL THROUGH */ + default: if (isoctal (cur_chr)) { cur_chr &= 0x07; @@ -493,7 +441,6 @@ int sending; /* set to 1 when sending (putting) this string. */ /* * A modified version of 'strtok'. This version skips \ sequences. */ - char *expect_strtok (s, term) char *s, *term; { @@ -548,8 +495,7 @@ char *expect_strtok (s, term) /* * Process the expect string */ - -void chat_expect (s) +void chat_expect (s) char *s; { char *expect; @@ -557,42 +503,42 @@ char *s; if (strcmp(s, "HANGUP") == 0) { ++hup_next; - return ; + return; } if (strcmp(s, "ABORT") == 0) { ++abort_next; - return ; + return; } if (strcmp(s, "CLR_ABORT") == 0) { ++clear_abort_next; - return ; + return; } if (strcmp(s, "REPORT") == 0) { ++report_next; - return ; + return; } if (strcmp(s, "CLR_REPORT") == 0) { ++clear_report_next; - return ; + return; } if (strcmp(s, "TIMEOUT") == 0) { ++timeout_next; - return ; + return; } if (strcmp(s, "ECHO") == 0) { ++echo_next; - return ; + return; } if (strcmp(s, "SAY") == 0) { ++say_next; - return ; + return; } /* @@ -600,10 +546,10 @@ char *s; */ for (;;) { expect = expect_strtok (s, "-"); - s = (char *)0 ; + s = (char *) 0; if (expect == (char *) 0) - return ; + return; reply = expect_strtok (s, "-"); @@ -622,11 +568,30 @@ char *s; chat_send (reply); } +} /* - * The expectation did not occur. This is terminal. + * Translate the input character to the appropriate string for printing + * the data. */ - return ; + +char *character(c) +int c; +{ + static char string[10]; + char *meta; + + meta = (c & 0x80) ? "M-" : ""; + c &= 0x7F; + + if (c < 32) + sprintf(string, "%s^%c", meta, (int)c + '@'); + else if (c == 127) + sprintf(string, "%s^?", meta); + else + sprintf(string, "%s%c", meta, c); + + return (string); } /* @@ -635,16 +600,19 @@ char *s; void chat_send (s) register char *s; { + char file_data[STR_LEN]; + if (say_next) { say_next = 0; - s = clean(s,0); - write(ttyfd, s, strlen(s)); + s = clean(s, 1); + write(2, s, strlen(s)); free(s); return; } if (hup_next) { hup_next = 0; + return; } if (echo_next) { @@ -654,36 +622,53 @@ register char *s; } if (abort_next) { - /* char *s1; */ - - - ; + char *s1; + abort_next = 0; + if ( n_aborts < MAX_ABORTS ) { + s1 = clean(s, 0); + if (( strlen(s1) <= strlen(s) ) && + ( strlen(s1) < sizeof(fail_buffer))) { + + abort_string[n_aborts++] = s1; + } + } + return; + } + if (clear_abort_next) { + clear_abort_next = 0; + return; + } + + if (report_next) { + report_next = 0; + return; + } + + if (clear_report_next) { + clear_report_next = 0; return; } if (timeout_next) { - timeout=atoi(s); timeout_next = 0; - chat_timeout = atoi(s); + timeout = atoi(s); - if (chat_timeout <= 0) - chat_timeout = DEFAULT_CHAT_TIMEOUT; - + if (timeout <= 0) + timeout = DEFAULT_CHAT_TIMEOUT; return; } + if (strcmp(s, "EOT") == 0) s = "^D\\c"; else if (strcmp(s, "BREAK") == 0) s = "\\K\\c"; - if (!put_string(s)) - { - exit_code=1; - return; - } + if (!put_string(s)) { + exit_code = 2; + } } int get_char() @@ -708,21 +693,10 @@ int get_char() int put_char(c) int c; { - int status; - char ch = c; - - /* inter-character typing delay (?) */ + char ch = c; - status = write(ttyfd, &ch, 1); + write(ttyfd, &ch, 1); - switch (status) { - case 1: - return (0); - - default: - - - } return 0; } @@ -774,44 +748,12 @@ register char *s; } } - /* alarm(0);*/ return (1); } -/* - * Echo a character to stderr. - * When called with -1, a '\n' character is generated when - * the cursor is not at the beginning of a line. - */ -void echo_stderr(n) -int n; -{ -/* static int need_lf; - char *s; - - switch (n) { - case '\r': - break; - case -1: - if (need_lf == 0) - break; - - case '\n': - write(2, "\n", 1); - need_lf = 0; - break; - default: - s = character(n); - write(2, s, strlen(s)); - need_lf = 1; - break; - }*/ -} - /* * 'Wait for' this string to appear on this file descriptor. */ - int get_string(string) register char *string; { @@ -820,6 +762,8 @@ register char *string; char *logged = temp2; struct termios tios; + memset(temp2, 0, sizeof(temp2)); + tcgetattr(ttyfd, &tios); tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = timeout*10/MAX_TIMEOUTS; @@ -838,13 +782,12 @@ register char *string; return (1); } - while ( (c = get_char()) >= 0) { int n, abort_len; *s++ = c; *s=0; - + if (s - temp2 >= len && c == string[len - 1] && strncmp(s - len, string, len) == 0) { @@ -871,60 +814,7 @@ register char *string; s = temp2 + minlen; } } + exit_code = 3; return (0); } - -/* - * Gross kludge to handle Solaris versions >= 2.6 having usleep. - */ - -/* - usleep -- support routine for 4.2BSD system call emulations - last edit: 29-Oct-1984 D A Gwyn - */ - - -#if 0 -int -usleep( usec ) /* returns 0 if ok, else -1 */ - long usec; /* delay in microseconds */ -{ - rtems_status_code status; - rtems_interval ticks_per_second; - rtems_interval ticks; - status = rtems_clock_get( - RTEMS_CLOCK_GET_TICKS_PER_SECOND, - &ticks_per_second); - ticks = (usec * (ticks_per_second/1000))/1000; - status = rtems_task_wake_after( ticks ); - return 0; -} -#endif - -void pack_array (array, end) - char **array; /* The address of the array of string pointers */ - int end; /* The index of the next free entry before CLR_ */ -{ - int i, j; - - for (i = 0; i < end; i++) { - if (array[i] == NULL) { - for (j = i+1; j < end; ++j) - if (array[j] != NULL) - array[i++] = array[j]; - for (; i < end; ++i) - array[i] = NULL; - break; - } - } -} - -/* - * vfmtmsg - format a message into a buffer. Like vsprintf except we - * also specify the length of the output buffer, and we handle the - * %m (error message) format. - * Doesn't do floating-point formats. - * Returns the number of chars put into buf. - */ -#define OUTCHAR(c) (buflen > 0? (--buflen, *buf++ = (c)): 0) diff --git a/c/src/libnetworking/pppd/example/README b/c/src/libnetworking/pppd/example/README index 969745f3a2..677e00af33 100644 --- a/c/src/libnetworking/pppd/example/README +++ b/c/src/libnetworking/pppd/example/README @@ -6,3 +6,10 @@ This is an example user application using pppd. It is built using the RTEMS application Makefiles. The file Makefile-user should be renamed to Makefile or the -f option given to make. The file is renamed to avoid bootstrap -c removing it. + +The files ppp.conf and pppd.options are sample configuration files +that have successfully used to make ppp connections over a null +modem serial cable to a UNIX box. Please review the man pages +for either the ppp or pppd applications to ensure they are configured +correctly. + diff --git a/c/src/libnetworking/pppd/example/pppd.options b/c/src/libnetworking/pppd/example/pppd.options new file mode 100644 index 0000000000..c0706e6ec5 --- /dev/null +++ b/c/src/libnetworking/pppd/example/pppd.options @@ -0,0 +1,9 @@ +/dev/tty00 +57600 +crtscts +passive +local +noauth +debug +persist +192.168.2.222:192.168.2.111 diff --git a/c/src/libnetworking/pppd/modem_example/16550.h b/c/src/libnetworking/pppd/modem_example/16550.h deleted file mode 100644 index cba98d69f2..0000000000 --- a/c/src/libnetworking/pppd/modem_example/16550.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - *------------------------------------------------------------------- - * - * 16550 -- header file for National Semiconducor's 16550 UART - * - * This file has been created by John S. Gwynne for the efi68k - * project. - * - * The license and distribution terms for this file may in - * the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * - *------------------------------------------------------------------ - * - * $Id$ - */ - -#ifndef _16550_H_ -#define _16550_H_ - -/* base address is the physical location of register 0 */ -#define UART_BASE_ADDRESS 0xF0000000 - -/* definitions of register addresses and associate bits */ - -#define RBR (volatile unsigned char * const)(0+UART_BASE_ADDRESS) - /* Receiver Buffer Register (w/DLAB=0)*/ - /* 8-bit data */ - -#define THR (volatile unsigned char * const)(0+UART_BASE_ADDRESS) - /* Transmitter Holding Register (w/DLAB=0) */ - /* 8-bit data */ - -#define DLL (volatile unsigned char * const)(0+UART_BASE_ADDRESS) - /* Divisor Latch (LS) (w/DLAB=1) */ - /* LSB of Divisor */ - -#define DLM (volatile unsigned char * const)(1+UART_BASE_ADDRESS) - /* Divisor Latch (MS) (w/DLAB=1) */ - /* MSB of Divisor */ - -#define IER (volatile unsigned char * const)(1+UART_BASE_ADDRESS) - /* Interrupt Enable Register (w/DLAB=0) */ -#define ERBFI 0x01 /* Enable Recv Data Available Interrupt */ -#define ETBEI 0x02 /* Enable Trans Holding Reg Empty Inter */ -#define ELSI 0x04 /* Enable Recv Line Status Interrupt */ -#define EDSSI 0x08 /* Enable Modem Status Interrupt */ - -#define IIR (volatile unsigned char * const)(2+UART_BASE_ADDRESS) - /* Interrupt Ident Register (read only) */ -#define NIP 0x01 /* No Interrupt Pending */ -#define IID_MASK 0x0e /* Interrupt ID mask */ -#define FE_MASK 0xc0 /* FIFO's Enabled */ - -#define FCR (volatile unsigned char * const)(2+UART_BASE_ADDRESS) - /* FIFO Control Register (write only) */ -#define FIFO_E 0x01 /* FIFO Enable */ -#define RFR 0x02 /* RCVR FIFO Reset */ -#define XFR 0x04 /* XMIT FIFO Reset */ -#define DMAMS 0x08 /* DMA Mode Select */ -#define RCVRTG_MASK 0xC0 /* RCVR Triger MSBit/LSBit */ - -#define LCR (volatile unsigned char * const)(3+UART_BASE_ADDRESS) - /* Line Control Register */ -#define WLS_MASK 0x03 /* Word Legth Select Mask */ -#define WL_5 0x00 /* 5 bits */ -#define WL_6 0x01 /* 6 bits */ -#define WL_7 0x02 /* 7 bits */ -#define WL_8 0x03 /* 8 bits */ -#define NSB 0x04 /* Number of Stop Bits (set is 2/1.5) */ -#define PEN 0x08 /* Parity Enable */ -#define EPS 0x10 /* Even Parity Select */ -#define STP 0x20 /* Stick Parity */ -#define SETBK 0x40 /* Set Break */ -#define DLAB 0x80 /* Divisor Latch Access Bit */ - -#define MCR (volatile unsigned char * const)(4+UART_BASE_ADDRESS) - /* Modem Control Register */ -#define DTR 0x01 /* Data Terminal Ready */ -#define RTS 0x02 /* Request to Send */ -#define OUT1 0x04 /* Out 1 */ -#define OUT2 0x08 /* Out 2 */ -#define LOOP 0x10 /* Loop */ - -#define LSR (volatile unsigned char * const)(5+UART_BASE_ADDRESS) - /* Line Status Register */ -#define DR 0x01 /* Data Ready */ -#define OE 0x02 /* Overrun error */ -#define PE 0x04 /* Parity error */ -#define FE 0x08 /* Framing error */ -#define BI 0x10 /* Break Interrupt */ -#define THRE 0x20 /* Transmitter Holding Register */ -#define TEMT 0x40 /* Transmitter Empty */ -#define RCVFIE 0x80 /* Recv FIFO Error */ - -#define MDSR (volatile unsigned char * const)(6+UART_BASE_ADDRESS) - /* Modem Status Register */ -#define DCTS 0x01 /* Delta Clear to Send */ -#define DDSR 0x02 /* Delta Data Set Ready */ -#define TERI 0x04 /* Trailing Edge Ring Indicator */ -#define DDCD 0x08 /* Delta Data Carrier Detect */ -#define CTS 0x10 /* Clear to Send */ -#define DSR 0x20 /* Data Set Ready */ -#define RI 0x40 /* Ring Indicator */ -#define DCD 0x80 /* Data Carrier Detect */ - -#define SCR (volatile unsigned char * const)(7+UART_BASE_ADDRESS) - /* Scratch Register */ - /* 8-bit register */ -#endif diff --git a/c/src/libnetworking/pppd/modem_example/README b/c/src/libnetworking/pppd/modem_example/README deleted file mode 100644 index c7eded9bfd..0000000000 --- a/c/src/libnetworking/pppd/modem_example/README +++ /dev/null @@ -1,7 +0,0 @@ -# -# $Id$ -# - -This is a modem driver which should work with limited modifications -on any 16550. - diff --git a/c/src/libnetworking/pppd/modem_example/modem.c b/c/src/libnetworking/pppd/modem_example/modem.c deleted file mode 100644 index 119421e476..0000000000 --- a/c/src/libnetworking/pppd/modem_example/modem.c +++ /dev/null @@ -1,1438 +0,0 @@ -/* - * Modem device driver for RTEMS - * Author: Tomasz Domin (dot@comarch.pl) - * Copyright (C) 1998 by ComArch SA - * Driver will use termios for character output and ppp specific out procecedures for network protocols - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include "ppp.h" -#include -#include -/* RTEMS specific */ -rtems_id modem_task_id; -#include "16550.h" -#include -#define ESCAPE_P(c) (sc->sc_asyncmap[(c) >> 5] & (1 << ((c) & 0x1F))) -#define M_IS_CLUSTER(m) ((m)->m_flags & M_EXT) - -#define M_DATASTART(m) \ - (M_IS_CLUSTER(m) ? (m)->m_ext.ext_buf : \ - (m)->m_flags & M_PKTHDR ? (m)->m_pktdat : (m)->m_dat) - -#define M_DATASIZE(m) \ - (M_IS_CLUSTER(m) ? (m)->m_ext.ext_size : \ - (m)->m_flags & M_PKTHDR ? MHLEN: MLEN) - - -struct rtems_termios_tty *modem_tty; -/* - * RTEMS event used by interrupt handler to signal daemons. - * This must *not* be the same event used by the KA9Q task synchronization. - */ -#define INTERRUPT_EVENT RTEMS_EVENT_1 -#define START_TRANSMIT_EVENT RTEMS_EVENT_2 -#define PPP_LOWAT 100 /* Process more output when < LOWAT on queue */ -#define PPP_HIWAT 400 /* Don't start a new packet if HIWAT on que */ - -/* - * RTEMS event used to start transmit daemon. - * This must not be the same as INTERRUPT_EVENT. - */ - -/*static struct modem_tty *tp=&modem_tp;*/ -static rtems_id modem_rx_task,modem_tx_task; - - - -/* internal FIFO buffers for input and output characters */ -#define MODEM_BUFFER_LENGTH 4096 -#define RTS_STOP_SIZE MODEM_BUFFER_LENGTH-128 -#define RTS_START_SIZE 16 - -int xmt_start,xmt_len; -int rcv_start,rcv_len; - -static unsigned char xmt_buf[MODEM_BUFFER_LENGTH]; -static unsigned char rcv_buf[MODEM_BUFFER_LENGTH]; - -static volatile char _tx_stop = 0 ,_modem_cd=0; -struct ModemData -{ - int t_line; - struct ppp_softc *t_sc; - rtems_id pppsem; - int offhook; -} ModemData; - -int pppstart(struct tty *ignore); -static u_short fcstab[256] = { - 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, - 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, - 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, - 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, - 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, - 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, - 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, - 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, - 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, - 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, - 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, - 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, - 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, - 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, - 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, - 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, - 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, - 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, - 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, - 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, - 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, - 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, - 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, - 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, - 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, - 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, - 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, - 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, - 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, - 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, - 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, - 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 -}; - - -static u_short -pppfcs(fcs, cp, len) - register u_short fcs; - register u_char *cp; - register int len; -{ - while (len--) - fcs = PPP_FCS(fcs, *cp++); - return (fcs); -} - -static void -ppp_timeout(x) - void *x; -{ - struct ppp_softc *sc = ModemData.t_sc; - struct tty *tp = (struct tty *) sc->sc_devp; - int s; - - sc->sc_flags &= ~SC_TIMEOUT; - pppstart(tp); -} - -static void -pppasyncrelinq(sc) - struct ppp_softc *sc; -{ - int s; - - if (sc->sc_outm) { - m_freem(sc->sc_outm); - sc->sc_outm = NULL; - } - if (sc->sc_m) { - m_freem(sc->sc_m); - sc->sc_m = NULL; - } - if (sc->sc_flags & SC_TIMEOUT) { - untimeout(ppp_timeout, (void *) sc); - sc->sc_flags &= ~SC_TIMEOUT; - } -} - -/* Put data in input queue */ -int -pppstart(struct tty *ignore) -{ - register struct ppp_softc *sc = ModemData.t_sc; - - /* - * If there is stuff in the output queue, send it now. - * We are being called in lieu of ttstart and must do what it would. - */ - rtems_event_send(modem_tx_task,START_TRANSMIT_EVENT); - sc->sc_if.if_flags |= IFF_OACTIVE; - - /* - * If the transmit queue has drained and the tty has not hung up - * or been disconnected from the ppp unit, then tell if_ppp.c that - * we need more output. - */ -/* if (CCOUNT(&tp->t_outq) < PPP_LOWAT - && !((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0) - && sc != NULL && tp == (struct tty *) sc->sc_devp) { - ppp_restart(sc); - } -*/ - return 0; -} -int putc(unsigned char c) -{ - int level; - - if (xmt_lensc_devp); - - /* - * This timeout is needed for operation on a pseudo-tty, - * because the pty code doesn't call pppstart after it has - * drained the t_outq. - */ -/* if (!idle && (sc->sc_flags & SC_TIMEOUT) == 0) { - timeout(ppp_timeout, (void *) sc, 1); - sc->sc_flags |= SC_TIMEOUT; - } -*/ - -} - - -void modem_sendpacket() -{ - struct mbuf *l = NULL; - rtems_unsigned16 status; - int curr; - register struct mbuf *m; - register int len; - register u_char *start, *stop, *cp; - int n, ndone, done, idle; - struct mbuf *m2; - int s; - register struct ppp_softc *sc=ModemData.t_sc; - - - while (xmt_len < PPP_HIWAT) { - /* - * See if we have an existing packet partly sent. - * If not, get a new packet and start sending it. - */ - m = sc->sc_outm; - if (m == NULL) { - /* - * Get another packet to be sent. - - */ - m = ppp_dequeue(sc); - if (m == NULL) - { - break; - } - - /* - * The extra PPP_FLAG will start up a new packet, and thus - * will flush any accumulated garbage. We do this whenever - * the line may have been idle for some time. - */ - if (xmt_len == 0) { - ++sc->sc_stats.ppp_obytes; - putc(PPP_FLAG); - } - - /* Calculate the FCS for the first mbuf's worth. */ - sc->sc_outfcs = pppfcs(PPP_INITFCS, mtod(m, u_char *), m->m_len); - microtime(&sc->sc_if.if_lastchange); - } - - for (;;) { - start = mtod(m, u_char *); - len = m->m_len; - stop = start + len; - while (len > 0) { - /* - * Find out how many bytes in the string we can - * handle without doing something special. - */ - for (cp = start; cp < stop; cp++) - if (ESCAPE_P(*cp)) - break; - n = cp - start; - if (n) { - register int i; - /* NetBSD (0.9 or later), 4.3-Reno or similar. */ - for(i=0;isc_stats.ppp_obytes += ndone; - - if (ndone < n) - break; /* packet doesn't fit */ - } - /* - * If there are characters left in the mbuf, - * the first one must be special. - * Put it out in a different form. - */ - if (len) { - if (putc(PPP_ESCAPE)) - break; - if (putc(*start ^ PPP_TRANS)) { - unputc(); - break; - } - sc->sc_stats.ppp_obytes += 2; - start++; - len--; - } - } - - /* - * If we didn't empty this mbuf, remember where we're up to. - * If we emptied the last mbuf, try to add the FCS and closing - * flag, and if we can't, leave sc_outm pointing to m, but with - * m->m_len == 0, to remind us to output the FCS and flag later. - */ - done = len == 0; - if (done && m->m_next == NULL) { - u_char *p, *q; - int c; - u_char endseq[8]; - - /* - * We may have to escape the bytes in the FCS. - */ - p = endseq; - c = ~sc->sc_outfcs & 0xFF; - if (ESCAPE_P(c)) { - *p++ = PPP_ESCAPE; - *p++ = c ^ PPP_TRANS; - } else - *p++ = c; - c = (~sc->sc_outfcs >> 8) & 0xFF; - if (ESCAPE_P(c)) { - *p++ = PPP_ESCAPE; - *p++ = c ^ PPP_TRANS; - } else - *p++ = c; - *p++ = PPP_FLAG; - - /* - * Try to output the FCS and flag. If the bytes - * don't all fit, back out. - */ - for (q = endseq; q < p; ++q) - if (putc(*q)) { - done = 0; - for (; q > endseq; --q) - unputc(); - break; - } - if (done) - sc->sc_stats.ppp_obytes += q - endseq; - } - - if (!done) { - /* remember where we got to */ - m->m_data = start; - m->m_len = len; - break; - } - - /* Finished with this mbuf; free it and move on. */ - MFREE(m, m2); - m = m2; - if (m == NULL) { - /* Finished a packet */ - break; - } - sc->sc_outfcs = pppfcs(sc->sc_outfcs, mtod(m, u_char *), m->m_len); - } - - /* - * If m == NULL, we have finished a packet. - * If m != NULL, we've either done as much work this time - * as we need to, or else we've filled up the output queue. - */ - sc->sc_outm = m; - if (m) - break; - } - -} - -static void -pppasyncctlp(sc) - struct ppp_softc *sc; -{ - rtems_semaphore_release(ModemData.pppsem); -} - - -static unsigned paritytab[8] = { - 0x96696996, 0x69969669, 0x69969669, 0x96696996, - 0x69969669, 0x96696996, 0x96696996, 0x69969669 -}; -#define MAX_DUMP_BYTES 128 - -static void -pppdumpb(b, l) - u_char *b; - int l; -{ - char buf[3*MAX_DUMP_BYTES+4]; - char *bp = buf; - static char digits[] = "0123456789abcdef"; - - while (l--) { - if (bp >= buf + sizeof(buf) - 3) { - *bp++ = '>'; - break; - } - *bp++ = digits[*b >> 4]; /* convert byte to ascii hex */ - *bp++ = digits[*b++ & 0xf]; - *bp++ = ' '; - } - - *bp = 0; - -} - -static void -ppplogchar(sc, c) - struct ppp_softc *sc; - int c; -{ - if (c >= 0) - sc->sc_rawin[sc->sc_rawin_count++] = c; - if (sc->sc_rawin_count >= sizeof(sc->sc_rawin) - || (c < 0 && sc->sc_rawin_count > 0)) { -/* printf("ppp%d input: ", sc->sc_if.if_unit); -*/ pppdumpb(sc->sc_rawin, sc->sc_rawin_count); - sc->sc_rawin_count = 0; - } -} -static void -pppgetm(sc) - register struct ppp_softc *sc; -{ - struct mbuf *m, **mp; - int len; - mp = &sc->sc_m; - for (len = sc->sc_mru + PPP_HDRLEN + PPP_FCSLEN; len > 0; ){ - if ((m = *mp) == NULL) { - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) - break; - *mp = m; - MCLGET(m, M_DONTWAIT); - } - len -= M_DATASIZE(m); - mp = &m->m_next; - } -} - - -int -pppinput(c) - int c; - -{ - register struct ppp_softc *sc=ModemData.t_sc; - struct mbuf *m; - int ilen, s; - - if (sc == NULL ) - return 0; - - ++sc->sc_stats.ppp_ibytes; -/* - if (c & TTY_FE) {*/ - /* framing error or overrun on this char - abort packet */ -/* if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: bad char %x\n", sc->sc_if.if_unit, c); - goto flush; - }*/ - - c &= 0xff; - - /* - * Handle software flow control of output. - */ -/* if (tp->t_iflag & IXON) { - if (c == tp->t_cc[VSTOP] ) { - if ((tp->t_state & TS_TTSTOP) == 0) { - tp->t_state |= TS_TTSTOP; - sccppp_stop_transmission(tp); - } - return 0; - } - if (c == tp->t_cc[VSTART] ) { - tp->t_state &= ~TS_TTSTOP; - sccppp_start_transmission(tp); - return 0; - } - } -*/ - - if (c & 0x80) - sc->sc_flags |= SC_RCV_B7_1; - else - sc->sc_flags |= SC_RCV_B7_0; - if (paritytab[c >> 5] & (1 << (c & 0x1F))) - sc->sc_flags |= SC_RCV_ODDP; - else - sc->sc_flags |= SC_RCV_EVNP; - - -/* if (sc->sc_flags & SC_LOG_RAWIN)*/ -// ppplogchar(sc, c); - - if (c == PPP_FLAG) { - ilen = sc->sc_ilen; - sc->sc_ilen = 0; - - if (sc->sc_rawin_count > 0) - ppplogchar(sc, -1); - - /* - * If SC_ESCAPED is set, then we've seen the packet - * abort sequence - */ - if (sc->sc_flags & (SC_FLUSH | SC_ESCAPED) - || (ilen > 0 && sc->sc_fcs != PPP_GOODFCS)) { - sc->sc_flags |= SC_PKTLOST; /* note the dropped packet */ - if ((sc->sc_flags & (SC_FLUSH | SC_ESCAPED)) == 0){ - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: bad fcs %x, pkt len %d\n", - sc->sc_if.if_unit, sc->sc_fcs, ilen); - sc->sc_if.if_ierrors++; - sc->sc_stats.ppp_ierrors++; - } else - sc->sc_flags &= ~(SC_FLUSH | SC_ESCAPED); - return 0; - } - - if (ilen < PPP_HDRLEN + PPP_FCSLEN) { - if (ilen) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: too short (%d)\n", sc->sc_if.if_unit, ilen); -*/ sc->sc_if.if_ierrors++; - sc->sc_stats.ppp_ierrors++; - sc->sc_flags |= SC_PKTLOST; - splx(s); - } - return 0; - } - - /* - * Remove FCS trailer. Somewhat painful... - */ - ilen -= 2; - if (--sc->sc_mc->m_len == 0) { - for (m = sc->sc_m; m->m_next != sc->sc_mc; m = m->m_next) - ; - sc->sc_mc = m; - } - sc->sc_mc->m_len--; - - /* excise this mbuf chain */ - m = sc->sc_m; - sc->sc_m = sc->sc_mc->m_next; - sc->sc_mc->m_next = NULL; - ppppktin(sc, m, sc->sc_flags & SC_PKTLOST); - if (sc->sc_flags & SC_PKTLOST) { - sc->sc_flags &= ~SC_PKTLOST; - } - - pppgetm(sc); - return 0; - } - - if (sc->sc_flags & SC_FLUSH) { - if (sc->sc_flags & SC_LOG_FLUSH) - ppplogchar(sc, c); - return 0; - } - - if (c < 0x20 && (sc->sc_rasyncmap & (1 << c))) - return 0; - - if (sc->sc_flags & SC_ESCAPED) { - sc->sc_flags &= ~SC_ESCAPED; - c ^= PPP_TRANS; - } else if (c == PPP_ESCAPE) { - sc->sc_flags |= SC_ESCAPED; - return 0; - } - - /* - * Initialize buffer on first octet received. - * First octet could be address or protocol (when compressing - * address/control). - * Second octet is control. - * Third octet is first or second (when compressing protocol) - * octet of protocol. - * Fourth octet is second octet of protocol. - */ - if (sc->sc_ilen == 0) { - /* reset the first input mbuf */ - if (sc->sc_m == NULL) { - pppgetm(sc); - if (sc->sc_m == NULL) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: no input mbufs!\n", sc->sc_if.if_unit); -*/ goto flush; - } - } - m = sc->sc_m; - m->m_len = 0; - m->m_data = M_DATASTART(sc->sc_m); - sc->sc_mc = m; - sc->sc_mp = mtod(m, char *); - sc->sc_fcs = PPP_INITFCS; - if (c != PPP_ALLSTATIONS) { - if (sc->sc_flags & SC_REJ_COMP_AC) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: garbage received: 0x%x (need 0xFF)\n", - sc->sc_if.if_unit, c);*/ - goto flush; - } - *sc->sc_mp++ = PPP_ALLSTATIONS; - *sc->sc_mp++ = PPP_UI; - sc->sc_ilen += 2; - m->m_len += 2; - } - } - if (sc->sc_ilen == 1 && c != PPP_UI) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: missing UI (0x3), got 0x%x\n", - sc->sc_if.if_unit, c); -*/ goto flush; - } - if (sc->sc_ilen == 2 && (c & 1) == 1) { - /* a compressed protocol */ - *sc->sc_mp++ = 0; - sc->sc_ilen++; - sc->sc_mc->m_len++; - } - if (sc->sc_ilen == 3 && (c & 1) == 0) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: bad protocol %x\n", sc->sc_if.if_unit, - (sc->sc_mp[-1] << 8) + c); -*/ goto flush; - } - - /* packet beyond configured mru? */ - if (++sc->sc_ilen > sc->sc_mru + PPP_HDRLEN + PPP_FCSLEN) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: packet too big\n", sc->sc_if.if_unit); -*/ goto flush; - } - - /* is this mbuf full? */ - m = sc->sc_mc; - if (M_TRAILINGSPACE(m) <= 0) { - if (m->m_next == NULL) { - pppgetm(sc); - if (m->m_next == NULL) { - if (sc->sc_flags & SC_DEBUG) -/* printf("ppp%d: too few input mbufs!\n", sc->sc_if.if_unit); -*/ goto flush; - } - } - sc->sc_mc = m = m->m_next; - m->m_len = 0; - m->m_data = M_DATASTART(m); - sc->sc_mp = mtod(m, char *); - } - - ++m->m_len; - *sc->sc_mp++ = c; - sc->sc_fcs = PPP_FCS(sc->sc_fcs, c); - return 0; - - flush: - if (!(sc->sc_flags & SC_FLUSH)) { - sc->sc_if.if_ierrors++; - sc->sc_stats.ppp_ierrors++; - sc->sc_flags |= SC_FLUSH; - if (sc->sc_flags & SC_LOG_FLUSH) - ppplogchar(sc, c); - } - return 0; -} - - -void -modem_txDaemon (void *arg) -{ - rtems_event_set events; - register int level,i,maxonce; - while (1) - { - if (xmt_len==0) //if there is nothing then wait for an event - rtems_event_receive(START_TRANSMIT_EVENT|INTERRUPT_EVENT,RTEMS_EVENT_ANY | RTEMS_WAIT, RTEMS_NO_TIMEOUT,&events); - /* wait for transmit buffer to become empty */ - - while(_tx_stop) //here we are wainting for transmission start - rtems_event_receive(INTERRUPT_EVENT|START_TRANSMIT_EVENT,RTEMS_EVENT_ANY | RTEMS_WAIT, RTEMS_NO_TIMEOUT,&events); - - _CPU_ISR_Disable(level); - if (*LSR & THRE) //if there is no transmission then send first bytes, if there is one they will go eitherway - { - maxonce=(xmt_len>14)?14:xmt_len; - if (maxonce>0) - { - for (i=0;i0) - { - bufor_posr[i++]=rcv_buf[rcv_start]; - rcv_start=(rcv_start+1)%MODEM_BUFFER_LENGTH; - rcv_len--; - } - _CPU_ISR_Enable(level); - if (ModemData.t_line==PPPDISC) - { - rtems_bsdnet_semaphore_obtain(); - for(j=0;j> 8); - *LCR = (char)(WL_8 ); /* 8 bitowe slowo */ -} - - -static void -modem_init (int speed) /* port is the SMC number (i.e. 1 or 2) */ -{ - set_modem_speed(speed); - /* Line control setup */ - - *LCR = (char)(WL_8 ); /* 8 bit word */ - /* was NSB - was 2 is 1*/ - - /* Interrupt setup */ - *IER = (char) 0x0f; /* enable transmit, receive, modem stat int */ - - /* FIFO setup */ - *FCR = (char)(FIFO_E | 0xc0); - - /* Modem control setup */ - *MCR = (char) RTS|DTR|OUT2; - - /* init tx_stop with CTS */ - _tx_stop = ( (*MDSR & CTS) ? 0 : 1); -} - -void set_modem_dtr(int how) -{ - unsigned char ch; - ch=*MCR; - *MCR=(how)?(ch|DTR):(ch&(~DTR)); -} -void modem_status() -{ - unsigned char status; - status=*MDSR; - -/* printf("Modem Status %x ",status); -*/ if (status&CTS) - { - _tx_stop=0; - rtems_event_send (modem_tx_task, START_TRANSMIT_EVENT|INTERRUPT_EVENT); - } - else - { - _tx_stop=1; - } - if (status&DCD) - _modem_cd=1; - else - _modem_cd=0; -} - -static rtems_isr -modemInterruptHandler (rtems_vector_number v) -{ - register char a,i,ch; - register int maxonce; - static errcount = 0; - for(;;) - { - a=*IIR & (NIP | IID_MASK); /* read interrupt id register */ - switch (a) { - case 0x04: case 0x0c: - /* - * Buffer received? - */ - while( (*LSR & DR) != 0) - { - ch=*RBR; - rcv_buf[(rcv_start+rcv_len)%MODEM_BUFFER_LENGTH]=ch; - rcv_len++; - } - rtems_event_send (modem_rx_task, INTERRUPT_EVENT); - break; - case 0x02: - /* - * Buffer transmitted ? - */ - if (*LSR & THRE) //if there is no transmission (and it shouldn't be) then send some bytes - { - maxonce=(xmt_len>14)?14:xmt_len; - if (maxonce>0) - { - for (i=0;i=MODEM_BUFFER_LENGTH) - break; - xmt_buf[(xmt_start+xmt_len)%MODEM_BUFFER_LENGTH]=buf[i]; - xmt_len++; - } - _CPU_ISR_Enable(level); - } - rtems_event_send(modem_tx_task,START_TRANSMIT_EVENT); - return i; -} - - -/* - * Initialize and register the device - */ -rtems_device_driver modem_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_status_code status; - rtems_isr_entry old_handler; - rtems_status_code sc; - rtems_termios_initialize (); - sc = rtems_semaphore_create ( - rtems_build_name ('M', 'D', 'M', 'P'), - 0, - RTEMS_COUNTING_SEMAPHORE, - RTEMS_NO_PRIORITY_CEILING, - &ModemData.pppsem); - if (sc != RTEMS_SUCCESSFUL) - rtems_fatal_error_occurred (sc); - modem_init(9600); - - sc = rtems_interrupt_catch (modemInterruptHandler, - PPC_IRQ_IRQ4, - &old_handler); - - /* - * Register the devices - */ - modem_tx_task=0; - modem_rx_task=0; - status = rtems_io_register_name ("/dev/modem", major, 0); - if (status != RTEMS_SUCCESSFUL) - rtems_fatal_error_occurred (status); - return RTEMS_SUCCESSFUL; -} - -rtems_device_driver modem_first_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - modem_tty=(struct rtems_termios_tty *)(((rtems_libio_open_close_args_t *)arg)->iop->data1); - return RTEMS_SUCCESSFUL; -} -rtems_device_driver modem_last_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - m823.siu.simask &=(~M823_SIMASK_IRM4); /* block the interrupts */ - return RTEMS_SUCCESSFUL; -} - -static int -modemSetAttr(int minor, const struct termios *t) -{ - int baud; - - switch (t->c_cflag & CBAUD) - { - case B50: - baud = 50; - break; - case B75: - baud = 75; - break; - case B110: - baud = 110; - break; - case B134: - baud = 134; - break; - case B150: - baud = 150; - break; - case B200: - baud = 200; - break; - case B300: - baud = 300; - break; - case B600: - baud = 600; - break; - case B1200: - baud = 1200; - break; - case B1800: - baud = 1800; - break; - case B2400: - baud = 2400; - break; - case B4800: - baud = 4800; - break; - case B9600: - baud = 9600; - break; - case B19200: - baud = 19200; - break; - case B38400: - baud = 38400; - break; - case B57600: - baud = 57600; - break; - case B115200: - baud = 115200; - break; - default: - baud = 0; - rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR); - return 0; - } - set_modem_speed(baud); - return RTEMS_SUCCESSFUL; -} - - -/* - * Open the device - */ - - - -rtems_device_driver modem_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - int error, s; - rtems_status_code status; - register struct ppp_softc *sc; - static rtems_termios_callbacks cb = - { - modem_first_open, /* firstOpen */ - modem_last_close, /* lastClose */ - NULL, /* poll read */ - modemWriteTermios, /* write */ - modemSetAttr, /* setAttributes */ - NULL, /* stopRemoteTx */ - NULL, /* startRemoteTx */ - 0 /* outputUsesInterrupts */ - }; - - if (ModemData.t_line == PPPDISC) - { - sc = ModemData.t_sc; - if (sc != NULL && sc->sc_devp == (void *) &ModemData) - { - return (0); - } - } - - if ((ModemData.t_sc= sc = pppalloc(1)) == NULL) - return 2; - - if (sc->sc_relinq) - (*sc->sc_relinq)(sc); /* get previous owner to relinquish the unit */ - - sc->sc_ilen = 0; - sc->sc_m = NULL; - bzero(sc->sc_asyncmap, sizeof(sc->sc_asyncmap)); - sc->sc_asyncmap[0] = 0xffffffff; - sc->sc_asyncmap[3] = 0x60000000; - sc->sc_rasyncmap = 0; - sc->sc_devp = &ModemData; - sc->sc_start = pppasyncstart; - sc->sc_ctlp = pppasyncctlp; - sc->sc_relinq = pppasyncrelinq; - sc->sc_outm = NULL; - pppgetm(sc); - sc->sc_if.if_flags |= IFF_RUNNING; - sc->sc_if.if_baudrate = 38400; - - status = rtems_termios_open (major, minor, arg, &cb); - if(status != RTEMS_SUCCESSFUL) - { -/* printf("Error openning console device\n"); -*/ return status; - } - - -/* init rx and tx task for device */ - xmt_start=xmt_len=0; - rcv_start=rcv_len=0; - - if (modem_rx_task==0 && modem_tx_task==0) - { - rtems_status_code sc; - sc = rtems_task_create (rtems_build_name ('M', 'D', 't', 'x'), - 101, - 16*1024, - RTEMS_PREEMPT|RTEMS_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0), - RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL, - &modem_tx_task); - if (sc != RTEMS_SUCCESSFUL) { - - } - - sc = rtems_task_start (modem_tx_task, (void *)modem_txDaemon, 0); - if (sc != RTEMS_SUCCESSFUL) { - - } - - sc = rtems_task_create (rtems_build_name ('M', 'D', 'r', 'x'), - 101, - 16*1024, - RTEMS_PREEMPT|RTEMS_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0), - RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL, - &modem_rx_task); - if (sc != RTEMS_SUCCESSFUL) { - - } - - sc = rtems_task_start (modem_rx_task, (void *)modem_rxDaemon, 0); - if (sc != RTEMS_SUCCESSFUL) { - - } - - } - /* Enable modem interrupts */ - m823.siu.simask |= M823_SIMASK_IRM4; - - return RTEMS_SUCCESSFUL; -} - -/* - * Close the device - */ -rtems_device_driver modem_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - register struct ppp_softc *sc; - modem_flush( FREAD|FWRITE); - - ModemData.t_line = 0; - sc = ModemData.t_sc; - if (sc != NULL) { - ModemData.t_sc = NULL; - if (&ModemData == (struct tty *) sc->sc_devp) { - rtems_bsdnet_semaphore_obtain(); - pppasyncrelinq(sc); - pppdealloc(sc); - rtems_bsdnet_semaphore_release(); - } - } - return RTEMS_SUCCESSFUL; -} - -/* for now works only as serial device */ - - -rtems_device_driver modem_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - rtems_libio_rw_args_t *rw_args= (rtems_libio_rw_args_t *)arg; - char *buffer; - int count=0,maximum; - rtems_status_code sc; - - buffer = rw_args->buffer; - maximum = rw_args->count; - if (ModemData.t_line==PPPDISC) - { - - struct mbuf *m, *m0; - register int s; - int error = 0; - rtems_status_code status; - rtems_interval ticks; - register struct ppp_softc *sc = (struct ppp_softc *)ModemData.t_sc; - ticks=1000000/rtems_bsdnet_microseconds_per_tick; - - if (sc == NULL) - return 0; - /* - * Loop waiting for input, checking that nothing disasterous - * happens in the meantime. - */ - for (;;) { - if (sc->sc_inq.ifq_head != NULL) - { -/* printf("Read : Data are in the buffer\n"); -*/ break; - } -/* printf("Read : Waiting for data\n"); -*/ - status=rtems_semaphore_obtain(ModemData.pppsem,RTEMS_WAIT,ticks); - if (_modem_cd==0) - { - rw_args->bytes_moved =0; - return RTEMS_SUCCESSFUL; - } - - if (status==RTEMS_TIMEOUT) - return status; - } - rtems_bsdnet_semaphore_obtain(); - IF_DEQUEUE(&sc->sc_inq, m0); - rtems_bsdnet_semaphore_release(); - - for (m = m0; m && (count+m->m_next->m_lenm_next) /* check if packet will fit in buffer */ - { - memcpy(buffer,mtod(m, u_char *),m->m_len); - count+=m->m_len; - buffer+=m->m_len; - } - m_freem(m0); - rw_args->bytes_moved = count; - - } - else - sc = rtems_termios_read (arg); - - count=rw_args->bytes_moved; - return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; -} - -/* - * Write to the device - */ -rtems_device_driver modem_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - int count,len; - rtems_libio_rw_args_t *rw_args; - char *out_buffer; - int n,maximum; - rw_args = (rtems_libio_rw_args_t *) arg; - - out_buffer = rw_args->buffer; - maximum = rw_args->count; - - if (ModemData.t_line==PPPDISC) - { - register struct ppp_softc *sc = (struct ppp_softc *)ModemData.t_sc; - struct sockaddr dst; - struct mbuf *m, *m0, **mp; - rtems_bsdnet_semaphore_obtain(); - for (mp = &m0; maximum; mp = &m->m_next) - { - MGET(m, M_WAIT, MT_DATA); - if ((*mp = m) == NULL) - { - rtems_bsdnet_semaphore_release(); - m_freem(m0); - return (ENOBUFS); - } - m->m_len = 0; - if (maximum>= MCLBYTES / 2) - MCLGET(m, M_DONTWAIT); - len = M_TRAILINGSPACE(m); - if (len > maximum) - { - memcpy(mtod(m, u_char *),out_buffer,maximum); - m->m_len=maximum; - maximum=0; - } - else - { - memcpy(mtod(m, u_char *),out_buffer,len); - maximum-=len; - m->m_len=len; - out_buffer+=len; - } - } - - dst.sa_family = AF_UNSPEC; - bcopy(mtod(m0, u_char *), dst.sa_data, PPP_HDRLEN); - m0->m_data += PPP_HDRLEN; - m0->m_len -= PPP_HDRLEN; - -/* printf("Sending %d bytes \n",m0->m_len); -*/ n=pppoutput(&sc->sc_if, m0, &dst, (struct rtentry *)0); - rtems_bsdnet_semaphore_release(); - return n; - } - else - return rtems_termios_write (arg); -} - - - -/* - * Handle ioctl request. - * Should set hardware line speed, bits/char, etc. - */ -rtems_device_driver modem_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - rtems_libio_ioctl_args_t *args=(rtems_libio_ioctl_args_t *)arg; - struct ppp_softc *sc=ModemData.t_sc; - int cmd; - caddr_t data; - int error=RTEMS_SUCCESSFUL; - - data=args->buffer; - cmd=args->command; - - switch (cmd) { - case RTEMS_IO_GET_ATTRIBUTES: - case RTEMS_IO_SET_ATTRIBUTES: - case RTEMS_IO_TCDRAIN: - return rtems_termios_ioctl (arg); - break; - case PPPIOCSASYNCMAP: - sc->sc_asyncmap[0] = *(u_int *)data; - break; - - case PPPIOCGASYNCMAP: - *(u_int *)data = sc->sc_asyncmap[0]; - break; - - case PPPIOCSRASYNCMAP: - sc->sc_rasyncmap = *(u_int *)data; - break; - - case TIOCSETD: - ModemData.t_line=*(int*)data; - break; - case TIOCGETD: - *(int*)data=ModemData.t_line; - break; - case TIOCMBIS: - if ((*(int*)data)&TIOCM_DTR) - set_modem_dtr(1); - break; - case TIOCMBIC: - if ((*(int*)data)&TIOCM_DTR) - set_modem_dtr(0); - break; - case PPPIOCGRASYNCMAP: - *(u_int *)data = sc->sc_rasyncmap; - break; - - case PPPIOCSXASYNCMAP: - bcopy(data, sc->sc_asyncmap, sizeof(sc->sc_asyncmap)); - sc->sc_asyncmap[1] = 0; /* mustn't escape 0x20 - 0x3f */ - sc->sc_asyncmap[2] &= ~0x40000000; /* mustn't escape 0x5e */ - sc->sc_asyncmap[3] |= 0x60000000; /* must escape 0x7d, 0x7e */ - break; - - case PPPIOCGXASYNCMAP: - bcopy(sc->sc_asyncmap, data, sizeof(sc->sc_asyncmap)); - break; - - default: - rtems_bsdnet_semaphore_obtain(); - error = pppioctl(sc, cmd, data, 0, NULL); - if (error == 0 && cmd == PPPIOCSMRU) - pppgetm(sc); - rtems_bsdnet_semaphore_release(); - - } - return error; - -} - - - -void -wait_input(timo) - struct timeval *timo; -{ - int n; - rtems_event_set events; - rtems_interval ticks; - rtems_status_code err; - int num_wait=1; - register struct ppp_softc *sc = (struct ppp_softc *)ModemData.t_sc; - ticks = 1+(timo->tv_sec*1000000+timo->tv_usec)/rtems_bsdnet_microseconds_per_tick; - while (num_wait) - { - - if (sc->sc_inq.ifq_head != NULL) - break; -/* printf("Wait : Waiting for data for %d ticks\n",ticks); -*/ err=rtems_semaphore_obtain(ModemData.pppsem,RTEMS_WAIT,ticks); - if (err==RTEMS_TIMEOUT) - { -/* printf("TIMEOUT : No data\n"); -*/ break; - } - } - -} diff --git a/c/src/libnetworking/pppd/modem_example/modem.h b/c/src/libnetworking/pppd/modem_example/modem.h deleted file mode 100644 index cd4b4db52d..0000000000 --- a/c/src/libnetworking/pppd/modem_example/modem.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef _MODEM_H_ -#define _MODEM_H_ - -void modem_reserve_resources( - rtems_configuration_table * configuration -); - -rtems_device_driver modem_initialize( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - -rtems_device_driver modem_open( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - -rtems_device_driver modem_close( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - -rtems_device_driver modem_read( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - -rtems_device_driver modem_write( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - -rtems_device_driver modem_control( - rtems_device_major_number, - rtems_device_minor_number, - void * -); - - -#endif diff --git a/c/src/libnetworking/pppd/modem_example/ppp.c b/c/src/libnetworking/pppd/modem_example/ppp.c deleted file mode 100644 index 22c53302fe..0000000000 --- a/c/src/libnetworking/pppd/modem_example/ppp.c +++ /dev/null @@ -1,1504 +0,0 @@ -/* - * if_ppp.c - Point-to-Point Protocol (PPP) Asynchronous driver. - * - * 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. - * - * Drew D. Perkins - * Carnegie Mellon University - * 4910 Forbes Ave. - * Pittsburgh, PA 15213 - * (412) 268-8576 - * ddp@andrew.cmu.edu - * - * Based on: - * @(#)if_sl.c 7.6.1.2 (Berkeley) 2/15/89 - * - * Copyright (c) 1987 Regents of the University of California. - * 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 the University of California, Berkeley. 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. - * - * Serial Line interface - * - * Rick Adams - * Center for Seismic Studies - * 1300 N 17th Street, Suite 1450 - * Arlington, Virginia 22209 - * (703)276-7900 - * rick@seismo.ARPA - * seismo!rick - * - * Pounded on heavily by Chris Torek (chris@mimsy.umd.edu, umcp-cs!chris). - * Converted to 4.3BSD Beta by Chris Torek. - * Other changes made at Berkeley, based in part on code by Kirk Smith. - * - * Converted to 4.3BSD+ 386BSD by Brad Parker (brad@cayman.com) - * Added VJ tcp header compression; more unified ioctls - * - * Extensively modified by Paul Mackerras (paulus@cs.anu.edu.au). - * Cleaned up a lot of the mbuf-related code to fix bugs that - * caused system crashes and packet corruption. Changed pppstart - * so that it doesn't just give up with a collision if the whole - * packet doesn't fit in the output ring buffer. - * - * Added priority queueing for interactive IP packets, following - * the model of if_sl.c, plus hooks for bpf. - * Paul Mackerras (paulus@cs.anu.edu.au). - */ - -/* $Id$ */ -/* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */ -/* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */ - -#include "ppp.h" -#if NPPP > 0 -/* temporarily we switch off the compression */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#ifdef PPP_FILTER -#include -#endif - -#ifdef INET -#include -#include -#include -#include -#endif - -#include -#if NBPFILTER > 0 -#include -#endif - -#ifdef VJC -#include -#endif - -#include -#include -#include -#include - -#define splsoftnet splnet - -#ifndef NETISR_PPP -/* This definition should be moved to net/netisr.h */ -#define NETISR_PPP 26 /* PPP software interrupt */ -#endif - -#ifdef PPP_COMPRESS -#define PACKETPTR struct mbuf * -#include -#endif -extern struct ifqueue ipintrq; -static int pppsioctl __P((struct ifnet *, int, caddr_t)); -static void ppp_requeue __P((struct ppp_softc *)); -static void ppp_ccp __P((struct ppp_softc *, struct mbuf *m, int rcvd)); -static void ppp_ccp_closed __P((struct ppp_softc *)); -static void ppp_inproc __P((struct ppp_softc *, struct mbuf *)); -static void pppdumpm __P((struct mbuf *m0)); - -/* - * Some useful mbuf macros not in mbuf.h. - */ -#define M_IS_CLUSTER(m) ((m)->m_flags & M_EXT) - -#define M_DATASTART(m) \ - (M_IS_CLUSTER(m) ? (m)->m_ext.ext_buf : \ - (m)->m_flags & M_PKTHDR ? (m)->m_pktdat : (m)->m_dat) - -#define M_DATASIZE(m) \ - (M_IS_CLUSTER(m) ? (m)->m_ext.ext_size : \ - (m)->m_flags & M_PKTHDR ? MHLEN: MLEN) - -/* - * We steal two bits in the mbuf m_flags, to mark high-priority packets - * for output, and received packets following lost/corrupted packets. - */ -#define M_HIGHPRI 0x2000 /* output packet for sc_fastq */ -#define M_ERRMARK 0x4000 /* steal a bit in mbuf m_flags */ - - -#ifdef PPP_COMPRESS -/* - * List of compressors we know about. - * We leave some space so maybe we can modload compressors. - */ - -extern struct compressor ppp_bsd_compress; -extern struct compressor ppp_deflate, ppp_deflate_draft; - - -struct compressor *ppp_compressors[8] = { -#if DO_BSD_COMPRESS - &ppp_bsd_compress, -#endif -#if DO_DEFLATE - &ppp_deflate, - &ppp_deflate_draft, -#endif - NULL -}; -#endif /* PPP_COMPRESS */ -static struct timeval ppp_time; - -TEXT_SET(pseudo_set, pppattach); - -/* - * Called from boot code to establish ppp interfaces. - */ -int rtems_ppp_driver_attach (struct rtems_bsdnet_ifconfig *config) -{ - register struct ppp_softc *sc; - register int i = 0; - extern void (*netisrs[])__P((void)); - - for (sc = ppp_softc; i < NPPP; sc++) { - sc->sc_if.if_name = "ppp"; - sc->sc_if.if_unit = i++; - sc->sc_if.if_mtu = PPP_MTU; - sc->sc_if.if_flags = IFF_POINTOPOINT | IFF_MULTICAST; - sc->sc_if.if_type = IFT_PPP; - sc->sc_if.if_hdrlen = PPP_HDRLEN; - sc->sc_if.if_ioctl = pppsioctl; - sc->sc_if.if_output = pppoutput; - sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN; - sc->sc_inq.ifq_maxlen = IFQ_MAXLEN; - sc->sc_fastq.ifq_maxlen = IFQ_MAXLEN; - sc->sc_rawq.ifq_maxlen = IFQ_MAXLEN; - if_attach(&sc->sc_if); -#if NBPFILTER > 0 - bpfattach(&sc->sc_bpf, &sc->sc_if, DLT_PPP, PPP_HDRLEN); -#endif - } -/* hardcoded in rtems_glue.c - netisrs[NETISR_PPP] = pppintr; */ - return 1; -} - -/* - * Allocate a ppp interface unit and initialize it. - */ -struct ppp_softc * -pppalloc(pid) - pid_t pid; -{ - int nppp, i; - struct ppp_softc *sc; - for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++) - if (sc->sc_xfer == pid) { - sc->sc_xfer = 0; - return sc; - } - for (nppp = 0, sc = ppp_softc; nppp < NPPP; nppp++, sc++) - if (sc->sc_devp == NULL) - break; - if (nppp >= NPPP) - return NULL; - - sc->sc_flags = 0; - sc->sc_mru = PPP_MRU; - sc->sc_relinq = NULL; - bzero((char *)&sc->sc_stats, sizeof(sc->sc_stats)); -#ifdef VJC - sc->sc_comp=malloc(sizeof(struct vjcompress),M_DEVBUF, M_NOWAIT); - if (sc->sc_comp) - vj_compress_init(sc->sc_comp, -1); -#endif -#ifdef PPP_COMPRESS - sc->sc_xc_state = NULL; - sc->sc_rc_state = NULL; -#endif /* PPP_COMPRESS */ - for (i = 0; i < NUM_NP; ++i) - sc->sc_npmode[i] = NPMODE_ERROR; - sc->sc_npqueue = NULL; - sc->sc_npqtail = &sc->sc_npqueue; - microtime(&ppp_time); - sc->sc_last_sent = sc->sc_last_recv = ppp_time.tv_sec; - - return sc; -} - -/* - * Deallocate a ppp unit. Must be called at splsoftnet or higher. - */ -void -pppdealloc(sc) - struct ppp_softc *sc; -{ - struct mbuf *m; - - if_down(&sc->sc_if); - sc->sc_if.if_flags &= ~(IFF_UP|IFF_RUNNING); - sc->sc_devp = NULL; - sc->sc_xfer = 0; - for (;;) { - IF_DEQUEUE(&sc->sc_rawq, m); - if (m == NULL) - break; - m_freem(m); - } - for (;;) { - IF_DEQUEUE(&sc->sc_inq, m); - if (m == NULL) - break; - m_freem(m); - } - for (;;) { - IF_DEQUEUE(&sc->sc_fastq, m); - if (m == NULL) - break; - m_freem(m); - } - while ((m = sc->sc_npqueue) != NULL) { - sc->sc_npqueue = m->m_nextpkt; - m_freem(m); - } - if (sc->sc_togo != NULL) { - m_freem(sc->sc_togo); - sc->sc_togo = NULL; - } -#ifdef PPP_COMPRESS - ppp_ccp_closed(sc); - sc->sc_xc_state = NULL; - sc->sc_rc_state = NULL; -#endif /* PPP_COMPRESS */ -#ifdef PPP_FILTER - if (sc->sc_pass_filt.bf_insns != 0) { - free(sc->sc_pass_filt.bf_insns, M_DEVBUF); - sc->sc_pass_filt.bf_insns = 0; - sc->sc_pass_filt.bf_len = 0; - } - if (sc->sc_active_filt.bf_insns != 0) { - free(sc->sc_active_filt.bf_insns, M_DEVBUF); - sc->sc_active_filt.bf_insns = 0; - sc->sc_active_filt.bf_len = 0; - } -#endif /* PPP_FILTER */ -#ifdef VJC - if (sc->sc_comp != 0) { - free(sc->sc_comp, M_DEVBUF); - sc->sc_comp = 0; - } -#endif -} - -/* - * Ioctl routine for generic ppp devices. - */ -int -pppioctl(sc, cmd, data, flag, p) - struct ppp_softc *sc; - int cmd; - caddr_t data; - int flag; - struct proc *p; -{ - int s, error, flags, mru, nb, npx; - struct ppp_option_data *odp; - struct compressor **cp; - struct npioctl *npi; - time_t t; -#ifdef PPP_FILTER - struct bpf_program *bp, *nbp; - struct bpf_insn *newcode, *oldcode; - int newcodelen; -#endif /* PPP_FILTER */ -#ifdef PPP_COMPRESS - u_char ccp_option[CCP_MAX_OPTION_LENGTH]; -#endif - - switch (cmd) { - case FIONREAD: - *(int *)data = sc->sc_inq.ifq_len; - break; - - case PPPIOCGUNIT: - *(int *)data = sc->sc_if.if_unit; - break; - - case PPPIOCGFLAGS: - *(u_int *)data = sc->sc_flags; - break; - - case PPPIOCSFLAGS: - flags = *(int *)data & SC_MASK; - s = splsoftnet(); -#ifdef PPP_COMPRESS - if (sc->sc_flags & SC_CCP_OPEN && !(flags & SC_CCP_OPEN)) - ppp_ccp_closed(sc); -#endif - splimp(); - sc->sc_flags = (sc->sc_flags & ~SC_MASK) | flags; - splx(s); - break; - - case PPPIOCSMRU: - mru = *(int *)data; - if (mru >= PPP_MRU && mru <= PPP_MAXMRU) - sc->sc_mru = mru; - break; - - case PPPIOCGMRU: - *(int *)data = sc->sc_mru; - break; - -#ifdef VJC - case PPPIOCSMAXCID: - if (sc->sc_comp) { - s = splsoftnet(); - vj_compress_init(sc->sc_comp, *(int *)data); - splx(s); - } - break; -#endif - - case PPPIOCXFERUNIT: - sc->sc_xfer = 0; /* Always root p->p_pid;*/ - break; - -#ifdef PPP_COMPRESS - case PPPIOCSCOMPRESS: - odp = (struct ppp_option_data *) data; - nb = odp->length; - if (nb > sizeof(ccp_option)) - nb = sizeof(ccp_option); - if ((error = copyin(odp->ptr, ccp_option, nb)) != 0) - return (error); - if (ccp_option[1] < 2) /* preliminary check on the length byte */ - return (EINVAL); - for (cp = ppp_compressors; *cp != NULL; ++cp) - if ((*cp)->compress_proto == ccp_option[0]) { - /* - * Found a handler for the protocol - try to allocate - * a compressor or decompressor. - */ - error = 0; - if (odp->transmit) { - s = splsoftnet(); - if (sc->sc_xc_state != NULL) - (*sc->sc_xcomp->comp_free)(sc->sc_xc_state); - sc->sc_xcomp = *cp; - sc->sc_xc_state = (*cp)->comp_alloc(ccp_option, nb); - if (sc->sc_xc_state == NULL) { - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: comp_alloc failed\n", - sc->sc_if.if_unit); - error = ENOBUFS; - } - splimp(); - sc->sc_flags &= ~SC_COMP_RUN; - splx(s); - } else { - s = splsoftnet(); - if (sc->sc_rc_state != NULL) - (*sc->sc_rcomp->decomp_free)(sc->sc_rc_state); - sc->sc_rcomp = *cp; - sc->sc_rc_state = (*cp)->decomp_alloc(ccp_option, nb); - if (sc->sc_rc_state == NULL) { - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: decomp_alloc failed\n", - sc->sc_if.if_unit); - error = ENOBUFS; - } - splimp(); - sc->sc_flags &= ~SC_DECOMP_RUN; - splx(s); - } - return (error); - } - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: no compressor for [%x %x %x], %x\n", - sc->sc_if.if_unit, ccp_option[0], ccp_option[1], - ccp_option[2], nb); - return (EINVAL); /* no handler found */ -#endif /* PPP_COMPRESS */ - - case PPPIOCGNPMODE: - case PPPIOCSNPMODE: - npi = (struct npioctl *) data; - switch (npi->protocol) { - case PPP_IP: - npx = NP_IP; - break; - default: - return EINVAL; - } - if (cmd == PPPIOCGNPMODE) { - npi->mode = sc->sc_npmode[npx]; - } else { - if (npi->mode != sc->sc_npmode[npx]) { - s = splsoftnet(); - sc->sc_npmode[npx] = npi->mode; - if (npi->mode != NPMODE_QUEUE) { - ppp_requeue(sc); - (*sc->sc_start)(sc); - } - splx(s); - } - } - break; - - case PPPIOCGIDLE: - s = splsoftnet(); - microtime(&ppp_time); - t = ppp_time.tv_sec; - ((struct ppp_idle *)data)->xmit_idle = t - sc->sc_last_sent; - ((struct ppp_idle *)data)->recv_idle = t - sc->sc_last_recv; - splx(s); - break; - -#ifdef PPP_FILTER - case PPPIOCSPASS: - case PPPIOCSACTIVE: - nbp = (struct bpf_program *) data; - if ((unsigned) nbp->bf_len > BPF_MAXINSNS) - return EINVAL; - newcodelen = nbp->bf_len * sizeof(struct bpf_insn); - if (newcodelen != 0) { - newcode=(struct bpf_insn *) malloc (newcodelen, M_DEVBUF, M_WAITOK); - if (newcode == 0) { - return EINVAL; /* or sumpin */ - } - if ((error = copyin((caddr_t)nbp->bf_insns, (caddr_t)newcode, - newcodelen)) != 0) { - free(newcode, M_DEVBUF); - return error; - } - if (!bpf_validate(newcode, nbp->bf_len)) { - free(newcode, M_DEVBUF); - return EINVAL; - } - } else - newcode = 0; - bp = (cmd == PPPIOCSPASS)? &sc->sc_pass_filt: &sc->sc_active_filt; - oldcode = bp->bf_insns; - s = splimp(); - bp->bf_len = nbp->bf_len; - bp->bf_insns = newcode; - splx(s); - if (oldcode != 0) - free(oldcode, M_DEVBUF); - break; -#endif - - default: - return (-1); - } - return (0); -} - -/* - * Process an ioctl request to the ppp network interface. - */ -static int -pppsioctl(ifp, cmd, data) - register struct ifnet *ifp; - int cmd; - caddr_t data; -{ -/* struct proc *p = curproc; *//* XXX */ - register struct ppp_softc *sc = &ppp_softc[ifp->if_unit]; - register struct ifaddr *ifa = (struct ifaddr *)data; - register struct ifreq *ifr = (struct ifreq *)data; - struct ppp_stats *psp; -#ifdef PPP_COMPRESS - struct ppp_comp_stats *pcp; -#endif - int s = splimp(), error = 0; - - switch (cmd) { - case SIOCSIFFLAGS: - if ((ifp->if_flags & IFF_RUNNING) == 0) - ifp->if_flags &= ~IFF_UP; - break; - - case SIOCSIFADDR: - if (ifa->ifa_addr->sa_family != AF_INET) - error = EAFNOSUPPORT; - break; - - case SIOCSIFDSTADDR: - if (ifa->ifa_addr->sa_family != AF_INET) - error = EAFNOSUPPORT; - break; - - case SIOCSIFMTU: - sc->sc_if.if_mtu = ifr->ifr_mtu; - break; - - case SIOCGIFMTU: - ifr->ifr_mtu = sc->sc_if.if_mtu; - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - if (ifr == 0) { - error = EAFNOSUPPORT; - break; - } - switch(ifr->ifr_addr.sa_family) { -#ifdef INET - case AF_INET: - break; -#endif - default: - error = EAFNOSUPPORT; - break; - } - break; - case SIO_RTEMS_SHOW_STATS: - printf (" MRU:%-8lu", sc->sc_mru); - printf (" Bytes received:%-8lu", sc->sc_stats.ppp_ibytes); - printf (" Packets received:%-8lu", sc->sc_stats.ppp_ipackets); - printf (" Receive errors:%-8lu\n", sc->sc_stats.ppp_ierrors); - printf (" Bytes sent:%-8lu", sc->sc_stats.ppp_obytes); - printf (" Packets sent:%-8lu", sc->sc_stats.ppp_opackets); - printf (" Transmit errors:%-8lu\n", sc->sc_stats.ppp_oerrors); - - break; - - - case SIOCGPPPSTATS: - psp = &((struct ifpppstatsreq *) data)->stats; - bzero(psp, sizeof(*psp)); - psp->p = sc->sc_stats; -#if defined(VJC) && !defined(SL_NO_STATS) - if (sc->sc_comp) { - psp->vj.vjs_packets = sc->sc_comp->sls_packets; - psp->vj.vjs_compressed = sc->sc_comp->sls_compressed; - psp->vj.vjs_searches = sc->sc_comp->sls_searches; - psp->vj.vjs_misses = sc->sc_comp->sls_misses; - psp->vj.vjs_uncompressedin = sc->sc_comp->sls_uncompressedin; - psp->vj.vjs_compressedin = sc->sc_comp->sls_compressedin; - psp->vj.vjs_errorin = sc->sc_comp->sls_errorin; - psp->vj.vjs_tossed = sc->sc_comp->sls_tossed; - } -#endif /* VJC */ - break; - -#ifdef PPP_COMPRESS - case SIOCGPPPCSTATS: - pcp = &((struct ifpppcstatsreq *) data)->stats; - bzero(pcp, sizeof(*pcp)); - if (sc->sc_xc_state != NULL) - (*sc->sc_xcomp->comp_stat)(sc->sc_xc_state, &pcp->c); - if (sc->sc_rc_state != NULL) - (*sc->sc_rcomp->decomp_stat)(sc->sc_rc_state, &pcp->d); - break; -#endif /* PPP_COMPRESS */ - - default: - error = EINVAL; - } - splx(s); - return (error); -} - -/* - * Queue a packet. Start transmission if not active. - * Packet is placed in Information field of PPP frame. - */ -int -pppoutput(ifp, m0, dst, rtp) - struct ifnet *ifp; - struct mbuf *m0; - struct sockaddr *dst; - struct rtentry *rtp; -{ - register struct ppp_softc *sc = &ppp_softc[ifp->if_unit]; - int protocol, address, control; - u_char *cp; - int s, error; - struct ip *ip; - struct ifqueue *ifq; - enum NPmode mode; - int len; - struct mbuf *m; - if (sc->sc_devp == NULL || (ifp->if_flags & IFF_RUNNING) == 0 - || ((ifp->if_flags & IFF_UP) == 0 && dst->sa_family != AF_UNSPEC)) { - error = ENETDOWN; /* sort of */ - goto bad; - } - - /* - * Compute PPP header. - */ - m0->m_flags &= ~M_HIGHPRI; - switch (dst->sa_family) { -#ifdef INET - case AF_INET: - address = PPP_ALLSTATIONS; - control = PPP_UI; - protocol = PPP_IP; - mode = sc->sc_npmode[NP_IP]; - - /* - * If this packet has the "low delay" bit set in the IP header, - * put it on the fastq instead. - */ - ip = mtod(m0, struct ip *); - if (ip->ip_tos & IPTOS_LOWDELAY) - m0->m_flags |= M_HIGHPRI; - break; -#endif - case AF_UNSPEC: - address = PPP_ADDRESS(dst->sa_data); - control = PPP_CONTROL(dst->sa_data); - protocol = PPP_PROTOCOL(dst->sa_data); - mode = NPMODE_PASS; - break; - default: - printf("ppp%d: af%d not supported\n", ifp->if_unit, dst->sa_family); - error = EAFNOSUPPORT; - goto bad; - } - - /* - * Drop this packet, or return an error, if necessary. - */ - if (mode == NPMODE_ERROR) { - error = ENETDOWN; - goto bad; - } - if (mode == NPMODE_DROP) { - error = 0; - goto bad; - } - - /* - * Add PPP header. If no space in first mbuf, allocate another. - * (This assumes M_LEADINGSPACE is always 0 for a cluster mbuf.) - */ - if (M_LEADINGSPACE(m0) < PPP_HDRLEN) { - m0 = m_prepend(m0, PPP_HDRLEN, M_DONTWAIT); - if (m0 == 0) { - error = ENOBUFS; - goto bad; - } - m0->m_len = 0; - } else - m0->m_data -= PPP_HDRLEN; - - cp = mtod(m0, u_char *); - *cp++ = address; - *cp++ = control; - *cp++ = protocol >> 8; - *cp++ = protocol & 0xff; - m0->m_len += PPP_HDRLEN; - - len = 0; - for (m = m0; m != 0; m = m->m_next) - len += m->m_len; - - if (sc->sc_flags & SC_LOG_OUTPKT) { - printf("ppp%d output: ", ifp->if_unit); - pppdumpm(m0); - } - - if ((protocol & 0x8000) == 0) { -#ifdef PPP_FILTER - /* - * Apply the pass and active filters to the packet, - * but only if it is a data packet. - */ - *mtod(m0, u_char *) = 1; /* indicates outbound */ - if (sc->sc_pass_filt.bf_insns != 0 - && bpf_filter(sc->sc_pass_filt.bf_insns, (u_char *) m0, - len, 0) == 0) { - error = 0; /* drop this packet */ - goto bad; - } - - /* - * Update the time we sent the most recent packet. - */ - if (sc->sc_active_filt.bf_insns == 0 - || bpf_filter(sc->sc_active_filt.bf_insns, (u_char *) m0, len, 0)) - { - microtime(&ppp_time); - sc->sc_last_sent = ppp_time.tv_sec; - } - - *mtod(m0, u_char *) = address; -#else - /* - * Update the time we sent the most recent data packet. - */ - microtime(&ppp_time); - sc->sc_last_sent = ppp_time.tv_sec; -#endif /* PPP_FILTER */ - } - -#if NBPFILTER > 0 - /* - * See if bpf wants to look at the packet. - */ - if (sc->sc_bpf) - bpf_mtap(sc->sc_bpf, m0); -#endif - - /* - * Put the packet on the appropriate queue. - */ - if (mode == NPMODE_QUEUE) { - /* XXX we should limit the number of packets on this queue */ - *sc->sc_npqtail = m0; - m0->m_nextpkt = NULL; - sc->sc_npqtail = &m0->m_nextpkt; - } else { - ifq = (m0->m_flags & M_HIGHPRI)? &sc->sc_fastq: &ifp->if_snd; - if (IF_QFULL(ifq) && dst->sa_family != AF_UNSPEC) { - IF_DROP(ifq); - splx(s); - sc->sc_if.if_oerrors++; - sc->sc_stats.ppp_oerrors++; - error = ENOBUFS; - goto bad; - } - IF_ENQUEUE(ifq, m0); - (*sc->sc_start)(sc); - } - microtime(&ppp_time); - ifp->if_lastchange = ppp_time; - ifp->if_opackets++; - ifp->if_obytes += len; - - return (0); - -bad: - m_freem(m0); - return (error); -} - -/* - * After a change in the NPmode for some NP, move packets from the - * npqueue to the send queue or the fast queue as appropriate. - * Should be called at splsoftnet. - */ -static void -ppp_requeue(sc) - struct ppp_softc *sc; -{ - struct mbuf *m, **mpp; - struct ifqueue *ifq; - enum NPmode mode; - - for (mpp = &sc->sc_npqueue; (m = *mpp) != NULL; ) { - switch (PPP_PROTOCOL(mtod(m, u_char *))) { - case PPP_IP: - mode = sc->sc_npmode[NP_IP]; - break; - default: - mode = NPMODE_PASS; - } - - switch (mode) { - case NPMODE_PASS: - /* - * This packet can now go on one of the queues to be sent. - */ - *mpp = m->m_nextpkt; - m->m_nextpkt = NULL; - ifq = (m->m_flags & M_HIGHPRI)? &sc->sc_fastq: &sc->sc_if.if_snd; - if (IF_QFULL(ifq)) { - IF_DROP(ifq); - sc->sc_if.if_oerrors++; - sc->sc_stats.ppp_oerrors++; - } else - IF_ENQUEUE(ifq, m); - break; - - case NPMODE_DROP: - case NPMODE_ERROR: - *mpp = m->m_nextpkt; - m_freem(m); - break; - - case NPMODE_QUEUE: - mpp = &m->m_nextpkt; - break; - } - } - sc->sc_npqtail = mpp; -} - -/* - * Transmitter has finished outputting some stuff; - * remember to call sc->sc_start later at splsoftnet. - */ -void -ppp_restart(sc) - struct ppp_softc *sc; -{ - - sc->sc_flags &= ~SC_TBUSY; -/* schednetisr(NETISR_PPP); -*/} - -/* - * Get a packet to send. This procedure is intended to be called at - * splsoftnet, since it may involve time-consuming operations such as - * applying VJ compression, packet compression, address/control and/or - * protocol field compression to the packet. - */ -struct mbuf * -ppp_dequeue(sc) - struct ppp_softc *sc; -{ - struct mbuf *m, *mp; - u_char *cp; - int address, control, protocol; - - /* - * Grab a packet to send: first try the fast queue, then the - * normal queue. - */ - IF_DEQUEUE(&sc->sc_fastq, m); - if (m == NULL) - IF_DEQUEUE(&sc->sc_if.if_snd, m); - if (m == NULL) - return NULL; - - ++sc->sc_stats.ppp_opackets; - - /* - * Extract the ppp header of the new packet. - * The ppp header will be in one mbuf. - */ - cp = mtod(m, u_char *); - address = PPP_ADDRESS(cp); - control = PPP_CONTROL(cp); - protocol = PPP_PROTOCOL(cp); - - switch (protocol) { - case PPP_IP: -#ifdef VJC - /* - * If the packet is a TCP/IP packet, see if we can compress it. - */ - if ((sc->sc_flags & SC_COMP_TCP) && sc->sc_comp != NULL) { - struct ip *ip; - int type; - - mp = m; - ip = (struct ip *) (cp + PPP_HDRLEN); - if (mp->m_len <= PPP_HDRLEN) { - mp = mp->m_next; - if (mp == NULL) - break; - ip = mtod(mp, struct ip *); - } - /* this code assumes the IP/TCP header is in one non-shared mbuf */ - if (ip->ip_p == IPPROTO_TCP) { - type = vj_compress_tcp(mp, ip, sc->sc_comp, - !(sc->sc_flags & SC_NO_TCP_CCID)); - switch (type) { - case TYPE_UNCOMPRESSED_TCP: - protocol = PPP_VJC_UNCOMP; - break; - case TYPE_COMPRESSED_TCP: - protocol = PPP_VJC_COMP; - cp = mtod(m, u_char *); - cp[0] = address; /* header has moved */ - cp[1] = control; - cp[2] = 0; - break; - } - cp[3] = protocol; /* update protocol in PPP header */ - } - } -#endif /* VJC */ - break; - -#ifdef PPP_COMPRESS - case PPP_CCP: - ppp_ccp(sc, m, 0); - break; -#endif /* PPP_COMPRESS */ - } - -#ifdef PPP_COMPRESS - if (protocol != PPP_LCP && protocol != PPP_CCP - && sc->sc_xc_state && (sc->sc_flags & SC_COMP_RUN)) { - struct mbuf *mcomp = NULL; - int slen, clen; - - slen = 0; - for (mp = m; mp != NULL; mp = mp->m_next) - slen += mp->m_len; - clen = (*sc->sc_xcomp->compress) - (sc->sc_xc_state, &mcomp, m, slen, sc->sc_if.if_mtu + PPP_HDRLEN); - if (mcomp != NULL) { - if (sc->sc_flags & SC_CCP_UP) { - /* Send the compressed packet instead of the original. */ - m_freem(m); - m = mcomp; - cp = mtod(m, u_char *); - protocol = cp[3]; - } else { - /* Can't transmit compressed packets until CCP is up. */ - m_freem(mcomp); - } - } - } -#endif /* PPP_COMPRESS */ - - /* - * Compress the address/control and protocol, if possible. - */ - if (sc->sc_flags & SC_COMP_AC && address == PPP_ALLSTATIONS && - control == PPP_UI && protocol != PPP_ALLSTATIONS && - protocol != PPP_LCP) { - /* can compress address/control */ - m->m_data += 2; - m->m_len -= 2; - } - if (sc->sc_flags & SC_COMP_PROT && protocol < 0xFF) { - /* can compress protocol */ - if (mtod(m, u_char *) == cp) { - cp[2] = cp[1]; /* move address/control up */ - cp[1] = cp[0]; - } - ++m->m_data; - --m->m_len; - } - - return m; -} - -/* - * Software interrupt routine, called at splsoftnet. - */ -void -pppintr() -{ - struct ppp_softc *sc; - int i, s, s2; - struct mbuf *m; - - sc = ppp_softc; - for (i = 0; i < NPPP; ++i, ++sc) { - if (!(sc->sc_flags & SC_TBUSY) - && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) { - s2 = splimp(); - sc->sc_flags |= SC_TBUSY; - splx(s2); - (*sc->sc_start)(sc); - } - for (;;) { - IF_DEQUEUE(&sc->sc_rawq, m); - if (m == NULL) - break; - ppp_inproc(sc, m); - } - } -} - -#ifdef PPP_COMPRESS -/* - * Handle a CCP packet. `rcvd' is 1 if the packet was received, - * 0 if it is about to be transmitted. - */ -static void -ppp_ccp(sc, m, rcvd) - struct ppp_softc *sc; - struct mbuf *m; - int rcvd; -{ - u_char *dp, *ep; - struct mbuf *mp; - int slen, s; - - /* - * Get a pointer to the data after the PPP header. - */ - if (m->m_len <= PPP_HDRLEN) { - mp = m->m_next; - if (mp == NULL) - return; - dp = (mp != NULL)? mtod(mp, u_char *): NULL; - } else { - mp = m; - dp = mtod(mp, u_char *) + PPP_HDRLEN; - } - - ep = mtod(mp, u_char *) + mp->m_len; - if (dp + CCP_HDRLEN > ep) - return; - slen = CCP_LENGTH(dp); - if (dp + slen > ep) { - if (sc->sc_flags & SC_DEBUG) - printf("if_ppp/ccp: not enough data in mbuf (%p+%x > %p+%x)\n", - dp, slen, mtod(mp, u_char *), mp->m_len); - return; - } - - switch (CCP_CODE(dp)) { - case CCP_CONFREQ: - case CCP_TERMREQ: - case CCP_TERMACK: - /* CCP must be going down - disable compression */ - if (sc->sc_flags & SC_CCP_UP) { - s = splimp(); - sc->sc_flags &= ~(SC_CCP_UP | SC_COMP_RUN | SC_DECOMP_RUN); - splx(s); - } - break; - - case CCP_CONFACK: - if (sc->sc_flags & SC_CCP_OPEN && !(sc->sc_flags & SC_CCP_UP) - && slen >= CCP_HDRLEN + CCP_OPT_MINLEN - && slen >= CCP_OPT_LENGTH(dp + CCP_HDRLEN) + CCP_HDRLEN) { - if (!rcvd) { - /* we're agreeing to send compressed packets. */ - if (sc->sc_xc_state != NULL - && (*sc->sc_xcomp->comp_init) - (sc->sc_xc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN, - sc->sc_if.if_unit, 0, sc->sc_flags & SC_DEBUG)) { - s = splimp(); - sc->sc_flags |= SC_COMP_RUN; - splx(s); - } - } else { - /* peer is agreeing to send compressed packets. */ - if (sc->sc_rc_state != NULL - && (*sc->sc_rcomp->decomp_init) - (sc->sc_rc_state, dp + CCP_HDRLEN, slen - CCP_HDRLEN, - sc->sc_if.if_unit, 0, sc->sc_mru, - sc->sc_flags & SC_DEBUG)) { - s = splimp(); - sc->sc_flags |= SC_DECOMP_RUN; - sc->sc_flags &= ~(SC_DC_ERROR | SC_DC_FERROR); - splx(s); - } - } - } - break; - - case CCP_RESETACK: - if (sc->sc_flags & SC_CCP_UP) { - if (!rcvd) { - if (sc->sc_xc_state && (sc->sc_flags & SC_COMP_RUN)) - (*sc->sc_xcomp->comp_reset)(sc->sc_xc_state); - } else { - if (sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)) { - (*sc->sc_rcomp->decomp_reset)(sc->sc_rc_state); - s = splimp(); - sc->sc_flags &= ~SC_DC_ERROR; - splx(s); - } - } - } - break; - } -} - -/* - * CCP is down; free (de)compressor state if necessary. - */ -static void -ppp_ccp_closed(sc) - struct ppp_softc *sc; -{ - if (sc->sc_xc_state) { - (*sc->sc_xcomp->comp_free)(sc->sc_xc_state); - sc->sc_xc_state = NULL; - } - if (sc->sc_rc_state) { - (*sc->sc_rcomp->decomp_free)(sc->sc_rc_state); - sc->sc_rc_state = NULL; - } -} -#endif /* PPP_COMPRESS */ - -/* - * PPP packet input routine. - * The caller has checked and removed the FCS and has inserted - * the address/control bytes and the protocol high byte if they - * were omitted. - */ -void -ppppktin(sc, m, lost) - struct ppp_softc *sc; - struct mbuf *m; - int lost; -{ - - if (lost) - m->m_flags |= M_ERRMARK; - IF_ENQUEUE(&sc->sc_rawq, m); - pppintr(); -} - -/* - * Process a received PPP packet, doing decompression as necessary. - * Should be called at splsoftnet. - */ -#define COMPTYPE(proto) ((proto) == PPP_VJC_COMP? TYPE_COMPRESSED_TCP: \ - TYPE_UNCOMPRESSED_TCP) - -static void -ppp_inproc(sc, m) - struct ppp_softc *sc; - struct mbuf *m; -{ - struct ifnet *ifp = &sc->sc_if; - struct ifqueue *inq; - int s, ilen, xlen, proto, rv; - u_char *cp, adrs, ctrl; - struct mbuf *mp, *dmp = NULL; - u_char *iphdr; - u_int hlen; - - sc->sc_stats.ppp_ipackets++; - - if (sc->sc_flags & SC_LOG_INPKT) { - ilen = 0; - for (mp = m; mp != NULL; mp = mp->m_next) - ilen += mp->m_len; - printf("ppp%d: got %d bytes\n", ifp->if_unit, ilen); - pppdumpm(m); - } - - cp = mtod(m, u_char *); - adrs = PPP_ADDRESS(cp); - ctrl = PPP_CONTROL(cp); - proto = PPP_PROTOCOL(cp); - - if (m->m_flags & M_ERRMARK) { - m->m_flags &= ~M_ERRMARK; - s = splimp(); - sc->sc_flags |= SC_VJ_RESET; - splx(s); - } - -#ifdef PPP_COMPRESS - /* - * Decompress this packet if necessary, update the receiver's - * dictionary, or take appropriate action on a CCP packet. - */ - if (proto == PPP_COMP && sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN) - && !(sc->sc_flags & SC_DC_ERROR) && !(sc->sc_flags & SC_DC_FERROR)) { - /* decompress this packet */ - rv = (*sc->sc_rcomp->decompress)(sc->sc_rc_state, m, &dmp); - if (rv == DECOMP_OK) { - m_freem(m); - if (dmp == NULL) { - /* no error, but no decompressed packet produced */ - return; - } - m = dmp; - cp = mtod(m, u_char *); - proto = PPP_PROTOCOL(cp); - - } else { - /* - * An error has occurred in decompression. - * Pass the compressed packet up to pppd, which may take - * CCP down or issue a Reset-Req. - */ - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: decompress failed %d\n", ifp->if_unit, rv); - s = splimp(); - sc->sc_flags |= SC_VJ_RESET; - if (rv == DECOMP_ERROR) - sc->sc_flags |= SC_DC_ERROR; - else - sc->sc_flags |= SC_DC_FERROR; - splx(s); - } - - } else { - if (sc->sc_rc_state && (sc->sc_flags & SC_DECOMP_RUN)) { - (*sc->sc_rcomp->incomp)(sc->sc_rc_state, m); - } - if (proto == PPP_CCP) { - ppp_ccp(sc, m, 1); - } - } -#endif - - ilen = 0; - for (mp = m; mp != NULL; mp = mp->m_next) - ilen += mp->m_len; - -#ifdef VJC - if (sc->sc_flags & SC_VJ_RESET) { - /* - * If we've missed a packet, we must toss subsequent compressed - * packets which don't have an explicit connection ID. - */ - if (sc->sc_comp) - vj_uncompress_tcp(NULL, 0, TYPE_ERROR, sc->sc_comp); - s = splimp(); - sc->sc_flags &= ~SC_VJ_RESET; - splx(s); - } - - /* - * See if we have a VJ-compressed packet to uncompress. - */ - if (proto == PPP_VJC_COMP) { - if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == 0) - goto bad; - - xlen = vj_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN, - ilen - PPP_HDRLEN, TYPE_COMPRESSED_TCP, - sc->sc_comp, &iphdr, &hlen); - - if (xlen <= 0) { - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: VJ uncompress failed on type comp\n", - ifp->if_unit); - goto bad; - } - - /* Copy the PPP and IP headers into a new mbuf. */ - MGETHDR(mp, M_DONTWAIT, MT_DATA); - if (mp == NULL) - goto bad; - mp->m_len = 0; - mp->m_next = NULL; - if (hlen + PPP_HDRLEN > MHLEN) { - MCLGET(mp, M_DONTWAIT); - if (M_TRAILINGSPACE(mp) < hlen + PPP_HDRLEN) { - m_freem(mp); - goto bad; /* lose if big headers and no clusters */ - } - } - cp = mtod(mp, u_char *); - cp[0] = adrs; - cp[1] = ctrl; - cp[2] = 0; - cp[3] = PPP_IP; - proto = PPP_IP; - bcopy(iphdr, cp + PPP_HDRLEN, hlen); - mp->m_len = hlen + PPP_HDRLEN; - - /* - * Trim the PPP and VJ headers off the old mbuf - * and stick the new and old mbufs together. - */ - m->m_data += PPP_HDRLEN + xlen; - m->m_len -= PPP_HDRLEN + xlen; - if (m->m_len <= M_TRAILINGSPACE(mp)) { - bcopy(mtod(m, u_char *), mtod(mp, u_char *) + mp->m_len, m->m_len); - mp->m_len += m->m_len; - MFREE(m, mp->m_next); - } else - mp->m_next = m; - m = mp; - ilen += hlen - xlen; - - } else if (proto == PPP_VJC_UNCOMP) { - if ((sc->sc_flags & SC_REJ_COMP_TCP) || sc->sc_comp == 0) - goto bad; - - xlen = vj_uncompress_tcp_core(cp + PPP_HDRLEN, m->m_len - PPP_HDRLEN, - ilen - PPP_HDRLEN, TYPE_UNCOMPRESSED_TCP, - sc->sc_comp, &iphdr, &hlen); - - if (xlen < 0) { - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: VJ uncompress failed on type uncomp\n", - ifp->if_unit); - goto bad; - } - - proto = PPP_IP; - cp[3] = PPP_IP; - } -#endif /* VJC */ - - /* - * If the packet will fit in a header mbuf, don't waste a - * whole cluster on it. - */ - if (ilen <= MHLEN && M_IS_CLUSTER(m)) { - MGETHDR(mp, M_DONTWAIT, MT_DATA); - if (mp != NULL) { - m_copydata(m, 0, ilen, mtod(mp, caddr_t)); - m_freem(m); - m = mp; - m->m_len = ilen; - } - } - m->m_pkthdr.len = ilen; - m->m_pkthdr.rcvif = ifp; - - if ((proto & 0x8000) == 0) { -#ifdef PPP_FILTER - /* - * See whether we want to pass this packet, and - * if it counts as link activity. - */ - adrs = *mtod(m, u_char *); /* save address field */ - *mtod(m, u_char *) = 0; /* indicate inbound */ - if (sc->sc_pass_filt.bf_insns != 0 - && bpf_filter(sc->sc_pass_filt.bf_insns, (u_char *) m, - ilen, 0) == 0) { - /* drop this packet */ - m_freem(m); - return; - } - if (sc->sc_active_filt.bf_insns == 0 - || bpf_filter(sc->sc_active_filt.bf_insns, (u_char *) m, ilen, 0)) - { - microtime(&ppp_time); - - sc->sc_last_recv = ppp_time.tv_sec; - } - - *mtod(m, u_char *) = adrs; -#else - /* - * Record the time that we received this packet. - */ - microtime(&ppp_time); - sc->sc_last_recv = ppp_time.tv_sec; -#endif /* PPP_FILTER */ - } - -#if NBPFILTER > 0 - /* See if bpf wants to look at the packet. */ - if (sc->sc_bpf) - bpf_mtap(sc->sc_bpf, m); -#endif - - rv = 0; - switch (proto) { -#ifdef INET - case PPP_IP: - /* - * IP packet - take off the ppp header and pass it up to IP. - */ - if ((ifp->if_flags & IFF_UP) == 0 - || sc->sc_npmode[NP_IP] != NPMODE_PASS) { - /* interface is down - drop the packet. */ - m_freem(m); - return; - } - m->m_pkthdr.len -= PPP_HDRLEN; - m->m_data += PPP_HDRLEN; - m->m_len -= PPP_HDRLEN; - schednetisr(NETISR_IP); - inq = &ipintrq; - break; -#endif - - default: - /* - * Some other protocol - place on input queue for read(). - */ - inq = &sc->sc_inq; - rv = 1; - break; - } - - /* - * Put the packet on the appropriate input queue. - */ - s = splimp(); - if (IF_QFULL(inq)) { - IF_DROP(inq); - splx(s); - if (sc->sc_flags & SC_DEBUG) - printf("ppp%d: input queue full\n", ifp->if_unit); - ifp->if_iqdrops++; - goto bad; - } - IF_ENQUEUE(inq, m); - splx(s); - ifp->if_ipackets++; - ifp->if_ibytes += ilen; - microtime(&ppp_time); - ifp->if_lastchange = ppp_time; - - if (rv) - (*sc->sc_ctlp)(sc); - - return; - - bad: - m_freem(m); - sc->sc_if.if_ierrors++; - sc->sc_stats.ppp_ierrors++; -} - -#define MAX_DUMP_BYTES 128 - -static void -pppdumpm(m0) - struct mbuf *m0; -{ - char buf[3*MAX_DUMP_BYTES+4]; - char *bp = buf; - struct mbuf *m; - static char digits[] = "0123456789abcdef"; - - for (m = m0; m; m = m->m_next) { - int l = m->m_len; - u_char *rptr = (u_char *)m->m_data; - - while (l--) { - if (bp > buf + sizeof(buf) - 4) - goto done; - *bp++ = digits[*rptr >> 4]; /* convert byte to ascii hex */ - *bp++ = digits[*rptr++ & 0xf]; - } - - if (m->m_next) { - if (bp > buf + sizeof(buf) - 3) - goto done; - *bp++ = '|'; - } else - *bp++ = ' '; - } -done: - if (m) - *bp++ = '>'; - *bp = 0; - printf("%s\n", buf); -} - -#endif /* NPPP > 0 */ diff --git a/c/src/libnetworking/pppd/modem_example/ppp.h b/c/src/libnetworking/pppd/modem_example/ppp.h deleted file mode 100644 index a1f1038f0d..0000000000 --- a/c/src/libnetworking/pppd/modem_example/ppp.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __PPP_H__ -#define __PPP_H__ -#define NPPP 1 -#define NBPFILER 0 -#define VJC -/*#define PPP_COMPRESS*/ -#endif diff --git a/c/src/libnetworking/pppd/modem_example/pppcompress.c b/c/src/libnetworking/pppd/modem_example/pppcompress.c deleted file mode 100644 index a7d2734c8d..0000000000 --- a/c/src/libnetworking/pppd/modem_example/pppcompress.c +++ /dev/null @@ -1,593 +0,0 @@ -/*- - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND 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 REGENTS OR 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. - * - * @(#)slcompress.c 7.7 (Berkeley) 5/7/91 - */ - -/* - * Routines to compress and uncompess tcp packets (for transmission - * over low speed serial lines. - * - * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: - * - Initial distribution. - * - * $Id$ - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#ifndef SL_NO_STATS -#define INCR(counter) ++comp->counter; -#else -#define INCR(counter) -#endif - -#define BCMP(p1, p2, n) bcmp((char *)(p1), (char *)(p2), (int)(n)) -#define BCOPY(p1, p2, n) bcopy((char *)(p1), (char *)(p2), (int)(n)) -#ifndef KERNEL -#define ovbcopy bcopy -#endif - -void -vj_compress_init(comp, max_state) - struct vjcompress *comp; - int max_state; -{ - register u_int i; - register struct cstate *tstate = comp->tstate; - - if ((unsigned) max_state > MAX_STATES - 1) - max_state = MAX_STATES - 1; - bzero((char *)comp, sizeof(*comp)); - for (i = max_state; i > 0; --i) { - tstate[i].cs_id = i; - tstate[i].cs_next = &tstate[i - 1]; - } - tstate[0].cs_next = &tstate[max_state]; - tstate[0].cs_id = 0; - comp->last_cs = &tstate[0]; - comp->last_recv = 255; - comp->last_xmit = 255; - comp->flags = SLF_TOSS; -} - - -/* ENCODE encodes a number that is known to be non-zero. ENCODEZ - * checks for zero (since zero has to be encoded in the long, 3 byte - * form). - */ -#define ENCODE(n) { \ - if ((u_short)(n) >= 256) { \ - *cp++ = 0; \ - cp[1] = (n); \ - cp[0] = (n) >> 8; \ - cp += 2; \ - } else { \ - *cp++ = (n); \ - } \ -} -#define ENCODEZ(n) { \ - if ((u_short)(n) >= 256 || (u_short)(n) == 0) { \ - *cp++ = 0; \ - cp[1] = (n); \ - cp[0] = (n) >> 8; \ - cp += 2; \ - } else { \ - *cp++ = (n); \ - } \ -} - -#define DECODEL(f) { \ - if (*cp == 0) {\ - (f) = htonl(ntohl(f) + ((cp[1] << 8) | cp[2])); \ - cp += 3; \ - } else { \ - (f) = htonl(ntohl(f) + (u_long)*cp++); \ - } \ -} - -#define DECODES(f) { \ - if (*cp == 0) {\ - (f) = htons(ntohs(f) + ((cp[1] << 8) | cp[2])); \ - cp += 3; \ - } else { \ - (f) = htons(ntohs(f) + (u_long)*cp++); \ - } \ -} - -#define DECODEU(f) { \ - if (*cp == 0) {\ - (f) = htons((cp[1] << 8) | cp[2]); \ - cp += 3; \ - } else { \ - (f) = htons((u_long)*cp++); \ - } \ -} - -u_int -vj_compress_tcp(m, ip, comp, compress_cid) - struct mbuf *m; - register struct ip *ip; - struct vjcompress *comp; - int compress_cid; -{ - register struct cstate *cs = comp->last_cs->cs_next; - register u_int hlen = ip->ip_hl; - register struct tcphdr *oth; - register struct tcphdr *th; - register u_int deltaS, deltaA; - register u_int changes = 0; - u_char new_seq[16]; - register u_char *cp = new_seq; - - /* - * Bail if this is an IP fragment or if the TCP packet isn't - * `compressible' (i.e., ACK isn't set or some other control bit is - * set). (We assume that the caller has already made sure the - * packet is IP proto TCP). - */ - if ((ip->ip_off & htons(0x3fff)) || m->m_len < 40) - return (TYPE_IP); - - th = (struct tcphdr *)&((int *)ip)[hlen]; - if ((th->th_flags & (TH_SYN|TH_FIN|TH_RST|TH_ACK)) != TH_ACK) - return (TYPE_IP); - /* - * Packet is compressible -- we're going to send either a - * COMPRESSED_TCP or UNCOMPRESSED_TCP packet. Either way we need - * to locate (or create) the connection state. Special case the - * most recently used connection since it's most likely to be used - * again & we don't have to do any reordering if it's used. - */ - INCR(sls_packets) - if (ip->ip_src.s_addr != cs->cs_ip.ip_src.s_addr || - ip->ip_dst.s_addr != cs->cs_ip.ip_dst.s_addr || - *(int *)th != ((int *)&cs->cs_ip)[cs->cs_ip.ip_hl]) { - /* - * Wasn't the first -- search for it. - * - * States are kept in a circularly linked list with - * last_cs pointing to the end of the list. The - * list is kept in lru order by moving a state to the - * head of the list whenever it is referenced. Since - * the list is short and, empirically, the connection - * we want is almost always near the front, we locate - * states via linear search. If we don't find a state - * for the datagram, the oldest state is (re-)used. - */ - register struct cstate *lcs; - register struct cstate *lastcs = comp->last_cs; - - do { - lcs = cs; cs = cs->cs_next; - INCR(sls_searches) - if (ip->ip_src.s_addr == cs->cs_ip.ip_src.s_addr - && ip->ip_dst.s_addr == cs->cs_ip.ip_dst.s_addr - && *(int *)th == ((int *)&cs->cs_ip)[cs->cs_ip.ip_hl]) - goto found; - } while (cs != lastcs); - - /* - * Didn't find it -- re-use oldest cstate. Send an - * uncompressed packet that tells the other side what - * connection number we're using for this conversation. - * Note that since the state list is circular, the oldest - * state points to the newest and we only need to set - * last_cs to update the lru linkage. - */ - INCR(sls_misses) - comp->last_cs = lcs; - hlen += th->th_off; - hlen <<= 2; - goto uncompressed; - - found: - /* - * Found it -- move to the front on the connection list. - */ - if (cs == lastcs) - comp->last_cs = lcs; - else { - lcs->cs_next = cs->cs_next; - cs->cs_next = lastcs->cs_next; - lastcs->cs_next = cs; - } - } - - /* - * Make sure that only what we expect to change changed. The first - * line of the `if' checks the IP protocol version, header length & - * type of service. The 2nd line checks the "Don't fragment" bit. - * The 3rd line checks the time-to-live and protocol (the protocol - * check is unnecessary but costless). The 4th line checks the TCP - * header length. The 5th line checks IP options, if any. The 6th - * line checks TCP options, if any. If any of these things are - * different between the previous & current datagram, we send the - * current datagram `uncompressed'. - */ - oth = (struct tcphdr *)&((int *)&cs->cs_ip)[hlen]; - deltaS = hlen; - hlen += th->th_off; - hlen <<= 2; - - if (((u_short *)ip)[0] != ((u_short *)&cs->cs_ip)[0] || - ((u_short *)ip)[3] != ((u_short *)&cs->cs_ip)[3] || - ((u_short *)ip)[4] != ((u_short *)&cs->cs_ip)[4] || - th->th_off != oth->th_off || - (deltaS > 5 && - BCMP(ip + 1, &cs->cs_ip + 1, (deltaS - 5) << 2)) || - (th->th_off > 5 && - BCMP(th + 1, oth + 1, (th->th_off - 5) << 2))) - goto uncompressed; - - /* - * Figure out which of the changing fields changed. The - * receiver expects changes in the order: urgent, window, - * ack, seq (the order minimizes the number of temporaries - * needed in this section of code). - */ - if (th->th_flags & TH_URG) { - deltaS = ntohs(th->th_urp); - ENCODEZ(deltaS); - changes |= NEW_U; - } else if (th->th_urp != oth->th_urp) - /* argh! URG not set but urp changed -- a sensible - * implementation should never do this but RFC793 - * doesn't prohibit the change so we have to deal - * with it. */ - goto uncompressed; - - if (deltaS = (u_short)(ntohs(th->th_win) - ntohs(oth->th_win))) { - ENCODE(deltaS); - changes |= NEW_W; - } - - if (deltaA = ntohl(th->th_ack) - ntohl(oth->th_ack)) { - if (deltaA > 0xffff) - goto uncompressed; - ENCODE(deltaA); - changes |= NEW_A; - } - - if (deltaS = ntohl(th->th_seq) - ntohl(oth->th_seq)) { - if (deltaS > 0xffff) - goto uncompressed; - ENCODE(deltaS); - changes |= NEW_S; - } - - switch(changes) { - - case 0: - /* - * Nothing changed. If this packet contains data and the - * last one didn't, this is probably a data packet following - * an ack (normal on an interactive connection) and we send - * it compressed. Otherwise it's probably a retransmit, - * retransmitted ack or window probe. Send it uncompressed - * in case the other side missed the compressed version. - */ - if (ip->ip_len != cs->cs_ip.ip_len && - ntohs(cs->cs_ip.ip_len) == hlen) - break; - - /* (fall through) */ - - case SPECIAL_I: - case SPECIAL_D: - /* - * actual changes match one of our special case encodings -- - * send packet uncompressed. - */ - goto uncompressed; - - case NEW_S|NEW_A: - if (deltaS == deltaA && - deltaS == ntohs(cs->cs_ip.ip_len) - hlen) { - /* special case for echoed terminal traffic */ - changes = SPECIAL_I; - cp = new_seq; - } - break; - - case NEW_S: - if (deltaS == ntohs(cs->cs_ip.ip_len) - hlen) { - /* special case for data xfer */ - changes = SPECIAL_D; - cp = new_seq; - } - break; - } - - deltaS = ntohs(ip->ip_id) - ntohs(cs->cs_ip.ip_id); - if (deltaS != 1) { - ENCODEZ(deltaS); - changes |= NEW_I; - } - if (th->th_flags & TH_PUSH) - changes |= TCP_PUSH_BIT; - /* - * Grab the cksum before we overwrite it below. Then update our - * state with this packet's header. - */ - deltaA = ntohs(th->th_sum); - BCOPY(ip, &cs->cs_ip, hlen); - - /* - * We want to use the original packet as our compressed packet. - * (cp - new_seq) is the number of bytes we need for compressed - * sequence numbers. In addition we need one byte for the change - * mask, one for the connection id and two for the tcp checksum. - * So, (cp - new_seq) + 4 bytes of header are needed. hlen is how - * many bytes of the original packet to toss so subtract the two to - * get the new packet size. - */ - deltaS = cp - new_seq; - cp = (u_char *)ip; - if (compress_cid == 0 || comp->last_xmit != cs->cs_id) { - comp->last_xmit = cs->cs_id; - hlen -= deltaS + 4; - cp += hlen; - *cp++ = changes | NEW_C; - *cp++ = cs->cs_id; - } else { - hlen -= deltaS + 3; - cp += hlen; - *cp++ = changes; - } - m->m_len -= hlen; - m->m_data += hlen; - *cp++ = deltaA >> 8; - *cp++ = deltaA; - BCOPY(new_seq, cp, deltaS); - INCR(sls_compressed) - return (TYPE_COMPRESSED_TCP); - - /* - * Update connection state cs & send uncompressed packet ('uncompressed' - * means a regular ip/tcp packet but with the 'conversation id' we hope - * to use on future compressed packets in the protocol field). - */ -uncompressed: - BCOPY(ip, &cs->cs_ip, hlen); - ip->ip_p = cs->cs_id; - comp->last_xmit = cs->cs_id; - return (TYPE_UNCOMPRESSED_TCP); -} - - -int -vj_uncompress_tcp(bufp, len, type, comp) - u_char **bufp; - int len; - u_int type; - struct vjcompress *comp; -{ - u_char *hdr, *cp; - int hlen, vjlen; - - cp = bufp? *bufp: NULL; - vjlen = vj_uncompress_tcp_core(cp, len, len, type, comp, &hdr, &hlen); - if (vjlen < 0) - return (0); /* error */ - if (vjlen == 0) - return (len); /* was uncompressed already */ - - cp += vjlen; - len -= vjlen; - - /* - * At this point, cp points to the first byte of data in the - * packet. If we're not aligned on a 4-byte boundary, copy the - * data down so the ip & tcp headers will be aligned. Then back up - * cp by the tcp/ip header length to make room for the reconstructed - * header (we assume the packet we were handed has enough space to - * prepend 128 bytes of header). - */ - if ((int)cp & 3) { - if (len > 0) - (void) ovbcopy(cp, (caddr_t)((int)cp &~ 3), len); - cp = (u_char *)((int)cp &~ 3); - } - cp -= hlen; - len += hlen; - BCOPY(hdr, cp, hlen); - - *bufp = cp; - return (len); -} - -/* - * Uncompress a packet of total length total_len. The first buflen - * bytes are at buf; this must include the entire (compressed or - * uncompressed) TCP/IP header. This procedure returns the length - * of the VJ header, with a pointer to the uncompressed IP header - * in *hdrp and its length in *hlenp. - */ -int -vj_uncompress_tcp_core(buf, buflen, total_len, type, comp, hdrp, hlenp) - u_char *buf; - int buflen, total_len; - u_int type; - struct vjcompress *comp; - u_char **hdrp; - u_int *hlenp; -{ - register u_char *cp; - register u_int hlen, changes; - register struct tcphdr *th; - register struct cstate *cs; - register struct ip *ip; - register u_short *bp; - register u_int vjlen; - - switch (type) { - - case TYPE_UNCOMPRESSED_TCP: - ip = (struct ip *) buf; - if (ip->ip_p >= MAX_STATES) - goto bad; - cs = &comp->rstate[comp->last_recv = ip->ip_p]; - comp->flags &=~ SLF_TOSS; - ip->ip_p = IPPROTO_TCP; - /* - * Calculate the size of the TCP/IP header and make sure that - * we don't overflow the space we have available for it. - */ - hlen = ip->ip_hl << 2; - if (hlen + sizeof(struct tcphdr) > buflen) - goto bad; - hlen += ((struct tcphdr *)&((char *)ip)[hlen])->th_off << 2; - if (hlen > MAX_HDR || hlen > buflen) - goto bad; - BCOPY(ip, &cs->cs_ip, hlen); - cs->cs_hlen = hlen; - INCR(sls_uncompressedin) - *hdrp = (u_char *) &cs->cs_ip; - *hlenp = hlen; - return (0); - - default: - goto bad; - - case TYPE_COMPRESSED_TCP: - break; - } - /* We've got a compressed packet. */ - INCR(sls_compressedin) - cp = buf; - changes = *cp++; - if (changes & NEW_C) { - /* Make sure the state index is in range, then grab the state. - * If we have a good state index, clear the 'discard' flag. */ - if (*cp >= MAX_STATES) - goto bad; - - comp->flags &=~ SLF_TOSS; - comp->last_recv = *cp++; - } else { - /* this packet has an implicit state index. If we've - * had a line error since the last time we got an - * explicit state index, we have to toss the packet. */ - if (comp->flags & SLF_TOSS) { - INCR(sls_tossed) - return (-1); - } - } - cs = &comp->rstate[comp->last_recv]; - hlen = cs->cs_ip.ip_hl << 2; - th = (struct tcphdr *)&((u_char *)&cs->cs_ip)[hlen]; - th->th_sum = htons((*cp << 8) | cp[1]); - cp += 2; - if (changes & TCP_PUSH_BIT) - th->th_flags |= TH_PUSH; - else - th->th_flags &=~ TH_PUSH; - - switch (changes & SPECIALS_MASK) { - case SPECIAL_I: - { - register u_int i = ntohs(cs->cs_ip.ip_len) - cs->cs_hlen; - th->th_ack = htonl(ntohl(th->th_ack) + i); - th->th_seq = htonl(ntohl(th->th_seq) + i); - } - break; - - case SPECIAL_D: - th->th_seq = htonl(ntohl(th->th_seq) + ntohs(cs->cs_ip.ip_len) - - cs->cs_hlen); - break; - - default: - if (changes & NEW_U) { - th->th_flags |= TH_URG; - DECODEU(th->th_urp) - } else - th->th_flags &=~ TH_URG; - if (changes & NEW_W) - DECODES(th->th_win) - if (changes & NEW_A) - DECODEL(th->th_ack) - if (changes & NEW_S) - DECODEL(th->th_seq) - break; - } - if (changes & NEW_I) { - DECODES(cs->cs_ip.ip_id) - } else - cs->cs_ip.ip_id = htons(ntohs(cs->cs_ip.ip_id) + 1); - - /* - * At this point, cp points to the first byte of data in the - * packet. Fill in the IP total length and update the IP - * header checksum. - */ - vjlen = cp - buf; - buflen -= vjlen; - if (buflen < 0) - /* we must have dropped some characters (crc should detect - * this but the old slip framing won't) */ - goto bad; - - total_len += cs->cs_hlen - vjlen; - cs->cs_ip.ip_len = htons(total_len); - - /* recompute the ip header checksum */ - bp = (u_short *) &cs->cs_ip; - cs->cs_ip.ip_sum = 0; - for (changes = 0; hlen > 0; hlen -= 2) - changes += *bp++; - changes = (changes & 0xffff) + (changes >> 16); - changes = (changes & 0xffff) + (changes >> 16); - cs->cs_ip.ip_sum = ~ changes; - - *hdrp = (u_char *) &cs->cs_ip; - *hlenp = cs->cs_hlen; - return vjlen; - -bad: - comp->flags |= SLF_TOSS; - INCR(sls_errorin) - return (-1); -} diff --git a/c/src/libnetworking/pppd/pppd.h b/c/src/libnetworking/pppd/pppd.h index e30ddfe55e..3e4f6c68ee 100644 --- a/c/src/libnetworking/pppd/pppd.h +++ b/c/src/libnetworking/pppd/pppd.h @@ -589,6 +589,8 @@ extern void (*auth_linkdown_hook) __P((void)); #define DEBUGCHAP 1 #endif #define DEBUGMAIN 1 +#define DEBUGUPAP 1 +#define DEBUGCHAP 1 #ifdef DEBUGMAIN diff --git a/c/src/libnetworking/pppd/rtemsmain.c b/c/src/libnetworking/pppd/rtemsmain.c index 5a266a9ff3..38383c6e06 100644 --- a/c/src/libnetworking/pppd/rtemsmain.c +++ b/c/src/libnetworking/pppd/rtemsmain.c @@ -107,8 +107,6 @@ int phase; /* where the link is at */ int kill_link; int open_ccp_flag; -static int waiting; - char **script_env; /* Env. variable values for scripts */ int s_env_nalloc; /* # words avail at script_env */ @@ -234,8 +232,6 @@ pppdmain(argc, argv) setlogmask(LOG_UPTO(LOG_DEBUG)); */ - waiting = 0; - do_callback = 0; for (;;) { @@ -400,12 +396,10 @@ pppdmain(argc, argv) status = EXIT_NEGOTIATION_FAILED; new_phase(PHASE_ESTABLISH); while (phase != PHASE_DEAD) { - waiting = 1; wait_input(timeleft(&timo)); - waiting = 0; - calltimeout(); get_input(); + if (kill_link) { lcp_close(0, "User request"); kill_link = 0; @@ -469,9 +463,7 @@ pppdmain(argc, argv) new_phase(PHASE_HOLDOFF); TIMEOUT(holdoff_end, NULL, t); do { - waiting = 1; wait_input(timeleft(&timo)); - waiting = 0; calltimeout(); if (kill_link) { -- cgit v1.2.3