2 * sys-linux.c - System-dependent procedures for setting up
3 * PPP interfaces on Linux systems
5 * Copyright (c) 1989 Carnegie Mellon University.
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by Carnegie Mellon University. The name of the
14 * University may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 #include <sys/ioctl.h>
22 #include <sys/types.h>
23 #include <sys/socket.h>
25 #include <sys/errno.h>
28 #include <sys/utsname.h>
44 /* This is in netdevice.h. However, this compile will fail miserably if
45 you attempt to include netdevice.h because it has so many references
46 to __memcpy functions which it should not attempt to do. So, since I
47 really don't use it, but it must be defined, define it now. */
50 #define MAX_ADDR_LEN 7
54 #include <asm/types.h> /* glibc 2 conflicts with linux/types.h */
56 #include <net/if_arp.h>
57 #include <net/route.h>
58 #include <netinet/if_ether.h>
60 #include <linux/types.h>
62 #include <linux/if_arp.h>
63 #include <linux/route.h>
64 #include <linux/if_ether.h>
66 #include <netinet/in.h>
67 #include <arpa/inet.h>
69 #include <linux/ppp_defs.h>
70 #include <linux/if_ppp.h>
75 #include "patchlevel.h"
79 #if __GLIBC__ >= 2 && \
80 !(defined(__powerpc__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
81 #include <netipx/ipx.h>
83 #include <linux/ipx.h>
85 #endif /* IPX_CHANGE */
88 #include <sys/locks.h>
91 #ifndef RTF_DEFAULT /* Normally in <linux/route.h> from <net/route.h> */
95 /* We can get an EIO error on an ioctl if the modem has hung up */
96 #define ok_error(num) ((num)==EIO)
98 static int tty_disc = N_TTY; /* The TTY discipline */
99 static int ppp_disc = N_PPP; /* The PPP discpline */
100 static int initfdflags = -1; /* Initial file descriptor flags for fd */
101 static int ppp_fd = -1; /* fd which is set to PPP discipline */
102 static int sock_fd = -1; /* socket for doing interface ioctls */
103 static int slave_fd = -1;
104 static int master_fd = -1;
106 static fd_set in_fds; /* set of fds that wait_input waits for */
107 static int max_in_fd; /* highest fd set in in_fds */
109 static int has_proxy_arp = 0;
110 static int driver_version = 0;
111 static int driver_modification = 0;
112 static int driver_patch = 0;
113 static int driver_is_old = 0;
114 static int restore_term = 0; /* 1 => we've munged the terminal */
115 static struct termios inittermios; /* Initial TTY termios */
117 static char loop_name[20];
118 static unsigned char inbuf[512]; /* buffer for chars read from loopback */
120 static int if_is_up; /* Interface has been marked up */
121 static u_int32_t default_route_gateway; /* Gateway for default route added */
122 static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
124 static char *lock_file;
126 static struct utsname utsname; /* for the kernel version */
127 static int kernel_version;
128 #define KVERSION(j,n,p) ((j)*1000000 + (n)*1000 + (p))
132 #define FLAGS_GOOD (IFF_UP | IFF_BROADCAST)
133 #define FLAGS_MASK (IFF_UP | IFF_BROADCAST | \
134 IFF_POINTOPOINT | IFF_LOOPBACK | IFF_NOARP)
136 /* Prototypes for procedures local to this file. */
137 static int get_flags (void);
138 static void set_flags (int flags);
139 static int translate_speed (int bps);
140 static int baud_rate_of (int speed);
141 static char *path_to_route (void);
142 static void close_route_table (void);
143 static int open_route_table (void);
144 static int read_route_table (struct rtentry *rt);
145 static int defaultroute_exists (struct rtentry *rt);
146 static int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr,
148 static void decode_version (char *buf, int *version, int *mod, int *patch);
149 static int set_kdebugflag(int level);
150 static int ppp_registered(void);
152 extern u_char inpacket_buf[]; /* borrowed from main.c */
155 * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
159 #define SET_SA_FAMILY(addr, family) \
160 memset ((char *) &(addr), '\0', sizeof(addr)); \
161 addr.sa_family = (family);
164 * Determine if the PPP connection should still be present.
170 #define LOCK_PREFIX "/var/lock/LCK.."
173 static void set_ppp_fd (int new_fd)
175 SYSDEBUG ((LOG_DEBUG, "setting ppp_fd to %d\n", new_fd));
179 static int still_ppp(void)
181 if (!hungup || ppp_fd == slave_fd)
184 set_ppp_fd(slave_fd);
190 /********************************************************************
192 * Functions to read and set the flags value in the device driver
195 static int get_flags (void)
199 if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &flags) < 0) {
200 if ( ok_error (errno) )
203 fatal("ioctl(PPPIOCGFLAGS): %m");
206 SYSDEBUG ((LOG_DEBUG, "get flags = %x\n", flags));
210 /********************************************************************/
212 static void set_flags (int flags)
214 SYSDEBUG ((LOG_DEBUG, "set flags = %x\n", flags));
216 if (ioctl(ppp_fd, PPPIOCSFLAGS, (caddr_t) &flags) < 0) {
217 if (! ok_error (errno) )
218 fatal("ioctl(PPPIOCSFLAGS, %x): %m(%d)", flags, errno);
222 /********************************************************************
224 * sys_init - System-dependent initialization.
229 int osmaj, osmin, ospatch;
231 openlog("pppd", LOG_PID | LOG_NDELAY, LOG_PPP);
232 setlogmask(LOG_UPTO(LOG_INFO));
234 setlogmask(LOG_UPTO(LOG_DEBUG));
236 /* Get an internet socket for doing socket ioctls. */
237 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
239 if ( ! ok_error ( errno ))
240 fatal("Couldn't create IP socket: %m(%d)", errno);
247 osmaj = osmin = ospatch = 0;
248 sscanf(utsname.release, "%d.%d.%d", &osmaj, &osmin, &ospatch);
249 kernel_version = KVERSION(osmaj, osmin, ospatch);
252 /********************************************************************
254 * sys_cleanup - restore any system state we modified before exiting:
255 * mark the interface down, delete default route and/or proxy arp entry.
256 * This shouldn't call die() because it's called from die().
259 void sys_cleanup(void)
262 * Take down the device
267 * Delete any routes through the device.
269 if (default_route_gateway != 0)
270 cifdefaultroute(0, 0, default_route_gateway);
273 cifproxyarp(0, proxy_arp_addr);
276 /********************************************************************
278 * sys_close - Clean up in a child process before execing.
288 /********************************************************************
290 * set_kdebugflag - Define the debugging level for the kernel
293 static int set_kdebugflag (int requested_level)
295 if (ioctl(ppp_fd, PPPIOCSDEBUG, &requested_level) < 0) {
296 if ( ! ok_error (errno) )
297 error("ioctl(PPPIOCSDEBUG): %m");
300 SYSDEBUG ((LOG_INFO, "set kernel debugging level to %d",
305 /********************************************************************
307 * establish_ppp - Turn the serial port into a ppp interface.
310 int establish_ppp (int tty_fd)
314 * The current PPP device will be the tty file.
318 * Ensure that the tty device is in exclusive mode.
320 if (ioctl(tty_fd, TIOCEXCL, 0) < 0) {
321 if ( ! ok_error ( errno ))
322 warn("ioctl(TIOCEXCL): %m");
325 * Demand mode - prime the old ppp device to relinquish the unit.
327 if (demand && ioctl(slave_fd, PPPIOCXFERUNIT, 0) < 0)
328 fatal("ioctl(transfer ppp unit): %m(%d)", errno);
330 * Set the current tty to the PPP discpline
332 if (ioctl(ppp_fd, TIOCSETD, &ppp_disc) < 0) {
333 if ( ! ok_error (errno) )
334 fatal("ioctl(TIOCSETD): %m(%d)", errno);
337 * Find out which interface we were given.
339 if (ioctl(ppp_fd, PPPIOCGUNIT, &x) < 0) {
340 if ( ! ok_error (errno))
341 fatal("ioctl(PPPIOCGUNIT): %m(%d)", errno);
344 * Check that we got the same unit again.
348 fatal("transfer_ppp failed: wanted unit %d, got %d", ifunit, x);
353 * Enable debug in the driver if requested.
356 set_kdebugflag (kdebugflag);
358 set_flags (get_flags() & ~(SC_RCV_B7_0 | SC_RCV_B7_1 |
359 SC_RCV_EVNP | SC_RCV_ODDP));
361 SYSDEBUG ((LOG_NOTICE, "Using version %d.%d.%d of PPP driver",
362 driver_version, driver_modification, driver_patch));
364 * Fetch the initial file flags and reset blocking mode on the file.
366 initfdflags = fcntl(ppp_fd, F_GETFL);
368 if (initfdflags == -1 ||
369 fcntl(ppp_fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
370 if ( ! ok_error (errno))
371 warn("Couldn't set device to non-blocking mode: %m");
377 /********************************************************************
379 * disestablish_ppp - Restore the serial port to normal operation.
380 * This shouldn't call die() because it's called from die().
383 void disestablish_ppp(int tty_fd)
386 * Attempt to restore the previous tty settings
390 * Restore the previous line discipline
392 if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
393 if ( ! ok_error (errno))
394 error("ioctl(TIOCSETD, N_TTY): %m");
397 if (ioctl(tty_fd, TIOCNXCL, 0) < 0) {
398 if ( ! ok_error (errno))
399 warn("ioctl(TIOCNXCL): %m(%d)", errno);
402 /* Reset non-blocking mode on fd. */
403 if (initfdflags != -1 && fcntl(tty_fd, F_SETFL, initfdflags) < 0) {
404 if ( ! ok_error (errno))
405 warn("Couldn't restore device fd flags: %m");
411 /********************************************************************
413 * clean_check - Fetch the flags for the device and generate
414 * appropriate error messages.
416 void clean_check(void)
422 if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) == 0) {
424 switch (~x & (SC_RCV_B7_0|SC_RCV_B7_1|SC_RCV_EVNP|SC_RCV_ODDP)) {
426 case SC_RCV_B7_0 | SC_RCV_EVNP:
427 case SC_RCV_B7_0 | SC_RCV_ODDP:
428 case SC_RCV_B7_0 | SC_RCV_ODDP | SC_RCV_EVNP:
429 s = "all had bit 7 set to 1";
433 case SC_RCV_B7_1 | SC_RCV_EVNP:
434 case SC_RCV_B7_1 | SC_RCV_ODDP:
435 case SC_RCV_B7_1 | SC_RCV_ODDP | SC_RCV_EVNP:
436 s = "all had bit 7 set to 0";
440 s = "all had odd parity";
444 s = "all had even parity";
449 warn("Receive serial link is not 8-bit clean:");
450 warn("Problem: %s", s);
458 * List of valid speeds.
462 int speed_int, speed_val;
539 /********************************************************************
541 * Translate from bits/second to a speed_t.
544 static int translate_speed (int bps)
546 struct speed *speedp;
549 for (speedp = speeds; speedp->speed_int; speedp++) {
550 if (bps == speedp->speed_int)
551 return speedp->speed_val;
553 warn("speed %d not supported", bps);
558 /********************************************************************
560 * Translate from a speed_t to bits/second.
563 static int baud_rate_of (int speed)
565 struct speed *speedp;
568 for (speedp = speeds; speedp->speed_int; speedp++) {
569 if (speed == speedp->speed_val)
570 return speedp->speed_int;
576 /********************************************************************
578 * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
579 * at the requested speed, etc. If `local' is true, set CLOCAL
580 * regardless of whether the modem option was specified.
583 void set_up_tty(int tty_fd, int local)
589 if (tcgetattr(tty_fd, &tios) < 0) {
590 if (!ok_error(errno))
591 fatal("tcgetattr: %m(%d)", errno);
598 tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
599 tios.c_cflag |= CS8 | CREAD | HUPCL;
601 tios.c_iflag = IGNBRK | IGNPAR;
605 tios.c_cc[VTIME] = 0;
608 tios.c_cflag ^= (CLOCAL | HUPCL);
612 tios.c_cflag |= CRTSCTS;
616 tios.c_iflag |= IXON | IXOFF;
617 tios.c_cc[VSTOP] = 0x13; /* DC3 = XOFF = ^S */
618 tios.c_cc[VSTART] = 0x11; /* DC1 = XON = ^Q */
622 tios.c_cflag &= ~CRTSCTS;
629 speed = translate_speed(inspeed);
631 cfsetospeed (&tios, speed);
632 cfsetispeed (&tios, speed);
635 * We can't proceed if the serial port speed is B0,
636 * since that implies that the serial port is disabled.
639 speed = cfgetospeed(&tios);
641 fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
644 if (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0)
645 if (!ok_error(errno))
646 fatal("tcsetattr: %m");
648 baud_rate = baud_rate_of(speed);
652 /********************************************************************
654 * setdtr - control the DTR line on the serial port.
655 * This is called from die(), so it shouldn't call die().
658 void setdtr (int tty_fd, int on)
660 int modembits = TIOCM_DTR;
662 ioctl(tty_fd, (on ? TIOCMBIS : TIOCMBIC), &modembits);
665 /********************************************************************
667 * restore_tty - restore the terminal to the saved settings.
670 void restore_tty (int tty_fd)
675 * Turn off echoing, because otherwise we can get into
676 * a loop with the tty and the modem echoing to each other.
677 * We presume we are the sole user of this tty device, so
678 * when we close it, it will revert to its defaults anyway.
681 inittermios.c_lflag &= ~(ECHO | ECHONL);
683 if (tcsetattr(tty_fd, TCSAFLUSH, &inittermios) < 0) {
684 if (! ok_error (errno))
685 warn("tcsetattr: %m");
690 /********************************************************************
692 * output - Output PPP packet.
695 void output (int unit, unsigned char *p, int len)
698 dbglog("sent %P", p, len);
700 if (write(ppp_fd, p, len) < 0) {
701 if (errno == EWOULDBLOCK || errno == ENOBUFS
702 || errno == ENXIO || errno == EIO || errno == EINTR)
703 warn("write: warning: %m (%d)", errno);
705 error("write: %m (%d)", errno);
709 /********************************************************************
711 * wait_input - wait until there is data available,
712 * for the length of time specified by *timo (indefinite
716 void wait_input(struct timeval *timo)
722 n = select(max_in_fd + 1, &ready, NULL, &ready, timo);
723 if (n < 0 && errno != EINTR)
724 fatal("select: %m(%d)", errno);
728 * add_fd - add an fd to the set that wait_input waits for.
738 * remove_fd - remove an fd from the set that wait_input waits for.
740 void remove_fd(int fd)
746 /********************************************************************
748 * wait_loop_output - wait until there is data available on the
749 * loopback, for the length of time specified by *timo (indefinite
752 void wait_loop_output(timo)
753 struct timeval *timo;
759 FD_SET(master_fd, &ready);
760 n = select(master_fd + 1, &ready, NULL, &ready, timo);
761 if (n < 0 && errno != EINTR)
762 fatal("select: %m(%d)", errno);
765 /********************************************************************
767 * wait_time - wait for a given length of time or until a
768 * signal is received.
772 struct timeval *timo;
776 n = select(0, NULL, NULL, NULL, timo);
777 if (n < 0 && errno != EINTR)
778 fatal("select: %m(%d)", errno);
782 /********************************************************************
784 * read_packet - get a PPP packet from the serial device.
787 int read_packet (unsigned char *buf)
791 len = read(ppp_fd, buf, PPP_MTU + PPP_HDRLEN);
793 if (errno == EWOULDBLOCK || errno == EIO)
795 fatal("read: %m(%d)", errno);
800 /********************************************************************
802 * get_loop_output - get outgoing packets from the ppp device,
803 * and detect when we want to bring the real link up.
804 * Return value is 1 if we need to bring up the link, 0 otherwise.
807 get_loop_output(void)
810 int n = read(master_fd, inbuf, sizeof(inbuf));
813 if (loop_chars(inbuf, n))
815 n = read(master_fd, inbuf, sizeof(inbuf));
819 fatal("eof on loopback");
821 if (errno != EWOULDBLOCK)
822 fatal("read from loopback: %m(%d)", errno);
827 /********************************************************************
829 * ppp_send_config - configure the transmit characteristics of
833 void ppp_send_config (int unit,int mtu,u_int32_t asyncmap,int pcomp,int accomp)
838 SYSDEBUG ((LOG_DEBUG, "send_config: mtu = %d\n", mtu));
840 * Ensure that the link is still up.
845 * Set the MTU and other parameters for the ppp device
847 memset (&ifr, '\0', sizeof (ifr));
848 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
851 if (ioctl(sock_fd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
852 fatal("ioctl(SIOCSIFMTU): %m(%d)", errno);
854 SYSDEBUG ((LOG_DEBUG, "send_config: asyncmap = %lx\n", asyncmap));
855 if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0) {
856 if (!ok_error(errno))
857 fatal("ioctl(PPPIOCSASYNCMAP): %m(%d)", errno);
862 x = pcomp ? x | SC_COMP_PROT : x & ~SC_COMP_PROT;
863 x = accomp ? x | SC_COMP_AC : x & ~SC_COMP_AC;
867 /********************************************************************
869 * ppp_set_xaccm - set the extended transmit ACCM for the interface.
872 void ppp_set_xaccm (int unit, ext_accm accm)
874 SYSDEBUG ((LOG_DEBUG, "set_xaccm: %08lx %08lx %08lx %08lx\n",
875 accm[0], accm[1], accm[2], accm[3]));
877 if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY) {
878 if ( ! ok_error (errno))
879 warn("ioctl(set extended ACCM): %m(%d)", errno);
883 /********************************************************************
885 * ppp_recv_config - configure the receive-side characteristics of
889 void ppp_recv_config (int unit,int mru,u_int32_t asyncmap,int pcomp,int accomp)
893 SYSDEBUG ((LOG_DEBUG, "recv_config: mru = %d\n", mru));
895 * If we were called because the link has gone down then there is nothing
896 * which may be done. Just return without incident.
901 * Set the receiver parameters
903 if (ioctl(ppp_fd, PPPIOCSMRU, (caddr_t) &mru) < 0) {
904 if ( ! ok_error (errno))
905 error("ioctl(PPPIOCSMRU): %m(%d)", errno);
908 SYSDEBUG ((LOG_DEBUG, "recv_config: asyncmap = %lx\n", asyncmap));
909 if (ioctl(ppp_fd, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap) < 0) {
910 if (!ok_error(errno))
911 error("ioctl(PPPIOCSRASYNCMAP): %m(%d)", errno);
915 x = !accomp? x | SC_REJ_COMP_AC: x &~ SC_REJ_COMP_AC;
919 /********************************************************************
921 * ccp_test - ask kernel whether a given compression method
922 * is acceptable for use.
925 int ccp_test (int unit, u_char *opt_ptr, int opt_len, int for_transmit)
927 struct ppp_option_data data;
929 memset (&data, '\0', sizeof (data));
931 data.length = opt_len;
932 data.transmit = for_transmit;
934 if (ioctl(ppp_fd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0)
937 return (errno == ENOBUFS)? 0: -1;
940 /********************************************************************
942 * ccp_flags_set - inform kernel about the current state of CCP.
945 void ccp_flags_set (int unit, int isopen, int isup)
949 x = isopen? x | SC_CCP_OPEN : x &~ SC_CCP_OPEN;
950 x = isup? x | SC_CCP_UP : x &~ SC_CCP_UP;
955 /********************************************************************
957 * get_idle_time - return how long the link has been idle.
964 return ioctl(ppp_fd, PPPIOCGIDLE, ip) >= 0;
967 /********************************************************************
969 * ccp_fatal_error - returns 1 if decompression was disabled as a
970 * result of an error detected after decompression of a packet,
971 * 0 otherwise. This is necessary because of patent nonsense.
974 int ccp_fatal_error (int unit)
978 return x & SC_DC_FERROR;
982 * path_to_route - determine the path to the proc file system data
984 #define ROUTE_MAX_COLS 12
985 FILE *route_fd = (FILE *) 0;
986 static char route_buffer [512];
987 static int route_dev_col, route_dest_col, route_gw_col;
988 static int route_flags_col, route_mask_col;
989 static int route_num_cols;
991 static char *path_to_route (void);
992 static int open_route_table (void);
993 static void close_route_table (void);
994 static int read_route_table (struct rtentry *rt);
996 /********************************************************************
998 * path_to_procfs - find the path to the proc file system mount point
1001 static int path_to_procfs (void)
1003 struct mntent *mntent;
1006 fp = fopen(MOUNTED, "r");
1008 /* Default the mount location of /proc */
1009 strlcpy (route_buffer, "/proc", sizeof (route_buffer));
1013 while ((mntent = getmntent(fp)) != NULL) {
1014 if (strcmp(mntent->mnt_type, MNTTYPE_IGNORE) == 0)
1016 if (strcmp(mntent->mnt_type, "proc") == 0)
1023 strlcpy(route_buffer, mntent->mnt_dir, sizeof (route_buffer));
1027 /********************************************************************
1029 * path_to_route - find the path to the route tables in the proc file system
1032 static char *path_to_route (void)
1034 if (!path_to_procfs()) {
1035 error("proc file system not mounted");
1038 strlcat (route_buffer, "/net/route", sizeof(route_buffer));
1039 return (route_buffer);
1042 /********************************************************************
1044 * close_route_table - close the interface to the route table
1047 static void close_route_table (void)
1049 if (route_fd != (FILE *) 0) {
1051 route_fd = (FILE *) 0;
1055 /********************************************************************
1057 * open_route_table - open the interface to the route table
1059 static char route_delims[] = " \t\n";
1061 static int open_route_table (void)
1065 close_route_table();
1067 path = path_to_route();
1071 route_fd = fopen (path, "r");
1072 if (route_fd == NULL) {
1073 error("can't open %s: %m (%d)", path, errno);
1077 route_dev_col = 0; /* default to usual columns */
1080 route_flags_col = 3;
1084 /* parse header line */
1085 if (fgets(route_buffer, sizeof(route_buffer), route_fd) != 0) {
1086 char *p = route_buffer, *q;
1088 for (col = 0; col < ROUTE_MAX_COLS; ++col) {
1090 if ((q = strtok(p, route_delims)) == 0)
1092 if (strcasecmp(q, "iface") == 0)
1093 route_dev_col = col;
1094 else if (strcasecmp(q, "destination") == 0)
1095 route_dest_col = col;
1096 else if (strcasecmp(q, "gateway") == 0)
1098 else if (strcasecmp(q, "flags") == 0)
1099 route_flags_col = col;
1100 else if (strcasecmp(q, "mask") == 0)
1101 route_mask_col = col;
1104 if (used && col >= route_num_cols)
1105 route_num_cols = col + 1;
1113 /********************************************************************
1115 * read_route_table - read the next entry from the route table
1118 static int read_route_table(struct rtentry *rt)
1120 char *cols[ROUTE_MAX_COLS], *p;
1123 memset (rt, '\0', sizeof (struct rtentry));
1125 if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0)
1129 for (col = 0; col < route_num_cols; ++col) {
1130 cols[col] = strtok(p, route_delims);
1131 if (cols[col] == NULL)
1132 return 0; /* didn't get enough columns */
1135 ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr =
1136 strtoul(cols[route_dest_col], NULL, 16);
1138 ((struct sockaddr_in *) &rt->rt_gateway)->sin_addr.s_addr =
1139 strtoul(cols[route_gw_col], NULL, 16);
1141 ((struct sockaddr_in *) &rt->rt_genmask)->sin_addr.s_addr =
1142 strtoul(cols[route_mask_col], NULL, 16);
1144 rt->rt_flags = (short) strtoul(cols[route_flags_col], NULL, 16);
1145 rt->rt_dev = cols[route_dev_col];
1150 /********************************************************************
1152 * defaultroute_exists - determine if there is a default route
1155 static int defaultroute_exists (struct rtentry *rt)
1159 if (!open_route_table())
1162 while (read_route_table(rt) != 0) {
1163 if ((rt->rt_flags & RTF_UP) == 0)
1166 if (((struct sockaddr_in *) (&rt->rt_dst))->sin_addr.s_addr == 0L) {
1172 close_route_table();
1177 * have_route_to - determine if the system has any route to
1178 * a given IP address. `addr' is in network byte order.
1179 * Return value is 1 if yes, 0 if no, -1 if don't know.
1180 * For demand mode to work properly, we have to ignore routes
1181 * through our own interface.
1183 int have_route_to(u_int32_t addr)
1188 if (!open_route_table())
1189 return -1; /* don't know */
1191 while (read_route_table(&rt)) {
1192 if ((rt.rt_flags & RTF_UP) == 0 || strcmp(rt.rt_dev, ifname) == 0)
1194 if ((addr & ((struct sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr)
1195 == ((struct sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr) {
1201 close_route_table();
1205 /********************************************************************
1207 * sifdefaultroute - assign a default route through the address given.
1210 int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1214 if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
1215 struct in_addr old_gateway =
1216 ((struct sockaddr_in *) (&rt.rt_gateway))-> sin_addr;
1218 if (old_gateway.s_addr != gateway)
1219 error("not replacing existing default route to %s [%I]",
1220 rt.rt_dev, old_gateway);
1224 memset (&rt, '\0', sizeof (rt));
1225 SET_SA_FAMILY (rt.rt_dst, AF_INET);
1226 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1228 if (kernel_version > KVERSION(2,1,0)) {
1229 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1230 ((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = 0L;
1233 ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = gateway;
1235 rt.rt_flags = RTF_UP | RTF_GATEWAY | RTF_DEFAULT;
1236 if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
1237 if ( ! ok_error ( errno ))
1238 error("default route ioctl(SIOCADDRT): %m(%d)", errno);
1242 default_route_gateway = gateway;
1246 /********************************************************************
1248 * cifdefaultroute - delete a default route through the address given.
1251 int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1255 default_route_gateway = 0;
1257 memset (&rt, '\0', sizeof (rt));
1258 SET_SA_FAMILY (rt.rt_dst, AF_INET);
1259 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1261 if (kernel_version > KVERSION(2,1,0)) {
1262 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1263 ((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = 0L;
1266 ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = gateway;
1268 rt.rt_flags = RTF_UP | RTF_GATEWAY | RTF_DEFAULT;
1269 if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
1271 if ( ! ok_error ( errno ))
1272 error("default route ioctl(SIOCDELRT): %m (%d)", errno);
1280 /********************************************************************
1282 * sifproxyarp - Make a proxy ARP entry for the peer.
1285 int sifproxyarp (int unit, u_int32_t his_adr)
1287 struct arpreq arpreq;
1289 if (has_proxy_arp == 0) {
1290 memset (&arpreq, '\0', sizeof(arpreq));
1292 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1293 ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = his_adr;
1294 arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1296 * Get the hardware address of an interface on the same subnet
1297 * as our local address.
1299 if (!get_ether_addr(his_adr, &arpreq.arp_ha, arpreq.arp_dev)) {
1300 error("Cannot determine ethernet address for proxy ARP");
1304 if (ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq) < 0) {
1305 if ( ! ok_error ( errno ))
1306 error("ioctl(SIOCSARP): %m(%d)", errno);
1309 proxy_arp_addr = his_adr;
1316 /********************************************************************
1318 * cifproxyarp - Delete the proxy ARP entry for the peer.
1321 int cifproxyarp (int unit, u_int32_t his_adr)
1323 struct arpreq arpreq;
1325 if (has_proxy_arp) {
1327 memset (&arpreq, '\0', sizeof(arpreq));
1328 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1329 ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = his_adr;
1330 arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1332 if (ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq) < 0) {
1333 if ( ! ok_error ( errno ))
1334 warn("ioctl(SIOCDARP): %m(%d)", errno);
1341 /********************************************************************
1343 * get_ether_addr - get the hardware address of an interface on the
1344 * the same subnet as ipaddr.
1347 static int get_ether_addr (u_int32_t ipaddr,
1348 struct sockaddr *hwaddr,
1351 struct ifreq *ifr, *ifend;
1352 u_int32_t ina, mask;
1355 struct ifreq ifs[MAX_IFS];
1357 ifc.ifc_len = sizeof(ifs);
1359 if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1360 if ( ! ok_error ( errno ))
1361 error("ioctl(SIOCGIFCONF): %m(%d)", errno);
1365 SYSDEBUG ((LOG_DEBUG, "proxy arp: scanning %d interfaces for IP %s",
1366 ifc.ifc_len / sizeof(struct ifreq), ip_ntoa(ipaddr)));
1368 * Scan through looking for an interface with an Internet
1369 * address on the same subnet as `ipaddr'.
1371 ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq));
1372 for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1373 if (ifr->ifr_addr.sa_family == AF_INET) {
1374 ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
1375 strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1376 SYSDEBUG ((LOG_DEBUG, "proxy arp: examining interface %s",
1379 * Check that the interface is up, and not point-to-point
1382 if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1385 if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1388 * Get its netmask and check that it's on the right subnet.
1390 if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1393 mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr;
1394 SYSDEBUG ((LOG_DEBUG, "proxy arp: interface addr %s mask %lx",
1395 ip_ntoa(ina), ntohl(mask)));
1397 if (((ipaddr ^ ina) & mask) != 0)
1406 memcpy (name, ifreq.ifr_name, sizeof(ifreq.ifr_name));
1407 info("found interface %s for proxy arp", name);
1409 * Now get the hardware address.
1411 memset (&ifreq.ifr_hwaddr, 0, sizeof (struct sockaddr));
1412 if (ioctl (sock_fd, SIOCGIFHWADDR, &ifreq) < 0) {
1413 error("SIOCGIFHWADDR(%s): %m(%d)", ifreq.ifr_name, errno);
1419 sizeof (struct sockaddr));
1421 SYSDEBUG ((LOG_DEBUG,
1422 "proxy arp: found hwaddr %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
1423 (int) ((unsigned char *) &hwaddr->sa_data)[0],
1424 (int) ((unsigned char *) &hwaddr->sa_data)[1],
1425 (int) ((unsigned char *) &hwaddr->sa_data)[2],
1426 (int) ((unsigned char *) &hwaddr->sa_data)[3],
1427 (int) ((unsigned char *) &hwaddr->sa_data)[4],
1428 (int) ((unsigned char *) &hwaddr->sa_data)[5],
1429 (int) ((unsigned char *) &hwaddr->sa_data)[6],
1430 (int) ((unsigned char *) &hwaddr->sa_data)[7]));
1434 /********************************************************************
1436 * Return user specified netmask, modified by any mask we might determine
1437 * for address `addr' (in network byte order).
1438 * Here we scan through the system's list of interfaces, looking for
1439 * any non-point-to-point interfaces which might appear to be on the same
1440 * network as `addr'. If we find any, we OR in their netmask to the
1441 * user-specified netmask.
1444 u_int32_t GetMask (u_int32_t addr)
1446 u_int32_t mask, nmask, ina;
1447 struct ifreq *ifr, *ifend, ifreq;
1449 struct ifreq ifs[MAX_IFS];
1453 if (IN_CLASSA(addr)) /* determine network mask for address class */
1454 nmask = IN_CLASSA_NET;
1455 else if (IN_CLASSB(addr))
1456 nmask = IN_CLASSB_NET;
1458 nmask = IN_CLASSC_NET;
1460 /* class D nets are disallowed by bad_ip_adrs */
1461 mask = netmask | htonl(nmask);
1463 * Scan through the system's network interfaces.
1465 ifc.ifc_len = sizeof(ifs);
1467 if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1468 if ( ! ok_error ( errno ))
1469 warn("ioctl(SIOCGIFCONF): %m(%d)", errno);
1473 ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
1474 for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1476 * Check the interface's internet address.
1478 if (ifr->ifr_addr.sa_family != AF_INET)
1480 ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
1481 if (((ntohl(ina) ^ addr) & nmask) != 0)
1484 * Check that the interface is up, and not point-to-point nor loopback.
1486 strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1487 if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1490 if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1493 * Get its netmask and OR it into our mask.
1495 if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1497 mask |= ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr;
1503 /********************************************************************
1505 * Internal routine to decode the version.modification.patch level
1508 static void decode_version (char *buf, int *version,
1509 int *modification, int *patch)
1511 *version = (int) strtoul (buf, &buf, 10);
1517 *modification = (int) strtoul (buf, &buf, 10);
1520 *patch = (int) strtoul (buf, &buf, 10);
1531 /********************************************************************
1533 * Procedure to determine if the PPP line discipline is registered.
1537 ppp_registered(void)
1543 local_fd = open(devnam, O_NONBLOCK | O_RDWR, 0);
1545 error("Failed to open %s: %m(%d)", devnam, errno);
1549 initfdflags = fcntl(local_fd, F_GETFL);
1550 if (initfdflags == -1) {
1551 error("Couldn't get device fd flags: %m(%d)", errno);
1556 initfdflags &= ~O_NONBLOCK;
1557 fcntl(local_fd, F_SETFL, initfdflags);
1559 * Read the initial line dicipline and try to put the device into the
1562 if (ioctl(local_fd, TIOCGETD, &init_disc) < 0) {
1563 error("ioctl(TIOCGETD): %m(%d)", errno);
1568 if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
1569 error("ioctl(TIOCSETD): %m(%d)", errno);
1574 if (ioctl(local_fd, TIOCSETD, &init_disc) < 0) {
1575 error("ioctl(TIOCSETD): %m(%d)", errno);
1584 /********************************************************************
1586 * ppp_available - check whether the system has any ppp interfaces
1587 * (in fact we check whether we can do an ioctl on ppp0).
1590 int ppp_available(void)
1595 int my_version, my_modification, my_patch;
1596 extern char *no_ppp_msg;
1598 * Open a socket for doing the ioctl operations.
1600 s = socket(AF_INET, SOCK_DGRAM, 0);
1604 strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
1605 ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
1607 * If the device did not exist then attempt to create one by putting the
1608 * current tty into the PPP discipline. If this works then obtain the
1609 * flags for the device again.
1612 if (ppp_registered()) {
1613 strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
1614 ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
1618 * Ensure that the hardware address is for PPP and not something else
1621 ok = ioctl (s, SIOCGIFHWADDR, (caddr_t) &ifr) >= 0;
1623 if (ok && ((ifr.ifr_hwaddr.sa_family & ~0xFF) != ARPHRD_PPP))
1628 "This system lacks kernel support for PPP. This could be because\n"
1629 "the PPP kernel module is not loaded, or because the kernel is\n"
1630 "not configured for PPP. See the README.linux file in the\n"
1631 "ppp-2.3.6 distribution.\n";
1634 * This is the PPP device. Validate the version of the driver at this
1635 * point to ensure that this program will work with the driver.
1638 char abBuffer [1024];
1640 ifr.ifr_data = abBuffer;
1641 size = ioctl (s, SIOCGPPPVER, (caddr_t) &ifr);
1643 error("Couldn't read driver version: %m");
1645 no_ppp_msg = "Sorry, couldn't verify kernel driver version\n";
1648 decode_version(abBuffer,
1650 &driver_modification,
1653 * Validate the version of the driver against the version that we used.
1655 decode_version(VERSION,
1660 /* The version numbers must match */
1661 if (driver_version != my_version)
1664 /* The modification levels must be legal */
1665 if (driver_modification < 3) {
1666 if (driver_modification >= 2) {
1667 /* we can cope with 2.2.0 and above */
1676 slprintf(route_buffer, sizeof(route_buffer),
1677 "Sorry - PPP driver version %d.%d.%d is out of date\n",
1678 driver_version, driver_modification, driver_patch);
1680 no_ppp_msg = route_buffer;
1687 /********************************************************************
1689 * Update the wtmp file with the appropriate user name and tty device.
1692 void logwtmp (const char *line, const char *name, const char *host)
1695 struct utmp ut, *utp;
1696 pid_t mypid = getpid();
1698 * Update the signon database for users.
1699 * Christoph Lameter: Copied from poeigl-1.36 Jan 3, 1996
1701 utmpname(_PATH_UTMP);
1703 while ((utp = getutent()) && (utp->ut_pid != mypid))
1706 /* Is this call really necessary? There is another one after the 'put' */
1710 memcpy(&ut, utp, sizeof(ut));
1712 /* some gettys/telnetds don't initialize utmp... */
1713 memset(&ut, 0, sizeof(ut));
1715 if (ut.ut_id[0] == 0)
1716 strlcpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
1718 strlcpy(ut.ut_user, name, sizeof(ut.ut_user));
1719 strlcpy(ut.ut_line, line, sizeof(ut.ut_line));
1723 ut.ut_type = USER_PROCESS;
1726 /* Insert the host name if one is supplied */
1728 strlcpy (ut.ut_host, host, sizeof(ut.ut_host));
1730 /* Insert the IP address of the remote system if IP is enabled */
1731 if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
1732 memcpy(&ut.ut_addr, (char *) &ipcp_hisoptions[0].hisaddr,
1733 sizeof(ut.ut_addr));
1735 /* CL: Makes sure that the logout works */
1736 if (*host == 0 && *name==0)
1742 * Update the wtmp file.
1744 wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
1746 flock(wtmp, LOCK_EX);
1748 /* we really should check for error on the write for a full disk! */
1749 write (wtmp, (char *)&ut, sizeof(ut));
1752 flock(wtmp, LOCK_UN);
1756 /********************************************************************
1757 * Code for locking/unlocking the serial device.
1758 * This code is derived from chat.c.
1762 * lock - create a lock file for the named device
1765 int lock (char *dev)
1769 lock_file = strdup(dev);
1770 if (lock_file == NULL)
1771 novm("lock file name");
1772 result = mklock (dev, (void *) 0);
1775 notice("Device %s is locked by pid %d", dev, result);
1782 error("Can't create lock file %s", lock_file);
1790 char hdb_lock_buffer[12];
1796 p = strrchr(dev, '/');
1800 l = strlen(LOCK_PREFIX) + strlen(dev) + 1;
1801 lock_file = malloc(l);
1802 if (lock_file == NULL)
1803 novm("lock file name");
1805 slprintf(lock_file, l, "%s%s", LOCK_PREFIX, dev);
1807 * Attempt to create the lock file at this point.
1810 fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644);
1814 slprintf(hdb_lock_buffer, sizeof(hdb_lock_buffer), "%010d\n", pid);
1815 write (fd, hdb_lock_buffer, 11);
1817 write(fd, &pid, sizeof (pid));
1823 * If the file exists then check to see if the pid is stale
1825 if (errno == EEXIST) {
1826 fd = open(lock_file, O_RDONLY, 0);
1828 if (errno == ENOENT) /* This is just a timing problem. */
1833 /* Read the lock file to find out who has the device locked */
1834 n = read (fd, hdb_lock_buffer, 11);
1837 error("Can't read pid from lock file %s", lock_file);
1841 /* See the process still exists. */
1844 hdb_lock_buffer[n] = '\0';
1845 sscanf (hdb_lock_buffer, " %d", &pid);
1847 pid = ((int *) hdb_lock_buffer)[0];
1849 if (pid == 0 || pid == getpid()
1850 || (kill(pid, 0) == -1 && errno == ESRCH))
1854 /* If the process does not exist then try to remove the lock */
1855 if (n == 0 && unlink (lock_file) == 0) {
1856 notice("Removed stale lock on %s (pid %d)",
1861 notice("Device %s is locked by pid %d", dev, pid);
1865 error("Can't create lock file %s: %m(%d)", lock_file, errno);
1876 /********************************************************************
1878 * unlock - remove our lockfile
1885 (void) rmlock (lock_file, (void *) 0);
1894 /********************************************************************
1896 * sifvjcomp - config tcp header compression
1899 int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid)
1901 u_int x = get_flags();
1904 if (ioctl (ppp_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) {
1905 if (! ok_error (errno))
1906 error("ioctl(PPPIOCSMAXCID): %m(%d)", errno);
1911 x = vjcomp ? x | SC_COMP_TCP : x &~ SC_COMP_TCP;
1912 x = cidcomp ? x & ~SC_NO_TCP_CCID : x | SC_NO_TCP_CCID;
1918 /********************************************************************
1920 * sifup - Config the interface up and enable IP packets to pass.
1927 memset (&ifr, '\0', sizeof (ifr));
1928 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
1929 if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
1930 if (! ok_error (errno))
1931 error("ioctl (SIOCGIFFLAGS): %m(%d)", errno);
1935 ifr.ifr_flags |= (IFF_UP | IFF_POINTOPOINT);
1936 if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
1937 if (! ok_error (errno))
1938 error("ioctl(SIOCSIFFLAGS): %m(%d)", errno);
1945 /********************************************************************
1947 * sifdown - Config the interface down and disable IP.
1956 memset (&ifr, '\0', sizeof (ifr));
1957 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
1958 if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
1959 if (! ok_error (errno))
1960 error("ioctl (SIOCGIFFLAGS): %m(%d)", errno);
1964 ifr.ifr_flags &= ~IFF_UP;
1965 ifr.ifr_flags |= IFF_POINTOPOINT;
1966 if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
1967 if (! ok_error (errno))
1968 error("ioctl(SIOCSIFFLAGS): %m(%d)", errno);
1974 /********************************************************************
1976 * sifaddr - Config the interface IP addresses and netmask.
1979 int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
1985 memset (&ifr, '\0', sizeof (ifr));
1986 memset (&rt, '\0', sizeof (rt));
1988 SET_SA_FAMILY (ifr.ifr_addr, AF_INET);
1989 SET_SA_FAMILY (ifr.ifr_dstaddr, AF_INET);
1990 SET_SA_FAMILY (ifr.ifr_netmask, AF_INET);
1992 strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
1994 * Set our IP address
1996 ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = our_adr;
1997 if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
1998 if (errno != EEXIST) {
1999 if (! ok_error (errno))
2000 error("ioctl(SIOCAIFADDR): %m(%d)", errno);
2003 warn("ioctl(SIOCAIFADDR): Address already exists");
2008 * Set the gateway address
2010 ((struct sockaddr_in *) &ifr.ifr_dstaddr)->sin_addr.s_addr = his_adr;
2011 if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
2012 if (! ok_error (errno))
2013 error("ioctl(SIOCSIFDSTADDR): %m(%d)", errno);
2018 * For recent kernels, force the netmask to 255.255.255.255.
2020 if (kernel_version >= KVERSION(2,1,16))
2022 if (net_mask != 0) {
2023 ((struct sockaddr_in *) &ifr.ifr_netmask)->sin_addr.s_addr = net_mask;
2024 if (ioctl(sock_fd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) {
2025 if (! ok_error (errno))
2026 error("ioctl(SIOCSIFNETMASK): %m(%d)", errno);
2031 * Add the device route
2033 if (kernel_version < KVERSION(2,1,16)) {
2034 SET_SA_FAMILY (rt.rt_dst, AF_INET);
2035 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2038 ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = 0L;
2039 ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr = his_adr;
2040 rt.rt_flags = RTF_UP | RTF_HOST;
2042 if (kernel_version > KVERSION(2,1,0)) {
2043 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2044 ((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = -1L;
2047 if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
2048 if (! ok_error (errno))
2049 error("ioctl(SIOCADDRT) device route: %m(%d)", errno);
2056 /********************************************************************
2058 * cifaddr - Clear the interface IP addresses, and delete routes
2059 * through the interface if possible.
2062 int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
2066 if (kernel_version < KVERSION(2,1,16)) {
2068 * Delete the route through the device
2070 memset (&rt, '\0', sizeof (rt));
2072 SET_SA_FAMILY (rt.rt_dst, AF_INET);
2073 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2076 ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = 0;
2077 ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr = his_adr;
2078 rt.rt_flags = RTF_UP | RTF_HOST;
2080 if (kernel_version > KVERSION(2,1,0)) {
2081 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2082 ((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = -1L;
2085 if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
2086 if (still_ppp() && ! ok_error (errno))
2087 error("ioctl(SIOCDELRT) device route: %m(%d)", errno);
2094 /********************************************************************
2096 * open_loopback - open the device we use for getting packets
2097 * in demand mode. Under Linux, we use a pty master/slave pair.
2100 open_ppp_loopback(void)
2103 struct termios tios;
2106 for (i = 0; i < 64; ++i) {
2107 slprintf(loop_name, sizeof(loop_name), "/dev/pty%c%x",
2108 'p' + i / 16, i % 16);
2109 master_fd = open(loop_name, O_RDWR | O_NOCTTY, 0);
2114 fatal("No free pty for loopback");
2115 SYSDEBUG(("using %s for loopback", loop_name));
2117 slave_fd = open(loop_name, O_RDWR | O_NOCTTY, 0);
2119 fatal("Couldn't open %s for loopback: %m", loop_name);
2121 set_ppp_fd(slave_fd);
2123 if (tcgetattr(ppp_fd, &tios) == 0) {
2124 tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
2125 tios.c_cflag |= CS8 | CREAD;
2126 tios.c_iflag = IGNPAR | CLOCAL;
2129 if (tcsetattr(ppp_fd, TCSAFLUSH, &tios) < 0)
2130 warn("couldn't set attributes on loopback: %m(%d)", errno);
2133 flags = fcntl(master_fd, F_GETFL);
2135 fcntl(master_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2136 warn("couldn't set master loopback to nonblock: %m(%d)", errno);
2138 flags = fcntl(ppp_fd, F_GETFL);
2140 fcntl(ppp_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2141 warn("couldn't set slave loopback to nonblock: %m(%d)", errno);
2143 if (ioctl(ppp_fd, TIOCSETD, &ppp_disc) < 0)
2144 fatal("ioctl(TIOCSETD): %m(%d)", errno);
2146 * Find out which interface we were given.
2148 if (ioctl(ppp_fd, PPPIOCGUNIT, &ifunit) < 0)
2149 fatal("ioctl(PPPIOCGUNIT): %m(%d)", errno);
2151 * Enable debug in the driver if requested.
2153 set_kdebugflag (kdebugflag);
2158 /********************************************************************
2160 * restore_loop - reattach the ppp unit to the loopback.
2162 * The kernel ppp driver automatically reattaches the ppp unit to
2163 * the loopback if the serial port is set to a line discipline other
2164 * than ppp, or if it detects a modem hangup. The former will happen
2165 * in disestablish_ppp if the latter hasn't already happened, so we
2166 * shouldn't need to do anything.
2168 * Just to be sure, set the real serial port to the normal discipline.
2174 if (ppp_fd != slave_fd) {
2175 (void) ioctl(ppp_fd, TIOCSETD, &tty_disc);
2176 set_ppp_fd(slave_fd);
2180 /********************************************************************
2182 * sifnpmode - Set the mode for handling packets for a given NP.
2186 sifnpmode(u, proto, mode)
2193 npi.protocol = proto;
2195 if (ioctl(ppp_fd, PPPIOCSNPMODE, (caddr_t) &npi) < 0) {
2196 if (! ok_error (errno)) {
2197 error("ioctl(PPPIOCSNPMODE, %d, %d): %m (%d)",
2198 proto, mode, errno);
2199 error("ppp_fd=%d slave_fd=%d\n", ppp_fd, slave_fd);
2207 /********************************************************************
2209 * sipxfaddr - Config the interface IPX networknumber
2212 int sipxfaddr (int unit, unsigned long int network, unsigned char * node )
2219 struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2221 skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2223 if (! ok_error (errno))
2224 dbglog("socket(AF_IPX): %m (%d)", errno);
2228 memset (&ifr, '\0', sizeof (ifr));
2229 strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2231 memcpy (sipx->sipx_node, node, IPX_NODE_LEN);
2232 sipx->sipx_family = AF_IPX;
2233 sipx->sipx_port = 0;
2234 sipx->sipx_network = htonl (network);
2235 sipx->sipx_type = IPX_FRAME_ETHERII;
2236 sipx->sipx_action = IPX_CRTITF;
2238 * Set the IPX device
2240 if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2242 if (errno != EEXIST) {
2243 if (! ok_error (errno))
2244 dbglog("ioctl(SIOCAIFADDR, CRTITF): %m (%d)", errno);
2247 warn("ioctl(SIOCAIFADDR, CRTITF): Address already exists");
2256 /********************************************************************
2258 * cipxfaddr - Clear the information for the IPX network. The IPX routes
2259 * are removed and the device is no longer able to pass IPX
2263 int cipxfaddr (int unit)
2270 struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2272 skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2274 if (! ok_error (errno))
2275 dbglog("socket(AF_IPX): %m (%d)", errno);
2279 memset (&ifr, '\0', sizeof (ifr));
2280 strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2282 sipx->sipx_type = IPX_FRAME_ETHERII;
2283 sipx->sipx_action = IPX_DLTITF;
2284 sipx->sipx_family = AF_IPX;
2286 * Set the IPX device
2288 if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2289 if (! ok_error (errno))
2290 info("ioctl(SIOCAIFADDR, IPX_DLTITF): %m (%d)", errno);
2300 * daemon - Detach us from controlling terminal session.
2303 daemon(nochdir, noclose)
2304 int nochdir, noclose;
2308 if ((pid = fork()) < 0)
2311 exit(0); /* parent dies */
2316 fclose(stdin); /* don't need stdin, stdout, stderr */
2324 * Use the hostname as part of the random number seed.
2333 for (p = hostname; *p != 0; ++p)
2338 /********************************************************************
2340 * sys_check_options - check the options that the user specified
2344 sys_check_options(void)
2347 struct stat stat_buf;
2349 * Disable the IPX protocol if the support is not present in the kernel.
2350 * If we disable it then ensure that IP support is enabled.
2352 while (ipxcp_protent.enabled_flag) {
2353 if (path_to_procfs()) {
2354 strlcat (route_buffer, "/net/ipx_interface", sizeof(route_buffer));
2355 if (lstat (route_buffer, &stat_buf) >= 0)
2358 error("IPX support is not present in the kernel\n");
2359 ipxcp_protent.enabled_flag = 0;
2360 ipcp_protent.enabled_flag = 1;
2364 if (demand && driver_is_old) {
2365 option_error("demand dialling is not supported by kernel driver "
2366 "version %d.%d.%d", driver_version, driver_modification,