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>
29 #include <sys/sysmacros.h>
46 /* This is in netdevice.h. However, this compile will fail miserably if
47 you attempt to include netdevice.h because it has so many references
48 to __memcpy functions which it should not attempt to do. So, since I
49 really don't use it, but it must be defined, define it now. */
52 #define MAX_ADDR_LEN 7
56 #include <asm/types.h> /* glibc 2 conflicts with linux/types.h */
58 #include <net/if_arp.h>
59 #include <net/route.h>
60 #include <netinet/if_ether.h>
62 #include <linux/types.h>
64 #include <linux/if_arp.h>
65 #include <linux/route.h>
66 #include <linux/if_ether.h>
68 #include <netinet/in.h>
69 #include <arpa/inet.h>
71 #include <linux/ppp_defs.h>
72 #include <linux/if_ppp.h>
80 #if __GLIBC__ >= 2 && \
81 !(defined(__powerpc__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
82 #include <netipx/ipx.h>
84 #include <linux/ipx.h>
86 #endif /* IPX_CHANGE */
90 #include <linux/filter.h>
91 #endif /* PPP_FILTER */
94 #include <sys/locks.h>
100 * This is in linux/include/net/ipv6.h.
104 struct in6_addr ifr6_addr;
105 __u32 ifr6_prefixlen;
106 unsigned int ifr6_ifindex;
110 #define IN6_LLADDR_FROM_EUI64(sin6, eui64) do { \
111 memset(&sin6.s6_addr, 0, sizeof(struct in6_addr)); \
112 sin6.s6_addr16[0] = htons(0xfe80); \
113 eui64_copy(eui64, sin6.s6_addr32[2]); \
118 /* We can get an EIO error on an ioctl if the modem has hung up */
119 #define ok_error(num) ((num)==EIO)
121 static int tty_disc = N_TTY; /* The TTY discipline */
122 static int ppp_disc = N_PPP; /* The PPP discpline */
123 static int initfdflags = -1; /* Initial file descriptor flags for fd */
124 static int ppp_fd = -1; /* fd which is set to PPP discipline */
125 static int sock_fd = -1; /* socket for doing interface ioctls */
126 static int slave_fd = -1;
127 static int master_fd = -1;
129 static int sock6_fd = -1;
131 static int ppp_dev_fd = -1; /* fd for /dev/ppp (new style driver) */
132 static int chindex; /* channel index (new style driver) */
134 static fd_set in_fds; /* set of fds that wait_input waits for */
135 static int max_in_fd; /* highest fd set in in_fds */
137 static int has_proxy_arp = 0;
138 static int driver_version = 0;
139 static int driver_modification = 0;
140 static int driver_patch = 0;
141 static int driver_is_old = 0;
142 static int restore_term = 0; /* 1 => we've munged the terminal */
143 static struct termios inittermios; /* Initial TTY termios */
145 int new_style_driver = 0;
147 static char loop_name[20];
148 static unsigned char inbuf[512]; /* buffer for chars read from loopback */
150 static int if_is_up; /* Interface has been marked up */
151 static u_int32_t default_route_gateway; /* Gateway for default route added */
152 static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
153 static char proxy_arp_dev[16]; /* Device for proxy arp entry */
154 static u_int32_t our_old_addr; /* for detecting address changes */
155 static int dynaddr_set; /* 1 if ip_dynaddr set */
156 static int looped; /* 1 if using loop */
157 static int link_mtu; /* mtu for the link (not bundle) */
159 static struct utsname utsname; /* for the kernel version */
160 static int kernel_version;
161 #define KVERSION(j,n,p) ((j)*1000000 + (n)*1000 + (p))
165 #define FLAGS_GOOD (IFF_UP | IFF_BROADCAST)
166 #define FLAGS_MASK (IFF_UP | IFF_BROADCAST | \
167 IFF_POINTOPOINT | IFF_LOOPBACK | IFF_NOARP)
169 #define SIN_ADDR(x) (((struct sockaddr_in *) (&(x)))->sin_addr.s_addr)
171 /* Prototypes for procedures local to this file. */
172 static int get_flags (int fd);
173 static void set_flags (int fd, int flags);
174 static int translate_speed (int bps);
175 static int baud_rate_of (int speed);
176 static void close_route_table (void);
177 static int open_route_table (void);
178 static int read_route_table (struct rtentry *rt);
179 static int defaultroute_exists (struct rtentry *rt);
180 static int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr,
181 char *name, int namelen);
182 static void decode_version (char *buf, int *version, int *mod, int *patch);
183 static int set_kdebugflag(int level);
184 static int ppp_registered(void);
185 static int make_ppp_unit(void);
186 static void restore_loop(void); /* Transfer ppp unit back to loopback */
188 extern u_char inpacket_buf[]; /* borrowed from main.c */
191 * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
195 #define SET_SA_FAMILY(addr, family) \
196 memset ((char *) &(addr), '\0', sizeof(addr)); \
197 addr.sa_family = (family);
200 * Determine if the PPP connection should still be present.
205 /* new_fd is the fd of a tty */
206 static void set_ppp_fd (int new_fd)
208 SYSDEBUG ((LOG_DEBUG, "setting ppp_fd to %d\n", new_fd));
210 if (!new_style_driver)
214 static int still_ppp(void)
216 if (new_style_driver)
217 return !hungup && ppp_fd >= 0;
218 if (!hungup || ppp_fd == slave_fd)
221 set_ppp_fd(slave_fd);
227 /********************************************************************
229 * Functions to read and set the flags value in the device driver
232 static int get_flags (int fd)
236 if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &flags) < 0) {
237 if ( ok_error (errno) )
240 fatal("ioctl(PPPIOCGFLAGS): %m");
243 SYSDEBUG ((LOG_DEBUG, "get flags = %x\n", flags));
247 /********************************************************************/
249 static void set_flags (int fd, int flags)
251 SYSDEBUG ((LOG_DEBUG, "set flags = %x\n", flags));
253 if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &flags) < 0) {
254 if (! ok_error (errno) )
255 fatal("ioctl(PPPIOCSFLAGS, %x): %m", flags, errno);
259 /********************************************************************
261 * sys_init - System-dependent initialization.
268 if (new_style_driver) {
269 ppp_dev_fd = open("/dev/ppp", O_RDWR);
271 fatal("Couldn't open /dev/ppp: %m");
272 flags = fcntl(ppp_dev_fd, F_GETFL);
274 || fcntl(ppp_dev_fd, F_SETFL, flags | O_NONBLOCK) == -1)
275 warn("Couldn't set /dev/ppp to nonblock: %m");
278 /* Get an internet socket for doing socket ioctls. */
279 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
281 fatal("Couldn't create IP socket: %m(%d)", errno);
284 sock6_fd = socket(AF_INET6, SOCK_DGRAM, 0);
286 sock6_fd = -errno; /* save errno for later */
293 /********************************************************************
295 * sys_cleanup - restore any system state we modified before exiting:
296 * mark the interface down, delete default route and/or proxy arp entry.
297 * This shouldn't call die() because it's called from die().
300 void sys_cleanup(void)
303 * Take down the device
310 * Delete any routes through the device.
312 if (default_route_gateway != 0)
313 cifdefaultroute(0, 0, default_route_gateway);
316 cifproxyarp(0, proxy_arp_addr);
319 /********************************************************************
321 * sys_close - Clean up in a child process before execing.
326 if (new_style_driver)
337 /********************************************************************
339 * set_kdebugflag - Define the debugging level for the kernel
342 static int set_kdebugflag (int requested_level)
344 if (new_style_driver && ifunit < 0)
346 if (ioctl(ppp_dev_fd, PPPIOCSDEBUG, &requested_level) < 0) {
347 if ( ! ok_error (errno) )
348 error("ioctl(PPPIOCSDEBUG): %m");
351 SYSDEBUG ((LOG_INFO, "set kernel debugging level to %d",
359 /********************************************************************
361 * tty_establish_ppp - Turn the serial port into a ppp interface.
364 int tty_establish_ppp (int tty_fd)
368 * Ensure that the tty device is in exclusive mode.
370 if (ioctl(tty_fd, TIOCEXCL, 0) < 0) {
371 if ( ! ok_error ( errno ))
372 warn("Couldn't make tty exclusive: %m");
375 * Set the current tty to the PPP discpline
379 #define N_SYNC_PPP 14
381 ppp_disc = (new_style_driver && sync_serial)? N_SYNC_PPP: N_PPP;
382 if (ioctl(tty_fd, TIOCSETD, &ppp_disc) < 0) {
383 if ( ! ok_error (errno) ) {
384 error("Couldn't set tty to PPP discipline: %m");
389 ret_fd = generic_establish_ppp(tty_fd);
390 #define SC_RCVB (SC_RCV_B7_0 | SC_RCV_B7_1 | SC_RCV_EVNP | SC_RCV_ODDP)
391 #define SC_LOGB (SC_DEBUG | SC_LOG_INPKT | SC_LOG_OUTPKT | SC_LOG_RAWIN \
394 set_flags(ppp_fd, ((get_flags(ppp_fd) & ~(SC_RCVB | SC_LOGB))
395 | ((kdebugflag * SC_DEBUG) & SC_LOGB)));
402 /********************************************************************
404 * generic_establish_ppp - Turn the fd into a ppp interface.
406 int generic_establish_ppp (int fd)
410 * Demand mode - prime the old ppp device to relinquish the unit.
412 if (!new_style_driver && looped
413 && ioctl(slave_fd, PPPIOCXFERUNIT, 0) < 0) {
414 error("ioctl(transfer ppp unit): %m");
419 if (new_style_driver) {
420 /* Open another instance of /dev/ppp and connect the channel to it */
423 if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
424 error("Couldn't get channel number: %m");
427 dbglog("using channel %d", chindex);
428 fd = open("/dev/ppp", O_RDWR);
430 error("Couldn't reopen /dev/ppp: %m");
433 if (ioctl(fd, PPPIOCATTCHAN, &chindex) < 0) {
434 error("Couldn't attach to channel %d: %m", chindex);
437 flags = fcntl(fd, F_GETFL);
438 if (flags == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
439 warn("Couldn't set /dev/ppp (channel) to nonblock: %m");
444 if (!looped && !multilink) {
446 * Create a new PPP unit.
448 if (make_ppp_unit() < 0)
453 set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) & ~SC_LOOP_TRAFFIC);
457 if (ioctl(fd, PPPIOCCONNECT, &ifunit) < 0) {
458 error("Couldn't attach to PPP unit %d: %m", ifunit);
466 * Old-style driver: find out which interface we were given.
469 if (ioctl(fd, PPPIOCGUNIT, &x) < 0) {
470 if (ok_error (errno))
472 fatal("ioctl(PPPIOCGUNIT): %m(%d)", errno);
474 /* Check that we got the same unit again. */
475 if (looped && x != ifunit)
476 fatal("transfer_ppp failed: wanted unit %d, got %d", ifunit, x);
480 * Fetch the initial file flags and reset blocking mode on the file.
482 initfdflags = fcntl(fd, F_GETFL);
483 if (initfdflags == -1 ||
484 fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
485 if ( ! ok_error (errno))
486 warn("Couldn't set device to non-blocking mode: %m");
494 * Enable debug in the driver if requested.
497 set_kdebugflag (kdebugflag);
499 SYSDEBUG ((LOG_NOTICE, "Using version %d.%d.%d of PPP driver",
500 driver_version, driver_modification, driver_patch));
507 if (ioctl(fd, TIOCSETD, &tty_disc) < 0 && !ok_error(errno))
508 warn("Couldn't reset tty to normal line discipline: %m");
514 /********************************************************************
516 * tty_disestablish_ppp - Restore the serial port to normal operation.
517 * This shouldn't call die() because it's called from die().
520 void tty_disestablish_ppp(int tty_fd)
522 generic_disestablish_ppp(tty_fd);
526 * Flush the tty output buffer so that the TIOCSETD doesn't hang.
528 if (tcflush(tty_fd, TCIOFLUSH) < 0)
529 warn("tcflush failed: %m");
531 * Restore the previous line discipline
533 if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
534 if ( ! ok_error (errno))
535 error("ioctl(TIOCSETD, N_TTY): %m");
538 if (ioctl(tty_fd, TIOCNXCL, 0) < 0) {
539 if ( ! ok_error (errno))
540 warn("ioctl(TIOCNXCL): %m(%d)", errno);
543 /* Reset non-blocking mode on fd. */
544 if (initfdflags != -1 && fcntl(tty_fd, F_SETFL, initfdflags) < 0) {
545 if ( ! ok_error (errno))
546 warn("Couldn't restore device fd flags: %m");
552 /********************************************************************
554 * generic_disestablish_ppp - Restore device components to normal
555 * operation, and reconnect the ppp unit to the loopback if in demand
556 * mode. This shouldn't call die() because it's called from die().
558 void generic_disestablish_ppp(int dev_fd){
559 /* Restore loop if needed */
563 /* Finally detach the device */
566 if (new_style_driver) {
569 if (!looped && ifunit >= 0 && ioctl(ppp_dev_fd, PPPIOCDETACH) < 0)
570 error("Couldn't release PPP unit: %m");
572 remove_fd(ppp_dev_fd);
578 * make_ppp_unit - make a new ppp unit for ppp_dev_fd.
579 * Assumes new_style_driver.
581 static int make_ppp_unit()
586 if (strchr(req_name, '_')) {
587 retval = sscanf(req_name, "%d_%d_%d", num, num+1, num+2);
588 req_unit = OFFSET2*OFFSET1*num[0]+OFFSET1*num[1]+num[2];
591 req_unit = atoi(req_name);
594 x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
595 if (x < 0 && req_unit >= 0 && errno == EEXIST) {
596 warn("Couldn't allocate PPP unit %d as it is already in use");
598 x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
601 error("Couldn't create new ppp unit: %m");
606 * cfg_bundle - configure the existing bundle.
607 * Used in demand mode.
609 void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
613 if (!new_style_driver)
616 /* set the mrru, mtu and flags */
617 if (ioctl(ppp_dev_fd, PPPIOCSMRRU, &mrru) < 0)
618 error("Couldn't set MRRU: %m");
619 flags = get_flags(ppp_dev_fd);
620 flags &= ~(SC_MP_SHORTSEQ | SC_MP_XSHORTSEQ);
621 flags |= (rssn? SC_MP_SHORTSEQ: 0) | (tssn? SC_MP_XSHORTSEQ: 0)
622 | (mrru? SC_MULTILINK: 0);
624 set_flags(ppp_dev_fd, flags);
626 /* connect up the channel */
627 if (ioctl(ppp_fd, PPPIOCCONNECT, &ifunit) < 0)
628 fatal("Couldn't attach to PPP unit %d: %m", ifunit);
633 * make_new_bundle - create a new PPP unit (i.e. a bundle)
634 * and connect our channel to it. This should only get called
635 * if `multilink' was set at the time establish_ppp was called.
636 * In demand mode this uses our existing bundle instead of making
639 void make_new_bundle(int mrru, int mtru, int rssn, int tssn)
641 if (!new_style_driver)
644 /* make us a ppp unit */
645 if (make_ppp_unit() < 0)
648 /* set the mrru and flags */
649 cfg_bundle(mrru, mtru, rssn, tssn);
653 * bundle_attach - attach our link to a given PPP unit.
654 * We assume the unit is controlled by another pppd.
656 int bundle_attach(int ifnum)
658 if (!new_style_driver)
661 if (ioctl(ppp_dev_fd, PPPIOCATTACH, &ifnum) < 0) {
663 return 0; /* doesn't still exist */
664 fatal("Couldn't attach to interface unit %d: %m\n", ifnum);
666 if (ioctl(ppp_fd, PPPIOCCONNECT, &ifnum) < 0)
667 fatal("Couldn't connect to interface unit %d: %m", ifnum);
668 set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) | SC_MULTILINK);
674 /********************************************************************
676 * clean_check - Fetch the flags for the device and generate
677 * appropriate error messages.
679 void clean_check(void)
685 if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) == 0) {
687 switch (~x & (SC_RCV_B7_0|SC_RCV_B7_1|SC_RCV_EVNP|SC_RCV_ODDP)) {
689 s = "all had bit 7 set to 1";
693 s = "all had bit 7 set to 0";
697 s = "all had odd parity";
701 s = "all had even parity";
706 warn("Receive serial link is not 8-bit clean:");
707 warn("Problem: %s", s);
715 * List of valid speeds.
719 int speed_int, speed_val;
802 /********************************************************************
804 * Translate from bits/second to a speed_t.
807 static int translate_speed (int bps)
809 struct speed *speedp;
812 for (speedp = speeds; speedp->speed_int; speedp++) {
813 if (bps == speedp->speed_int)
814 return speedp->speed_val;
816 warn("speed %d not supported", bps);
821 /********************************************************************
823 * Translate from a speed_t to bits/second.
826 static int baud_rate_of (int speed)
828 struct speed *speedp;
831 for (speedp = speeds; speedp->speed_int; speedp++) {
832 if (speed == speedp->speed_val)
833 return speedp->speed_int;
841 /********************************************************************
843 * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
844 * at the requested speed, etc. If `local' is true, set CLOCAL
845 * regardless of whether the modem option was specified.
848 void set_up_tty(int tty_fd, int local)
854 if (tcgetattr(tty_fd, &tios) < 0) {
855 if (!ok_error(errno))
856 fatal("tcgetattr: %m(%d)", errno);
863 tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
864 tios.c_cflag |= CS8 | CREAD | HUPCL;
866 tios.c_iflag = IGNBRK | IGNPAR;
870 tios.c_cc[VTIME] = 0;
873 tios.c_cflag ^= (CLOCAL | HUPCL);
877 tios.c_cflag |= CRTSCTS;
881 tios.c_iflag |= IXON | IXOFF;
882 tios.c_cc[VSTOP] = 0x13; /* DC3 = XOFF = ^S */
883 tios.c_cc[VSTART] = 0x11; /* DC1 = XON = ^Q */
887 tios.c_cflag &= ~CRTSCTS;
894 speed = translate_speed(inspeed);
896 cfsetospeed (&tios, speed);
897 cfsetispeed (&tios, speed);
900 * We can't proceed if the serial port speed is B0,
901 * since that implies that the serial port is disabled.
904 speed = cfgetospeed(&tios);
906 fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
909 if (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0)
910 if (!ok_error(errno))
911 fatal("tcsetattr: %m");
913 baud_rate = baud_rate_of(speed);
917 /********************************************************************
919 * setdtr - control the DTR line on the serial port.
920 * This is called from die(), so it shouldn't call die().
923 void setdtr (int tty_fd, int on)
925 int modembits = TIOCM_DTR;
927 ioctl(tty_fd, (on ? TIOCMBIS : TIOCMBIC), &modembits);
930 /********************************************************************
932 * restore_tty - restore the terminal to the saved settings.
935 void restore_tty (int tty_fd)
940 * Turn off echoing, because otherwise we can get into
941 * a loop with the tty and the modem echoing to each other.
942 * We presume we are the sole user of this tty device, so
943 * when we close it, it will revert to its defaults anyway.
946 inittermios.c_lflag &= ~(ECHO | ECHONL);
948 if (tcsetattr(tty_fd, TCSAFLUSH, &inittermios) < 0) {
949 if (! ok_error (errno))
950 warn("tcsetattr: %m");
956 /********************************************************************
958 * output - Output PPP packet.
961 void output (int unit, unsigned char *p, int len)
967 dbglog("sent %P", p, len);
969 if (len < PPP_HDRLEN)
971 if (new_style_driver) {
974 proto = (p[0] << 8) + p[1];
975 if (ifunit >= 0 && !(proto >= 0xc000 || proto == PPP_CCPFRAG))
978 if (write(fd, p, len) < 0) {
979 if (errno == EWOULDBLOCK || errno == ENOBUFS
980 || errno == ENXIO || errno == EIO || errno == EINTR)
981 warn("write: warning: %m (%d)", errno);
983 error("write: %m (%d)", errno);
987 /********************************************************************
989 * wait_input - wait until there is data available,
990 * for the length of time specified by *timo (indefinite
994 void wait_input(struct timeval *timo)
1003 if (timo && (timo->tv_usec < 0))
1006 n = select(max_in_fd + 1, &ready, NULL, &exc, timo);
1007 if (n < 0 && errno != EINTR)
1008 fatal("select: %m(%d)", errno);
1012 * add_fd - add an fd to the set that wait_input waits for.
1016 FD_SET(fd, &in_fds);
1022 * remove_fd - remove an fd from the set that wait_input waits for.
1024 void remove_fd(int fd)
1026 FD_CLR(fd, &in_fds);
1030 /********************************************************************
1032 * read_packet - get a PPP packet from the serial device.
1035 int read_packet (unsigned char *buf)
1039 len = PPP_MRU + PPP_HDRLEN;
1040 if (new_style_driver) {
1041 *buf++ = PPP_ALLSTATIONS;
1047 if (!(nr = read(ppp_fd, buf, len)))
1049 if (nr < 0 && errno != EWOULDBLOCK && errno != EIO && errno != EINTR)
1051 if (nr < 0 && errno == ENXIO)
1054 if (nr < 0 && new_style_driver && ifunit >= 0) {
1055 /* N.B. we read ppp_fd first since LCP packets come in there. */
1056 // To avoid nonppp ctl traffic
1057 if (!(nr = read(ppp_dev_fd, buf, len)))
1059 if (nr < 0 && errno != EWOULDBLOCK && errno != EIO && errno != EINTR)
1060 error("read /dev/ppp: %m");
1061 if (nr < 0 && errno == ENXIO)
1064 return (new_style_driver && nr > 0)? nr+2: nr;
1067 /********************************************************************
1069 * get_loop_output - get outgoing packets from the ppp device,
1070 * and detect when we want to bring the real link up.
1071 * Return value is 1 if we need to bring up the link, 0 otherwise.
1074 get_loop_output(void)
1079 if (new_style_driver) {
1080 while ((n = read_packet(inpacket_buf)) > 0)
1081 if (loop_frame(inpacket_buf, n))
1086 while ((n = read(master_fd, inbuf, sizeof(inbuf))) > 0)
1087 if (loop_chars(inbuf, n))
1091 fatal("eof on loopback");
1093 if (errno != EWOULDBLOCK)
1094 fatal("read from loopback: %m(%d)", errno);
1100 * netif_set_mtu - set the MTU on the PPP network interface.
1103 netif_set_mtu(int unit, int mtu)
1107 printf("LCP: Set ifc mtu %d\n", mtu);
1108 SYSDEBUG ((LOG_DEBUG, "netif_set_mtu: mtu = %d\n", mtu));
1110 memset (&ifr, '\0', sizeof (ifr));
1111 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
1114 if (ifunit >= 0 && ioctl(sock_fd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
1115 fatal("ioctl(SIOCSIFMTU): %m");
1120 /********************************************************************
1122 * tty_send_config - configure the transmit characteristics of
1123 * the ppp interface.
1126 void tty_send_config (int mtu,u_int32_t asyncmap,int pcomp,int accomp)
1131 * Set the asyncmap and other parameters for the ppp device
1136 SYSDEBUG ((LOG_DEBUG, "send_config: asyncmap = %lx\n", asyncmap));
1137 if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0) {
1138 if (!ok_error(errno))
1139 fatal("ioctl(PPPIOCSASYNCMAP): %m(%d)", errno);
1143 x = get_flags(ppp_fd);
1144 x = pcomp ? x | SC_COMP_PROT : x & ~SC_COMP_PROT;
1145 x = accomp ? x | SC_COMP_AC : x & ~SC_COMP_AC;
1146 x = sync_serial ? x | SC_SYNC : x & ~SC_SYNC;
1147 set_flags(ppp_fd, x);
1150 /********************************************************************
1152 * tty_set_xaccm - set the extended transmit ACCM for the interface.
1155 void tty_set_xaccm (ext_accm accm)
1157 SYSDEBUG ((LOG_DEBUG, "set_xaccm: %08lx %08lx %08lx %08lx\n",
1158 accm[0], accm[1], accm[2], accm[3]));
1162 if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY) {
1163 if ( ! ok_error (errno))
1164 warn("ioctl(set extended ACCM): %m(%d)", errno);
1168 /********************************************************************
1170 * tty_recv_config - configure the receive-side characteristics of
1171 * the ppp interface.
1174 void tty_recv_config (int mru,u_int32_t asyncmap,int pcomp,int accomp)
1176 SYSDEBUG ((LOG_DEBUG, "recv_config: mru = %d\n", mru));
1178 * If we were called because the link has gone down then there is nothing
1179 * which may be done. Just return without incident.
1184 * Set the receiver parameters
1186 if (ioctl(ppp_fd, PPPIOCSMRU, (caddr_t) &mru) < 0) {
1187 if ( ! ok_error (errno))
1188 error("ioctl(PPPIOCSMRU): %m(%d)", errno);
1190 if (new_style_driver && ifunit >= 0
1191 && ioctl(ppp_dev_fd, PPPIOCSMRU, (caddr_t) &mru) < 0)
1192 error("Couldn't set MRU in generic PPP layer: %m");
1194 SYSDEBUG ((LOG_DEBUG, "recv_config: asyncmap = %lx\n", asyncmap));
1195 if (ioctl(ppp_fd, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap) < 0) {
1196 if (!ok_error(errno))
1197 error("ioctl(PPPIOCSRASYNCMAP): %m(%d)", errno);
1201 /********************************************************************
1203 * ccp_test - ask kernel whether a given compression method
1204 * is acceptable for use.
1207 int ccp_test (int unit, u_char *opt_ptr, int opt_len, int for_transmit)
1209 struct ppp_option_data data;
1211 memset (&data, '\0', sizeof (data));
1213 data.length = opt_len;
1214 data.transmit = for_transmit;
1216 if (ioctl(ppp_dev_fd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0)
1219 return (errno == ENOBUFS)? 0: -1;
1222 /********************************************************************
1224 * ccp_flags_set - inform kernel about the current state of CCP.
1227 void ccp_flags_set (int unit, int isopen, int isup)
1230 int x = get_flags(ppp_dev_fd);
1231 x = isopen? x | SC_CCP_OPEN : x &~ SC_CCP_OPEN;
1232 x = isup? x | SC_CCP_UP : x &~ SC_CCP_UP;
1233 set_flags (ppp_dev_fd, x);
1241 * set_filters - set the active and pass filters in the kernel driver.
1243 int set_filters(struct bpf_program *pass, struct bpf_program *active)
1245 struct sock_fprog fp;
1247 fp.len = pass->bf_len;
1248 fp.filter = (struct sock_filter *) pass->bf_insns;
1249 if (ioctl(ppp_dev_fd, PPPIOCSPASS, &fp) < 0) {
1250 if (errno == ENOTTY)
1251 warn("kernel does not support PPP filtering");
1253 error("Couldn't set pass-filter in kernel: %m");
1256 fp.len = active->bf_len;
1257 fp.filter = (struct sock_filter *) active->bf_insns;
1258 if (ioctl(ppp_dev_fd, PPPIOCSACTIVE, &fp) < 0) {
1259 error("Couldn't set active-filter in kernel: %m");
1264 #endif /* PPP_FILTER */
1266 /********************************************************************
1268 * get_idle_time - return how long the link has been idle.
1271 get_idle_time(u, ip)
1273 struct ppp_idle *ip;
1275 return ioctl(ppp_dev_fd, PPPIOCGIDLE, ip) >= 0;
1278 /********************************************************************
1280 * get_ppp_stats - return statistics for the link.
1283 get_ppp_stats(u, stats)
1285 struct pppd_stats *stats;
1287 struct ifpppstatsreq req;
1289 memset (&req, 0, sizeof (req));
1291 req.stats_ptr = (caddr_t) &req.stats;
1292 strlcpy(req.ifr__name, ifname, sizeof(req.ifr__name));
1293 if (ioctl(sock_fd, SIOCGPPPSTATS, &req) < 0) {
1294 error("Couldn't get PPP statistics: %m");
1297 stats->bytes_in = req.stats.p.ppp_ibytes;
1298 stats->bytes_out = req.stats.p.ppp_obytes;
1304 /********************************************************************
1306 * ccp_fatal_error - returns 1 if decompression was disabled as a
1307 * result of an error detected after decompression of a packet,
1308 * 0 otherwise. This is necessary because of patent nonsense.
1311 int ccp_fatal_error (int unit)
1313 int x = get_flags(ppp_dev_fd);
1315 return x & SC_DC_FERROR;
1320 /********************************************************************
1322 * path_to_procfs - find the path to the proc file system mount point
1324 static char proc_path[MAXPATHLEN];
1325 static int proc_path_len;
1327 static char *path_to_procfs(const char *tail)
1329 struct mntent *mntent;
1332 if (proc_path_len == 0) {
1333 /* Default the mount location of /proc */
1334 strlcpy (proc_path, "/proc", sizeof(proc_path));
1336 fp = fopen(MOUNTED, "r");
1338 while ((mntent = getmntent(fp)) != NULL) {
1339 if (strcmp(mntent->mnt_type, MNTTYPE_IGNORE) == 0)
1341 if (strcmp(mntent->mnt_type, "proc") == 0) {
1342 strlcpy(proc_path, mntent->mnt_dir, sizeof(proc_path));
1343 proc_path_len = strlen(proc_path);
1351 strlcpy(proc_path + proc_path_len, tail,
1352 sizeof(proc_path) - proc_path_len);
1357 * /proc/net/route parsing stuff.
1359 #define ROUTE_MAX_COLS 12
1360 FILE *route_fd = (FILE *) 0;
1361 static char route_buffer[512];
1362 static int route_dev_col, route_dest_col, route_gw_col;
1363 static int route_flags_col, route_mask_col;
1364 static int route_num_cols;
1366 static int open_route_table (void);
1367 static void close_route_table (void);
1368 static int read_route_table (struct rtentry *rt);
1370 /********************************************************************
1372 * close_route_table - close the interface to the route table
1375 static void close_route_table (void)
1377 if (route_fd != (FILE *) 0) {
1379 route_fd = (FILE *) 0;
1383 /********************************************************************
1385 * open_route_table - open the interface to the route table
1387 static char route_delims[] = " \t\n";
1389 static int open_route_table (void)
1393 close_route_table();
1395 path = path_to_procfs("/net/route");
1396 route_fd = fopen (path, "r");
1397 if (route_fd == NULL) {
1398 error("can't open routing table %s: %m", path);
1402 route_dev_col = 0; /* default to usual columns */
1405 route_flags_col = 3;
1409 /* parse header line */
1410 if (fgets(route_buffer, sizeof(route_buffer), route_fd) != 0) {
1411 char *p = route_buffer, *q;
1413 for (col = 0; col < ROUTE_MAX_COLS; ++col) {
1415 if ((q = strtok(p, route_delims)) == 0)
1417 if (strcasecmp(q, "iface") == 0)
1418 route_dev_col = col;
1419 else if (strcasecmp(q, "destination") == 0)
1420 route_dest_col = col;
1421 else if (strcasecmp(q, "gateway") == 0)
1423 else if (strcasecmp(q, "flags") == 0)
1424 route_flags_col = col;
1425 else if (strcasecmp(q, "mask") == 0)
1426 route_mask_col = col;
1429 if (used && col >= route_num_cols)
1430 route_num_cols = col + 1;
1438 /********************************************************************
1440 * read_route_table - read the next entry from the route table
1443 static int read_route_table(struct rtentry *rt)
1445 char *cols[ROUTE_MAX_COLS], *p;
1448 memset (rt, '\0', sizeof (struct rtentry));
1450 if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0)
1454 for (col = 0; col < route_num_cols; ++col) {
1455 cols[col] = strtok(p, route_delims);
1456 if (cols[col] == NULL)
1457 return 0; /* didn't get enough columns */
1461 SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
1462 SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
1463 SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
1465 rt->rt_flags = (short) strtoul(cols[route_flags_col], NULL, 16);
1466 rt->rt_dev = cols[route_dev_col];
1471 /********************************************************************
1473 * defaultroute_exists - determine if there is a default route
1476 static int defaultroute_exists (struct rtentry *rt)
1480 if (!open_route_table())
1483 while (read_route_table(rt) != 0) {
1484 if ((rt->rt_flags & RTF_UP) == 0)
1487 if (kernel_version > KVERSION(2,1,0) && SIN_ADDR(rt->rt_genmask) != 0)
1489 if (SIN_ADDR(rt->rt_dst) == 0L) {
1495 close_route_table();
1500 * have_route_to - determine if the system has any route to
1501 * a given IP address. `addr' is in network byte order.
1502 * Return value is 1 if yes, 0 if no, -1 if don't know.
1503 * For demand mode to work properly, we have to ignore routes
1504 * through our own interface.
1506 int have_route_to(u_int32_t addr)
1511 if (!open_route_table())
1512 return -1; /* don't know */
1514 while (read_route_table(&rt)) {
1515 if ((rt.rt_flags & RTF_UP) == 0 || strcmp(rt.rt_dev, ifname) == 0)
1517 if ((addr & SIN_ADDR(rt.rt_genmask)) == SIN_ADDR(rt.rt_dst)) {
1523 close_route_table();
1527 /********************************************************************
1529 * sifdefaultroute - assign a default route through the address given.
1532 int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1536 if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
1537 u_int32_t old_gateway = SIN_ADDR(rt.rt_gateway);
1539 if (old_gateway != gateway)
1540 error("not replacing existing default route to %s [%I]",
1541 rt.rt_dev, old_gateway);
1545 memset (&rt, '\0', sizeof (rt));
1546 SET_SA_FAMILY (rt.rt_dst, AF_INET);
1547 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1549 if (kernel_version > KVERSION(2,1,0)) {
1550 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1551 SIN_ADDR(rt.rt_genmask) = 0L;
1554 SIN_ADDR(rt.rt_gateway) = gateway;
1556 rt.rt_flags = RTF_UP | RTF_GATEWAY;
1557 if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
1558 if ( ! ok_error ( errno ))
1559 error("default route ioctl(SIOCADDRT): %m(%d)", errno);
1563 default_route_gateway = gateway;
1567 /********************************************************************
1569 * cifdefaultroute - delete a default route through the address given.
1572 int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1576 default_route_gateway = 0;
1578 memset (&rt, '\0', sizeof (rt));
1579 SET_SA_FAMILY (rt.rt_dst, AF_INET);
1580 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1582 if (kernel_version > KVERSION(2,1,0)) {
1583 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1584 SIN_ADDR(rt.rt_genmask) = 0L;
1587 SIN_ADDR(rt.rt_gateway) = gateway;
1589 rt.rt_flags = RTF_UP | RTF_GATEWAY;
1590 if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
1592 if ( ! ok_error ( errno ))
1593 error("default route ioctl(SIOCDELRT): %m (%d)", errno);
1601 /********************************************************************
1603 * sifproxyarp - Make a proxy ARP entry for the peer.
1606 int sifproxyarp (int unit, u_int32_t his_adr)
1608 struct arpreq arpreq;
1611 if (has_proxy_arp == 0) {
1612 memset (&arpreq, '\0', sizeof(arpreq));
1614 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1615 SIN_ADDR(arpreq.arp_pa) = his_adr;
1616 arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1618 * Get the hardware address of an interface on the same subnet
1619 * as our local address.
1621 if (!get_ether_addr(his_adr, &arpreq.arp_ha, proxy_arp_dev,
1622 sizeof(proxy_arp_dev))) {
1623 error("Cannot determine ethernet address for proxy ARP");
1626 strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
1628 if (ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq) < 0) {
1629 if ( ! ok_error ( errno ))
1630 error("ioctl(SIOCSARP): %m(%d)", errno);
1633 proxy_arp_addr = his_adr;
1637 forw_path = path_to_procfs("/sys/net/ipv4/ip_forward");
1638 if (forw_path != 0) {
1639 int fd = open(forw_path, O_WRONLY);
1641 if (write(fd, "1", 1) != 1)
1642 error("Couldn't enable IP forwarding: %m");
1652 /********************************************************************
1654 * cifproxyarp - Delete the proxy ARP entry for the peer.
1657 int cifproxyarp (int unit, u_int32_t his_adr)
1659 struct arpreq arpreq;
1661 if (has_proxy_arp) {
1663 memset (&arpreq, '\0', sizeof(arpreq));
1664 SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1665 SIN_ADDR(arpreq.arp_pa) = his_adr;
1666 arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1667 strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
1669 if (ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq) < 0) {
1670 if ( ! ok_error ( errno ))
1671 warn("ioctl(SIOCDARP): %m(%d)", errno);
1678 /********************************************************************
1680 * get_ether_addr - get the hardware address of an interface on the
1681 * the same subnet as ipaddr.
1684 static int get_ether_addr (u_int32_t ipaddr,
1685 struct sockaddr *hwaddr,
1686 char *name, int namelen)
1688 struct ifreq *ifr, *ifend;
1689 u_int32_t ina, mask;
1693 struct ifreq ifs[MAX_IFS];
1695 ifc.ifc_len = sizeof(ifs);
1697 if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1698 if ( ! ok_error ( errno ))
1699 error("ioctl(SIOCGIFCONF): %m(%d)", errno);
1703 SYSDEBUG ((LOG_DEBUG, "proxy arp: scanning %d interfaces for IP %s",
1704 ifc.ifc_len / sizeof(struct ifreq), ip_ntoa(ipaddr)));
1706 * Scan through looking for an interface with an Internet
1707 * address on the same subnet as `ipaddr'.
1709 ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq));
1710 for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1711 if (ifr->ifr_addr.sa_family == AF_INET) {
1712 ina = SIN_ADDR(ifr->ifr_addr);
1713 strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1714 SYSDEBUG ((LOG_DEBUG, "proxy arp: examining interface %s",
1717 * Check that the interface is up, and not point-to-point
1720 if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1723 if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1726 * Get its netmask and check that it's on the right subnet.
1728 if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1731 mask = SIN_ADDR(ifreq.ifr_addr);
1732 SYSDEBUG ((LOG_DEBUG, "proxy arp: interface addr %s mask %lx",
1733 ip_ntoa(ina), ntohl(mask)));
1735 if (((ipaddr ^ ina) & mask) != 0)
1744 strlcpy(name, ifreq.ifr_name, namelen);
1746 /* trim off the :1 in eth0:1 */
1747 aliasp = strchr(name, ':');
1751 info("found interface %s for proxy arp", name);
1753 * Now get the hardware address.
1755 memset (&ifreq.ifr_hwaddr, 0, sizeof (struct sockaddr));
1756 if (ioctl (sock_fd, SIOCGIFHWADDR, &ifreq) < 0) {
1757 error("SIOCGIFHWADDR(%s): %m(%d)", ifreq.ifr_name, errno);
1763 sizeof (struct sockaddr));
1765 SYSDEBUG ((LOG_DEBUG,
1766 "proxy arp: found hwaddr %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
1767 (int) ((unsigned char *) &hwaddr->sa_data)[0],
1768 (int) ((unsigned char *) &hwaddr->sa_data)[1],
1769 (int) ((unsigned char *) &hwaddr->sa_data)[2],
1770 (int) ((unsigned char *) &hwaddr->sa_data)[3],
1771 (int) ((unsigned char *) &hwaddr->sa_data)[4],
1772 (int) ((unsigned char *) &hwaddr->sa_data)[5],
1773 (int) ((unsigned char *) &hwaddr->sa_data)[6],
1774 (int) ((unsigned char *) &hwaddr->sa_data)[7]));
1779 * get_if_hwaddr - get the hardware address for the specified
1780 * network interface device.
1783 get_if_hwaddr(u_char *addr, char *name)
1788 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
1791 memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
1792 strlcpy(ifreq.ifr_name, name, sizeof(ifreq.ifr_name));
1793 ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
1796 memcpy(addr, ifreq.ifr_hwaddr.sa_data, 6);
1801 * get_first_ethernet - return the name of the first ethernet-style
1802 * interface on this system.
1805 get_first_ethernet()
1810 /********************************************************************
1812 * Return user specified netmask, modified by any mask we might determine
1813 * for address `addr' (in network byte order).
1814 * Here we scan through the system's list of interfaces, looking for
1815 * any non-point-to-point interfaces which might appear to be on the same
1816 * network as `addr'. If we find any, we OR in their netmask to the
1817 * user-specified netmask.
1820 u_int32_t GetMask (u_int32_t addr)
1822 u_int32_t mask, nmask, ina;
1823 struct ifreq *ifr, *ifend, ifreq;
1825 struct ifreq ifs[MAX_IFS];
1829 if (IN_CLASSA(addr)) /* determine network mask for address class */
1830 nmask = IN_CLASSA_NET;
1831 else if (IN_CLASSB(addr))
1832 nmask = IN_CLASSB_NET;
1834 nmask = IN_CLASSC_NET;
1836 /* class D nets are disallowed by bad_ip_adrs */
1837 mask = netmask | htonl(nmask);
1839 * Scan through the system's network interfaces.
1841 ifc.ifc_len = sizeof(ifs);
1843 if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1844 if ( ! ok_error ( errno ))
1845 warn("ioctl(SIOCGIFCONF): %m(%d)", errno);
1849 ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
1850 for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1852 * Check the interface's internet address.
1854 if (ifr->ifr_addr.sa_family != AF_INET)
1856 ina = SIN_ADDR(ifr->ifr_addr);
1857 if (((ntohl(ina) ^ addr) & nmask) != 0)
1860 * Check that the interface is up, and not point-to-point nor loopback.
1862 strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1863 if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1866 if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1869 * Get its netmask and OR it into our mask.
1871 if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1873 mask |= SIN_ADDR(ifreq.ifr_addr);
1879 /********************************************************************
1881 * Internal routine to decode the version.modification.patch level
1884 static void decode_version (char *buf, int *version,
1885 int *modification, int *patch)
1889 *version = (int) strtoul (buf, &endp, 10);
1893 if (endp != buf && *endp == '.') {
1895 *modification = (int) strtoul (buf, &endp, 10);
1896 if (endp != buf && *endp == '.') {
1898 *patch = (int) strtoul (buf, &buf, 10);
1903 /********************************************************************
1905 * Procedure to determine if the PPP line discipline is registered.
1909 ppp_registered(void)
1917 * We used to open the serial device and set it to the ppp line
1918 * discipline here, in order to create a ppp unit. But that is
1919 * not a good idea - the user might have specified a device that
1920 * they can't open (permission, or maybe it doesn't really exist).
1921 * So we grab a pty master/slave pair and use that.
1923 if (!get_pty(&mfd, &local_fd, slave, 0)) {
1924 no_ppp_msg = "Couldn't determine if PPP is supported (no free ptys)";
1929 * Try to put the device into the PPP discipline.
1931 if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
1932 error("ioctl(TIOCSETD(PPP)): %m(%d)", errno);
1941 /********************************************************************
1943 * ppp_available - check whether the system has any ppp interfaces
1944 * (in fact we check whether we can do an ioctl on ppp0).
1947 int ppp_available(void)
1952 int my_version, my_modification, my_patch;
1953 int osmaj, osmin, ospatch;
1956 "This system lacks kernel support for PPP. This could be because\n"
1957 "the PPP kernel module could not be loaded, or because PPP was not\n"
1958 "included in the kernel configuration. If PPP was included as a\n"
1959 "module, try `/sbin/modprobe -v ppp'. If that fails, check that\n"
1960 "ppp.o exists in /lib/modules/`uname -r`/net.\n"
1961 "See README.linux file in the ppp distribution for more details.\n";
1963 /* get the kernel version now, since we are called before sys_init */
1965 osmaj = osmin = ospatch = 0;
1966 sscanf(utsname.release, "%d.%d.%d", &osmaj, &osmin, &ospatch);
1967 kernel_version = KVERSION(osmaj, osmin, ospatch);
1969 fd = open("/dev/ppp", O_RDWR);
1971 if (fd < 0 && errno == ENOENT) {
1972 /* try making it and see if that helps. */
1973 if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
1974 makedev(108, 0)) >= 0) {
1975 fd = open("/dev/ppp", O_RDWR);
1977 info("Created /dev/ppp device node");
1979 unlink("/dev/ppp"); /* didn't work, undo the mknod */
1980 } else if (errno == EEXIST) {
1981 fd = open("/dev/ppp", O_RDWR);
1986 new_style_driver = 1;
1988 /* XXX should get from driver */
1990 driver_modification = 4;
1995 if (kernel_version >= KVERSION(2,3,13)) {
1996 if (errno == ENOENT)
1998 "pppd is unable to open the /dev/ppp device.\n"
1999 "You need to create the /dev/ppp device node by\n"
2000 "executing the following command as root:\n"
2001 " mknod /dev/ppp c 108 0\n";
2006 * Open a socket for doing the ioctl operations.
2008 s = socket(AF_INET, SOCK_DGRAM, 0);
2012 strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
2013 ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
2015 * If the device did not exist then attempt to create one by putting the
2016 * current tty into the PPP discipline. If this works then obtain the
2017 * flags for the device again.
2020 if (ppp_registered()) {
2021 strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
2022 ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
2026 * Ensure that the hardware address is for PPP and not something else
2029 ok = ioctl (s, SIOCGIFHWADDR, (caddr_t) &ifr) >= 0;
2031 if (ok && ((ifr.ifr_hwaddr.sa_family & ~0xFF) != ARPHRD_PPP))
2035 * This is the PPP device. Validate the version of the driver at this
2036 * point to ensure that this program will work with the driver.
2039 char abBuffer [1024];
2041 ifr.ifr_data = abBuffer;
2042 size = ioctl (s, SIOCGPPPVER, (caddr_t) &ifr);
2044 error("Couldn't read driver version: %m");
2046 no_ppp_msg = "Sorry, couldn't verify kernel driver version\n";
2049 decode_version(abBuffer,
2051 &driver_modification,
2054 * Validate the version of the driver against the version that we used.
2056 decode_version(VERSION,
2061 /* The version numbers must match */
2062 if (driver_version != my_version)
2065 /* The modification levels must be legal */
2066 if (driver_modification < 3) {
2067 if (driver_modification >= 2) {
2068 /* we can cope with 2.2.0 and above */
2077 slprintf(route_buffer, sizeof(route_buffer),
2078 "Sorry - PPP driver version %d.%d.%d is out of date\n",
2079 driver_version, driver_modification, driver_patch);
2081 no_ppp_msg = route_buffer;
2088 /********************************************************************
2090 * Update the wtmp file with the appropriate user name and tty device.
2093 void logwtmp (const char *line, const char *name, const char *host)
2095 struct utmp ut, *utp;
2096 pid_t mypid = getpid();
2102 * Update the signon database for users.
2103 * Christoph Lameter: Copied from poeigl-1.36 Jan 3, 1996
2105 utmpname(_PATH_UTMP);
2107 while ((utp = getutent()) && (utp->ut_pid != mypid))
2110 /* Is this call really necessary? There is another one after the 'put' */
2114 memcpy(&ut, utp, sizeof(ut));
2116 /* some gettys/telnetds don't initialize utmp... */
2117 memset(&ut, 0, sizeof(ut));
2119 if (ut.ut_id[0] == 0)
2120 strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
2122 strncpy(ut.ut_user, name, sizeof(ut.ut_user));
2123 strncpy(ut.ut_line, line, sizeof(ut.ut_line));
2127 ut.ut_type = USER_PROCESS;
2130 /* Insert the host name if one is supplied */
2132 strncpy (ut.ut_host, host, sizeof(ut.ut_host));
2134 /* Insert the IP address of the remote system if IP is enabled */
2135 if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
2136 memcpy(&ut.ut_addr, (char *) &ipcp_hisoptions[0].hisaddr,
2137 sizeof(ut.ut_addr));
2139 /* CL: Makes sure that the logout works */
2140 if (*host == 0 && *name==0)
2146 * Update the wtmp file.
2149 updwtmp(_PATH_WTMP, &ut);
2151 wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
2153 flock(wtmp, LOCK_EX);
2155 if (write (wtmp, (char *)&ut, sizeof(ut)) != sizeof(ut))
2156 warn("error writing %s: %m", _PATH_WTMP);
2158 flock(wtmp, LOCK_UN);
2166 /********************************************************************
2168 * sifvjcomp - config tcp header compression
2171 int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid)
2173 u_int x = get_flags(ppp_dev_fd);
2176 if (ioctl (ppp_dev_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) {
2177 if (! ok_error (errno))
2178 error("ioctl(PPPIOCSMAXCID): %m(%d)", errno);
2183 x = vjcomp ? x | SC_COMP_TCP : x &~ SC_COMP_TCP;
2184 x = cidcomp ? x & ~SC_NO_TCP_CCID : x | SC_NO_TCP_CCID;
2185 set_flags (ppp_dev_fd, x);
2190 /********************************************************************
2192 * sifup - Config the interface up and enable IP packets to pass.
2199 memset (&ifr, '\0', sizeof (ifr));
2200 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2201 if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
2202 if (! ok_error (errno))
2203 error("ioctl (SIOCGIFFLAGS): %m(%d)", errno);
2207 ifr.ifr_flags |= (IFF_UP | IFF_POINTOPOINT);
2208 if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
2209 if (! ok_error (errno))
2210 error("ioctl(SIOCSIFFLAGS): %m(%d)", errno);
2218 /********************************************************************
2220 * sifdown - Disable the indicated protocol and config the interface
2221 * down if there are no remaining protocols.
2228 if (if_is_up && --if_is_up > 0)
2231 memset (&ifr, '\0', sizeof (ifr));
2232 strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2233 if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
2234 if (! ok_error (errno))
2235 error("ioctl (SIOCGIFFLAGS): %m(%d)", errno);
2239 ifr.ifr_flags &= ~IFF_UP;
2240 ifr.ifr_flags |= IFF_POINTOPOINT;
2241 if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
2242 if (! ok_error (errno))
2243 error("ioctl(SIOCSIFFLAGS): %m(%d)", errno);
2249 /********************************************************************
2251 * sifaddr - Config the interface IP addresses and netmask.
2254 int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
2260 memset (&ifr, '\0', sizeof (ifr));
2261 memset (&rt, '\0', sizeof (rt));
2263 SET_SA_FAMILY (ifr.ifr_addr, AF_INET);
2264 SET_SA_FAMILY (ifr.ifr_dstaddr, AF_INET);
2265 SET_SA_FAMILY (ifr.ifr_netmask, AF_INET);
2267 strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2269 * Set our IP address
2271 SIN_ADDR(ifr.ifr_addr) = our_adr;
2272 if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2273 if (errno != EEXIST) {
2274 if (! ok_error (errno))
2275 error("ioctl(SIOCSIFADDR): %m(%d)", errno);
2278 warn("ioctl(SIOCSIFADDR): Address already exists");
2283 * Set the gateway address
2285 SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
2286 if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
2287 if (! ok_error (errno))
2288 error("ioctl(SIOCSIFDSTADDR): %m(%d)", errno);
2293 * For recent kernels, force the netmask to 255.255.255.255.
2295 if (kernel_version >= KVERSION(2,1,16))
2297 if (net_mask != 0) {
2298 SIN_ADDR(ifr.ifr_netmask) = net_mask;
2299 if (ioctl(sock_fd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) {
2300 if (! ok_error (errno))
2301 error("ioctl(SIOCSIFNETMASK): %m(%d)", errno);
2306 * Add the device route
2308 if (kernel_version < KVERSION(2,1,16)) {
2309 SET_SA_FAMILY (rt.rt_dst, AF_INET);
2310 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2313 SIN_ADDR(rt.rt_gateway) = 0L;
2314 SIN_ADDR(rt.rt_dst) = his_adr;
2315 rt.rt_flags = RTF_UP | RTF_HOST;
2317 if (kernel_version > KVERSION(2,1,0)) {
2318 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2319 SIN_ADDR(rt.rt_genmask) = -1L;
2322 if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
2323 if (! ok_error (errno))
2324 error("ioctl(SIOCADDRT) device route: %m(%d)", errno);
2329 /* set ip_dynaddr in demand mode if address changes */
2330 if (demand && tune_kernel && !dynaddr_set
2331 && our_old_addr && our_old_addr != our_adr) {
2332 /* set ip_dynaddr if possible */
2336 path = path_to_procfs("/sys/net/ipv4/ip_dynaddr");
2337 if (path != 0 && (fd = open(path, O_WRONLY)) >= 0) {
2338 if (write(fd, "1", 1) != 1)
2339 error("Couldn't enable dynamic IP addressing: %m");
2342 dynaddr_set = 1; /* only 1 attempt */
2349 /********************************************************************
2351 * cifaddr - Clear the interface IP addresses, and delete routes
2352 * through the interface if possible.
2355 int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
2359 create_msg(BCM_PPPOE_CLIENT_STATE_DOWN);
2360 syslog(LOG_CRIT,"Clear IP addresses. PPP connection DOWN.\n");
2362 if (kernel_version < KVERSION(2,1,16)) {
2364 * Delete the route through the device
2367 memset (&rt, '\0', sizeof (rt));
2369 SET_SA_FAMILY (rt.rt_dst, AF_INET);
2370 SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2373 SIN_ADDR(rt.rt_gateway) = 0;
2374 SIN_ADDR(rt.rt_dst) = his_adr;
2375 rt.rt_flags = RTF_UP | RTF_HOST;
2377 if (kernel_version > KVERSION(2,1,0)) {
2378 SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2379 SIN_ADDR(rt.rt_genmask) = -1L;
2382 if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
2383 if (still_ppp() && ! ok_error (errno))
2384 error("ioctl(SIOCDELRT) device route: %m(%d)", errno);
2389 /* This way it is possible to have an IPX-only or IPv6-only interface */
2390 memset(&ifr, 0, sizeof(ifr));
2391 SET_SA_FAMILY(ifr.ifr_addr, AF_INET);
2392 strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2394 if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2395 if (! ok_error (errno)) {
2396 error("ioctl(SIOCSIFADDR): %m(%d)", errno);
2401 our_old_addr = our_adr;
2407 /********************************************************************
2409 * sif6addr - Config the interface with an IPv6 link-local address
2411 int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
2413 struct in6_ifreq ifr6;
2415 struct in6_rtmsg rt6;
2419 error("IPv6 socket creation failed: %m");
2422 memset(&ifr, 0, sizeof (ifr));
2423 strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2424 if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
2425 error("sif6addr: ioctl(SIOCGIFINDEX): %m (%d)", errno);
2429 /* Local interface */
2430 memset(&ifr6, 0, sizeof(ifr6));
2431 IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
2432 ifr6.ifr6_ifindex = ifr.ifr_ifindex;
2433 ifr6.ifr6_prefixlen = 10;
2435 if (ioctl(sock6_fd, SIOCSIFADDR, &ifr6) < 0) {
2436 error("sif6addr: ioctl(SIOCSIFADDR): %m (%d)", errno);
2440 /* Route to remote host */
2441 memset(&rt6, 0, sizeof(rt6));
2442 IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
2443 rt6.rtmsg_flags = RTF_UP;
2444 rt6.rtmsg_dst_len = 10;
2445 rt6.rtmsg_ifindex = ifr.ifr_ifindex;
2446 rt6.rtmsg_metric = 1;
2448 if (ioctl(sock6_fd, SIOCADDRT, &rt6) < 0) {
2449 error("sif6addr: ioctl(SIOCADDRT): %m (%d)", errno);
2457 /********************************************************************
2459 * cif6addr - Remove IPv6 address from interface
2461 int cif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
2464 struct in6_ifreq ifr6;
2468 error("IPv6 socket creation failed: %m");
2471 memset(&ifr, 0, sizeof(ifr));
2472 strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2473 if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
2474 error("cif6addr: ioctl(SIOCGIFINDEX): %m (%d)", errno);
2478 memset(&ifr6, 0, sizeof(ifr6));
2479 IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
2480 ifr6.ifr6_ifindex = ifr.ifr_ifindex;
2481 ifr6.ifr6_prefixlen = 10;
2483 if (ioctl(sock6_fd, SIOCDIFADDR, &ifr6) < 0) {
2484 if (errno != EADDRNOTAVAIL) {
2485 if (! ok_error (errno))
2486 error("cif6addr: ioctl(SIOCDIFADDR): %m (%d)", errno);
2489 warn("cif6addr: ioctl(SIOCDIFADDR): No such address");
2498 * get_pty - get a pty master/slave pair and chown the slave side
2499 * to the uid given. Assumes slave_name points to >= 16 bytes of space.
2502 get_pty(master_fdp, slave_fdp, slave_name, uid)
2508 int i, mfd, sfd = -1;
2510 struct termios tios;
2514 * Try the unix98 way first.
2516 mfd = open("/dev/ptmx", O_RDWR);
2519 if (ioctl(mfd, TIOCGPTN, &ptn) >= 0) {
2520 slprintf(pty_name, sizeof(pty_name), "/dev/pts/%d", ptn);
2521 chmod(pty_name, S_IRUSR | S_IWUSR);
2524 if (ioctl(mfd, TIOCSPTLCK, &ptn) < 0)
2525 warn("Couldn't unlock pty slave %s: %m", pty_name);
2527 if ((sfd = open(pty_name, O_RDWR | O_NOCTTY)) < 0)
2528 warn("Couldn't open pty slave %s: %m", pty_name);
2531 #endif /* TIOCGPTN */
2534 /* the old way - scan through the pty name space */
2535 for (i = 0; i < 64; ++i) {
2536 slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
2537 'p' + i / 16, i % 16);
2538 mfd = open(pty_name, O_RDWR, 0);
2541 sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
2543 fchown(sfd, uid, -1);
2544 fchmod(sfd, S_IRUSR | S_IWUSR);
2555 strlcpy(slave_name, pty_name, 16);
2558 if (tcgetattr(sfd, &tios) == 0) {
2559 tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
2560 tios.c_cflag |= CS8 | CREAD | CLOCAL;
2561 tios.c_iflag = IGNPAR;
2564 if (tcsetattr(sfd, TCSAFLUSH, &tios) < 0)
2565 warn("couldn't set attributes on pty: %m");
2567 warn("couldn't get attributes on pty: %m");
2572 /********************************************************************
2574 * open_loopback - open the device we use for getting packets
2575 * in demand mode. Under Linux, we use a pty master/slave pair.
2578 open_ppp_loopback(void)
2583 if (new_style_driver) {
2584 /* allocate ourselves a ppp unit */
2585 if (make_ppp_unit() < 0)
2587 set_flags(ppp_dev_fd, SC_LOOP_TRAFFIC);
2588 set_kdebugflag(kdebugflag);
2593 if (!get_pty(&master_fd, &slave_fd, loop_name, 0))
2594 fatal("No free pty for loopback");
2595 SYSDEBUG(("using %s for loopback", loop_name));
2597 set_ppp_fd(slave_fd);
2599 flags = fcntl(master_fd, F_GETFL);
2601 fcntl(master_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2602 warn("couldn't set master loopback to nonblock: %m(%d)", errno);
2604 flags = fcntl(ppp_fd, F_GETFL);
2606 fcntl(ppp_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2607 warn("couldn't set slave loopback to nonblock: %m(%d)", errno);
2609 if (ioctl(ppp_fd, TIOCSETD, &ppp_disc) < 0)
2610 fatal("ioctl(TIOCSETD): %m(%d)", errno);
2612 * Find out which interface we were given.
2614 if (ioctl(ppp_fd, PPPIOCGUNIT, &ifunit) < 0)
2615 fatal("ioctl(PPPIOCGUNIT): %m(%d)", errno);
2617 * Enable debug in the driver if requested.
2619 set_kdebugflag (kdebugflag);
2624 /********************************************************************
2626 * restore_loop - reattach the ppp unit to the loopback.
2628 * The kernel ppp driver automatically reattaches the ppp unit to
2629 * the loopback if the serial port is set to a line discipline other
2630 * than ppp, or if it detects a modem hangup. The former will happen
2631 * in disestablish_ppp if the latter hasn't already happened, so we
2632 * shouldn't need to do anything.
2634 * Just to be sure, set the real serial port to the normal discipline.
2641 if (new_style_driver) {
2642 set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) | SC_LOOP_TRAFFIC);
2645 if (ppp_fd != slave_fd) {
2646 (void) ioctl(ppp_fd, TIOCSETD, &tty_disc);
2647 set_ppp_fd(slave_fd);
2651 /********************************************************************
2653 * sifnpmode - Set the mode for handling packets for a given NP.
2657 sifnpmode(u, proto, mode)
2664 npi.protocol = proto;
2666 if (ioctl(ppp_dev_fd, PPPIOCSNPMODE, (caddr_t) &npi) < 0) {
2667 if (! ok_error (errno))
2668 error("ioctl(PPPIOCSNPMODE, %d, %d): %m (%d)",
2669 proto, mode, errno);
2676 /********************************************************************
2678 * sipxfaddr - Config the interface IPX networknumber
2681 int sipxfaddr (int unit, unsigned long int network, unsigned char * node )
2688 struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2690 skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2692 if (! ok_error (errno))
2693 dbglog("socket(AF_IPX): %m (%d)", errno);
2697 memset (&ifr, '\0', sizeof (ifr));
2698 strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2700 memcpy (sipx->sipx_node, node, IPX_NODE_LEN);
2701 sipx->sipx_family = AF_IPX;
2702 sipx->sipx_port = 0;
2703 sipx->sipx_network = htonl (network);
2704 sipx->sipx_type = IPX_FRAME_ETHERII;
2705 sipx->sipx_action = IPX_CRTITF;
2707 * Set the IPX device
2709 if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2711 if (errno != EEXIST) {
2712 if (! ok_error (errno))
2713 dbglog("ioctl(SIOCSIFADDR, CRTITF): %m (%d)", errno);
2716 warn("ioctl(SIOCSIFADDR, CRTITF): Address already exists");
2725 /********************************************************************
2727 * cipxfaddr - Clear the information for the IPX network. The IPX routes
2728 * are removed and the device is no longer able to pass IPX
2732 int cipxfaddr (int unit)
2739 struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2741 skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2743 if (! ok_error (errno))
2744 dbglog("socket(AF_IPX): %m (%d)", errno);
2748 memset (&ifr, '\0', sizeof (ifr));
2749 strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2751 sipx->sipx_type = IPX_FRAME_ETHERII;
2752 sipx->sipx_action = IPX_DLTITF;
2753 sipx->sipx_family = AF_IPX;
2755 * Set the IPX device
2757 if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2758 if (! ok_error (errno))
2759 info("ioctl(SIOCSIFADDR, IPX_DLTITF): %m (%d)", errno);
2769 * Use the hostname as part of the random number seed.
2778 for (p = hostname; *p != 0; ++p)
2785 /********************************************************************
2787 * sys_check_options - check the options that the user specified
2791 sys_check_options(void)
2795 * Disable the IPX protocol if the support is not present in the kernel.
2799 if (ipxcp_protent.enabled_flag) {
2800 struct stat stat_buf;
2801 if ((path = path_to_procfs("/net/ipx_interface")) == 0
2802 || lstat(path, &stat_buf) < 0) {
2803 error("IPX support is not present in the kernel\n");
2804 ipxcp_protent.enabled_flag = 0;
2808 if (demand && driver_is_old) {
2809 option_error("demand dialling is not supported by kernel driver "
2810 "version %d.%d.%d", driver_version, driver_modification,
2814 if (multilink && !new_style_driver) {
2815 warn("Warning: multilink is not supported by the kernel driver");