]> git.ozlabs.org Git - ppp.git/blob - pppd/sys-linux.c
export generic_{dis,}establish_ppp for pppoe stuff
[ppp.git] / pppd / sys-linux.c
1 /*
2  * sys-linux.c - System-dependent procedures for setting up
3  * PPP interfaces on Linux systems
4  *
5  * Copyright (c) 1989 Carnegie Mellon University.
6  * All rights reserved.
7  *
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.
19  */
20
21 #include <sys/ioctl.h>
22 #include <sys/types.h>
23 #include <sys/socket.h>
24 #include <sys/time.h>
25 #include <sys/errno.h>
26 #include <sys/file.h>
27 #include <sys/stat.h>
28 #include <sys/utsname.h>
29 #include <sys/sysmacros.h>
30
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <syslog.h>
34 #include <string.h>
35 #include <time.h>
36 #include <memory.h>
37 #include <utmp.h>
38 #include <mntent.h>
39 #include <signal.h>
40 #include <fcntl.h>
41 #include <ctype.h>
42 #include <termios.h>
43 #include <unistd.h>
44
45 /* This is in netdevice.h. However, this compile will fail miserably if
46    you attempt to include netdevice.h because it has so many references
47    to __memcpy functions which it should not attempt to do. So, since I
48    really don't use it, but it must be defined, define it now. */
49
50 #ifndef MAX_ADDR_LEN
51 #define MAX_ADDR_LEN 7
52 #endif
53
54 #if __GLIBC__ >= 2
55 #include <asm/types.h>          /* glibc 2 conflicts with linux/types.h */
56 #include <net/if.h>
57 #include <net/if_arp.h>
58 #include <net/route.h>
59 #include <netinet/if_ether.h>
60 #else
61 #include <linux/types.h>
62 #include <linux/if.h>
63 #include <linux/if_arp.h>
64 #include <linux/route.h>
65 #include <linux/if_ether.h>
66 #endif
67 #include <netinet/in.h>
68 #include <arpa/inet.h>
69
70 #include <linux/ppp_defs.h>
71 #include <linux/if_ppp.h>
72
73 #include "pppd.h"
74 #include "fsm.h"
75 #include "ipcp.h"
76
77 #ifdef IPX_CHANGE
78 #include "ipxcp.h"
79 #if __GLIBC__ >= 2 && \
80     !(defined(__powerpc__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
81 #include <netipx/ipx.h>
82 #else
83 #include <linux/ipx.h>
84 #endif
85 #endif /* IPX_CHANGE */
86
87 #ifdef PPP_FILTER
88 #include <net/bpf.h>
89 #include <linux/filter.h>
90 #endif /* PPP_FILTER */
91
92 #ifdef LOCKLIB
93 #include <sys/locks.h>
94 #endif
95
96 #ifdef INET6
97 #ifndef _LINUX_IN6_H
98 /*
99  *    This is in linux/include/net/ipv6.h.
100  */
101
102 struct in6_ifreq {
103     struct in6_addr ifr6_addr;
104     __u32 ifr6_prefixlen;
105     unsigned int ifr6_ifindex;
106 };
107 #endif
108
109 #define IN6_LLADDR_FROM_EUI64(sin6, eui64) do {                 \
110         memset(&sin6.s6_addr, 0, sizeof(struct in6_addr));      \
111         sin6.s6_addr16[0] = htons(0xfe80);                      \
112         eui64_copy(eui64, sin6.s6_addr32[2]);                   \
113         } while (0)
114
115 #endif /* INET6 */
116
117 /* We can get an EIO error on an ioctl if the modem has hung up */
118 #define ok_error(num) ((num)==EIO)
119
120 static int tty_disc = N_TTY;    /* The TTY discipline */
121 static int ppp_disc = N_PPP;    /* The PPP discpline */
122 static int initfdflags = -1;    /* Initial file descriptor flags for fd */
123 static int ppp_fd = -1;         /* fd which is set to PPP discipline */
124 static int sock_fd = -1;        /* socket for doing interface ioctls */
125 static int slave_fd = -1;
126 static int master_fd = -1;
127 #ifdef INET6
128 static int sock6_fd = -1;
129 #endif /* INET6 */
130 static int ppp_dev_fd = -1;     /* fd for /dev/ppp (new style driver) */
131 static int chindex;             /* channel index (new style driver) */
132
133 static fd_set in_fds;           /* set of fds that wait_input waits for */
134 static int max_in_fd;           /* highest fd set in in_fds */
135
136 static int has_proxy_arp       = 0;
137 static int driver_version      = 0;
138 static int driver_modification = 0;
139 static int driver_patch        = 0;
140 static int driver_is_old       = 0;
141 static int restore_term        = 0;     /* 1 => we've munged the terminal */
142 static struct termios inittermios;      /* Initial TTY termios */
143
144 int new_style_driver = 0;
145
146 static char loop_name[20];
147 static unsigned char inbuf[512]; /* buffer for chars read from loopback */
148
149 static int      if_is_up;       /* Interface has been marked up */
150 static u_int32_t default_route_gateway; /* Gateway for default route added */
151 static u_int32_t proxy_arp_addr;        /* Addr for proxy arp entry added */
152 static char proxy_arp_dev[16];          /* Device for proxy arp entry */
153 static u_int32_t our_old_addr;          /* for detecting address changes */
154 static int      dynaddr_set;            /* 1 if ip_dynaddr set */
155 static int      looped;                 /* 1 if using loop */
156 static int      link_mtu;               /* mtu for the link (not bundle) */
157
158 static struct utsname utsname;  /* for the kernel version */
159 static int kernel_version;
160 #define KVERSION(j,n,p) ((j)*1000000 + (n)*1000 + (p))
161
162 #define MAX_IFS         100
163
164 #define FLAGS_GOOD (IFF_UP          | IFF_BROADCAST)
165 #define FLAGS_MASK (IFF_UP          | IFF_BROADCAST | \
166                     IFF_POINTOPOINT | IFF_LOOPBACK  | IFF_NOARP)
167
168 #define SIN_ADDR(x)     (((struct sockaddr_in *) (&(x)))->sin_addr.s_addr)
169
170 /* Prototypes for procedures local to this file. */
171 static int get_flags (int fd);
172 static void set_flags (int fd, int flags);
173 static int translate_speed (int bps);
174 static int baud_rate_of (int speed);
175 static void close_route_table (void);
176 static int open_route_table (void);
177 static int read_route_table (struct rtentry *rt);
178 static int defaultroute_exists (struct rtentry *rt);
179 static int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr,
180                            char *name, int namelen);
181 static void decode_version (char *buf, int *version, int *mod, int *patch);
182 static int set_kdebugflag(int level);
183 static int ppp_registered(void);
184 static int make_ppp_unit(void);
185
186 extern u_char   inpacket_buf[]; /* borrowed from main.c */
187
188 /*
189  * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
190  * if it exists.
191  */
192
193 #define SET_SA_FAMILY(addr, family)                     \
194     memset ((char *) &(addr), '\0', sizeof(addr));      \
195     addr.sa_family = (family);
196
197 /*
198  * Determine if the PPP connection should still be present.
199  */
200
201 extern int hungup;
202
203 /* new_fd is the fd of a tty */
204 static void set_ppp_fd (int new_fd)
205 {
206         SYSDEBUG ((LOG_DEBUG, "setting ppp_fd to %d\n", new_fd));
207         ppp_fd = new_fd;
208         if (!new_style_driver)
209                 ppp_dev_fd = new_fd;
210 }
211
212 static int still_ppp(void)
213 {
214         if (new_style_driver)
215                 return !hungup && ppp_fd >= 0;
216         if (!hungup || ppp_fd == slave_fd)
217                 return 1;
218         if (slave_fd >= 0) {
219                 set_ppp_fd(slave_fd);
220                 return 1;
221         }
222         return 0;
223 }
224
225 /********************************************************************
226  *
227  * Functions to read and set the flags value in the device driver
228  */
229
230 static int get_flags (int fd)
231 {    
232     int flags;
233
234     if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &flags) < 0) {
235         if ( ok_error (errno) )
236             flags = 0;
237         else
238             fatal("ioctl(PPPIOCGFLAGS): %m (line %d)", __LINE__);
239     }
240
241     SYSDEBUG ((LOG_DEBUG, "get flags = %x\n", flags));
242     return flags;
243 }
244
245 /********************************************************************/
246
247 static void set_flags (int fd, int flags)
248 {    
249     SYSDEBUG ((LOG_DEBUG, "set flags = %x\n", flags));
250
251     if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &flags) < 0) {
252         if (! ok_error (errno) )
253             fatal("ioctl(PPPIOCSFLAGS, %x): %m (line %d)", flags, errno, __LINE__);
254     }
255 }
256
257 /********************************************************************
258  *
259  * sys_init - System-dependent initialization.
260  */
261
262 void sys_init(void)
263 {
264     int flags;
265
266     if (new_style_driver) {
267         ppp_dev_fd = open("/dev/ppp", O_RDWR);
268         if (ppp_dev_fd < 0)
269             fatal("Couldn't open /dev/ppp: %m");
270         flags = fcntl(ppp_dev_fd, F_GETFL);
271         if (flags == -1
272             || fcntl(ppp_dev_fd, F_SETFL, flags | O_NONBLOCK) == -1)
273             warn("Couldn't set /dev/ppp to nonblock: %m");
274     }
275
276     /* Get an internet socket for doing socket ioctls. */
277     sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
278     if (sock_fd < 0)
279         fatal("Couldn't create IP socket: %m(%d)", errno);
280
281 #ifdef INET6
282     sock6_fd = socket(AF_INET6, SOCK_DGRAM, 0);
283     if (sock6_fd < 0)
284         sock6_fd = -errno;      /* save errno for later */
285 #endif
286
287     FD_ZERO(&in_fds);
288     max_in_fd = 0;
289 }
290
291 /********************************************************************
292  *
293  * sys_cleanup - restore any system state we modified before exiting:
294  * mark the interface down, delete default route and/or proxy arp entry.
295  * This shouldn't call die() because it's called from die().
296  */
297
298 void sys_cleanup(void)
299 {
300 /*
301  * Take down the device
302  */
303     if (if_is_up) {
304         if_is_up = 0;
305         sifdown(0);
306     }
307 /*
308  * Delete any routes through the device.
309  */
310     if (default_route_gateway != 0)
311         cifdefaultroute(0, 0, default_route_gateway);
312
313     if (has_proxy_arp)
314         cifproxyarp(0, proxy_arp_addr);
315 }
316
317 /********************************************************************
318  *
319  * sys_close - Clean up in a child process before execing.
320  */
321 void
322 sys_close(void)
323 {
324     if (new_style_driver)
325         close(ppp_dev_fd);
326     if (sock_fd >= 0)
327         close(sock_fd);
328     if (slave_fd >= 0)
329         close(slave_fd);
330     if (master_fd >= 0)
331         close(master_fd);
332     closelog();
333 }
334
335 /********************************************************************
336  *
337  * set_kdebugflag - Define the debugging level for the kernel
338  */
339
340 static int set_kdebugflag (int requested_level)
341 {
342     if (new_style_driver && ifunit < 0)
343         return 1;
344     if (ioctl(ppp_dev_fd, PPPIOCSDEBUG, &requested_level) < 0) {
345         if ( ! ok_error (errno) )
346             error("ioctl(PPPIOCSDEBUG): %m (line %d)", __LINE__);
347         return (0);
348     }
349     SYSDEBUG ((LOG_INFO, "set kernel debugging level to %d",
350                 requested_level));
351     return (1);
352 }
353
354 /********************************************************************
355  *
356  * tty_establish_ppp - Turn the serial port into a ppp interface.
357  */
358
359 int tty_establish_ppp (int tty_fd)
360 {
361     int ret_fd;
362
363 /*
364  * Ensure that the tty device is in exclusive mode.
365  */
366     if (ioctl(tty_fd, TIOCEXCL, 0) < 0) {
367         if ( ! ok_error ( errno ))
368             warn("Couldn't make tty exclusive: %m");
369     }
370 /*
371  * Demand mode - prime the old ppp device to relinquish the unit.
372  */
373     if (!new_style_driver && looped
374         && ioctl(slave_fd, PPPIOCXFERUNIT, 0) < 0) {
375         error("ioctl(transfer ppp unit): %m, line %d", __LINE__);
376         return -1;
377     }
378 /*
379  * Set the current tty to the PPP discpline
380  */
381
382 #ifndef N_SYNC_PPP
383 #define N_SYNC_PPP 14
384 #endif
385     ppp_disc = (new_style_driver && sync_serial)? N_SYNC_PPP: N_PPP;
386     if (ioctl(tty_fd, TIOCSETD, &ppp_disc) < 0) {
387         if ( ! ok_error (errno) ) {
388             error("Couldn't set tty to PPP discipline: %m");
389             return -1;
390         }
391     }
392
393     ret_fd = generic_establish_ppp(tty_fd);
394
395 #define SC_RCVB (SC_RCV_B7_0 | SC_RCV_B7_1 | SC_RCV_EVNP | SC_RCV_ODDP)
396 #define SC_LOGB (SC_DEBUG | SC_LOG_INPKT | SC_LOG_OUTPKT | SC_LOG_RAWIN \
397                  | SC_LOG_FLUSH)
398
399     if (ret_fd >= 0) {
400         set_flags(ppp_fd, ((get_flags(ppp_fd) & ~(SC_RCVB | SC_LOGB))
401                            | ((kdebugflag * SC_DEBUG) & SC_LOGB)));
402     } else {
403         if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0 && !ok_error(errno))
404             warn("Couldn't reset tty to normal line discipline: %m");
405     }
406
407     return ret_fd;
408 }
409
410 /********************************************************************
411  *
412  * generic_establish_ppp - Turn the fd into a ppp interface.
413  */
414 int generic_establish_ppp (int fd)
415 {
416     int x;
417
418     if (new_style_driver) {
419         /* Open another instance of /dev/ppp and connect the channel to it */
420         int flags;
421
422         if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
423             error("Couldn't get channel number: %m");
424             goto err;
425         }
426         dbglog("using channel %d", chindex);
427         fd = open("/dev/ppp", O_RDWR);
428         if (fd < 0) {
429             error("Couldn't reopen /dev/ppp: %m");
430             goto err;
431         }
432         if (ioctl(fd, PPPIOCATTCHAN, &chindex) < 0) {
433             error("Couldn't attach to channel %d: %m", chindex);
434             goto err_close;
435         }
436         flags = fcntl(fd, F_GETFL);
437         if (flags == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
438             warn("Couldn't set /dev/ppp (channel) to nonblock: %m");
439         set_ppp_fd(fd);
440
441         if (!looped)
442             ifunit = -1;
443         if (!looped && !multilink) {
444             /*
445              * Create a new PPP unit.
446              */
447             if (make_ppp_unit() < 0)
448                 goto err_close;
449         }
450
451         if (looped)
452             set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) & ~SC_LOOP_TRAFFIC);
453
454         if (!multilink) {
455             add_fd(ppp_dev_fd);
456             if (ioctl(fd, PPPIOCCONNECT, &ifunit) < 0) {
457                 error("Couldn't attach to PPP unit %d: %m", ifunit);
458                 goto err_close;
459             }
460         }
461
462     } else {
463         /*
464          * Old-style driver: find out which interface we were given.
465          */
466         set_ppp_fd (fd);
467         if (ioctl(fd, PPPIOCGUNIT, &x) < 0) {
468             if (ok_error (errno))
469                 goto err;
470             fatal("ioctl(PPPIOCGUNIT): %m (line %d)", __LINE__);
471         }
472         /* Check that we got the same unit again. */
473         if (looped && x != ifunit)
474             fatal("transfer_ppp failed: wanted unit %d, got %d", ifunit, x);
475         ifunit = x;
476
477         /*
478          * Fetch the initial file flags and reset blocking mode on the file.
479          */
480         initfdflags = fcntl(fd, F_GETFL);
481         if (initfdflags == -1 ||
482             fcntl(fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
483             if ( ! ok_error (errno))
484                 warn("Couldn't set device to non-blocking mode: %m");
485         }
486     }
487
488     looped = 0;
489
490     /*
491      * Enable debug in the driver if requested.
492      */
493     if (!looped)
494         set_kdebugflag (kdebugflag);
495
496     SYSDEBUG ((LOG_NOTICE, "Using version %d.%d.%d of PPP driver",
497             driver_version, driver_modification, driver_patch));
498
499     return ppp_fd;
500
501  err_close:
502     close(fd);
503  err:
504     return -1;
505 }
506
507 /********************************************************************
508  *
509  * tty_disestablish_ppp - Restore the serial port to normal operation.
510  * This shouldn't call die() because it's called from die().
511  */
512
513 void tty_disestablish_ppp(int tty_fd)
514 {
515     if (!hungup) {
516 /*
517  * Flush the tty output buffer so that the TIOCSETD doesn't hang.
518  */
519         if (tcflush(tty_fd, TCIOFLUSH) < 0)
520             warn("tcflush failed: %m");
521 /*
522  * Restore the previous line discipline
523  */
524         if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
525             if ( ! ok_error (errno))
526                 error("ioctl(TIOCSETD, N_TTY): %m (line %d)", __LINE__);
527         }
528         
529         if (ioctl(tty_fd, TIOCNXCL, 0) < 0) {
530             if ( ! ok_error (errno))
531                 warn("ioctl(TIOCNXCL): %m (line %d)", __LINE__);
532         }
533
534         /* Reset non-blocking mode on fd. */
535         if (initfdflags != -1 && fcntl(tty_fd, F_SETFL, initfdflags) < 0) {
536             if ( ! ok_error (errno))
537                 warn("Couldn't restore device fd flags: %m");
538         }
539     }
540     initfdflags = -1;
541
542     generic_disestablish_ppp(tty_fd);
543 }
544
545 /********************************************************************
546  *
547  * generic_disestablish_ppp - Restore device components to normal
548  * operation, and reconnect the ppp unit to the loopback if in demand
549  * mode.  This shouldn't call die() because it's called from die().
550  */
551 void generic_disestablish_ppp(int dev_fd)
552 {
553     if (new_style_driver) {
554         close(ppp_fd);
555         ppp_fd = -1;
556         if (demand) {
557             set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) | SC_LOOP_TRAFFIC);
558             looped = 1;
559         } else if (ifunit >= 0 && ioctl(ppp_dev_fd, PPPIOCDETACH) < 0)
560             error("Couldn't release PPP unit: %m");
561         if (!multilink)
562             remove_fd(ppp_dev_fd);
563     } else {
564         /* old-style driver */
565         if (demand)
566             set_ppp_fd(slave_fd);
567     }
568 }
569
570 /*
571  * make_ppp_unit - make a new ppp unit for ppp_dev_fd.
572  * Assumes new_style_driver.
573  */
574 static int make_ppp_unit()
575 {
576         int x;
577
578         ifunit = req_unit;
579         x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
580         if (x < 0 && req_unit >= 0 && errno == EEXIST) {
581                 warn("Couldn't allocate PPP unit %d as it is already in use");
582                 ifunit = -1;
583                 x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit);
584         }
585         if (x < 0)
586                 error("Couldn't create new ppp unit: %m");
587         return x;
588 }
589
590 /*
591  * cfg_bundle - configure the existing bundle.
592  * Used in demand mode.
593  */
594 void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
595 {
596         int flags;
597
598         if (!new_style_driver)
599                 return;
600
601         /* set the mrru, mtu and flags */
602         if (ioctl(ppp_dev_fd, PPPIOCSMRRU, &mrru) < 0)
603                 error("Couldn't set MRRU: %m");
604         flags = get_flags(ppp_dev_fd);
605         flags &= ~(SC_MP_SHORTSEQ | SC_MP_XSHORTSEQ);
606         flags |= (rssn? SC_MP_SHORTSEQ: 0) | (tssn? SC_MP_XSHORTSEQ: 0)
607                 | (mrru? SC_MULTILINK: 0);
608
609         set_flags(ppp_dev_fd, flags);
610
611         /* connect up the channel */
612         if (ioctl(ppp_fd, PPPIOCCONNECT, &ifunit) < 0)
613                 fatal("Couldn't attach to PPP unit %d: %m", ifunit);
614         add_fd(ppp_dev_fd);
615 }
616
617 /*
618  * make_new_bundle - create a new PPP unit (i.e. a bundle)
619  * and connect our channel to it.  This should only get called
620  * if `multilink' was set at the time establish_ppp was called.
621  * In demand mode this uses our existing bundle instead of making
622  * a new one.
623  */
624 void make_new_bundle(int mrru, int mtru, int rssn, int tssn)
625 {
626         if (!new_style_driver)
627                 return;
628
629         /* make us a ppp unit */
630         if (make_ppp_unit() < 0)
631                 die(1);
632
633         /* set the mrru and flags */
634         cfg_bundle(mrru, mtru, rssn, tssn);
635 }
636
637 /*
638  * bundle_attach - attach our link to a given PPP unit.
639  * We assume the unit is controlled by another pppd.
640  */
641 int bundle_attach(int ifnum)
642 {
643         if (!new_style_driver)
644                 return -1;
645
646         if (ioctl(ppp_dev_fd, PPPIOCATTACH, &ifnum) < 0) {
647                 if (errno == ENXIO)
648                         return 0;       /* doesn't still exist */
649                 fatal("Couldn't attach to interface unit %d: %m\n", ifnum);
650         }
651         if (ioctl(ppp_fd, PPPIOCCONNECT, &ifnum) < 0)
652                 fatal("Couldn't connect to interface unit %d: %m", ifnum);
653         set_flags(ppp_dev_fd, get_flags(ppp_dev_fd) | SC_MULTILINK);
654
655         ifunit = ifnum;
656         return 1;
657 }
658
659 /********************************************************************
660  *
661  * clean_check - Fetch the flags for the device and generate
662  * appropriate error messages.
663  */
664 void clean_check(void)
665 {
666     int x;
667     char *s;
668
669     if (still_ppp()) {
670         if (ioctl(ppp_fd, PPPIOCGFLAGS, (caddr_t) &x) == 0) {
671             s = NULL;
672             switch (~x & (SC_RCV_B7_0|SC_RCV_B7_1|SC_RCV_EVNP|SC_RCV_ODDP)) {
673             case SC_RCV_B7_0:
674                 s = "all had bit 7 set to 1";
675                 break;
676                 
677             case SC_RCV_B7_1:
678                 s = "all had bit 7 set to 0";
679                 break;
680                 
681             case SC_RCV_EVNP:
682                 s = "all had odd parity";
683                 break;
684                 
685             case SC_RCV_ODDP:
686                 s = "all had even parity";
687                 break;
688             }
689             
690             if (s != NULL) {
691                 warn("Receive serial link is not 8-bit clean:");
692                 warn("Problem: %s", s);
693             }
694         }
695     }
696 }
697         
698
699 /*
700  * List of valid speeds.
701  */
702
703 struct speed {
704     int speed_int, speed_val;
705 } speeds[] = {
706 #ifdef B50
707     { 50, B50 },
708 #endif
709 #ifdef B75
710     { 75, B75 },
711 #endif
712 #ifdef B110
713     { 110, B110 },
714 #endif
715 #ifdef B134
716     { 134, B134 },
717 #endif
718 #ifdef B150
719     { 150, B150 },
720 #endif
721 #ifdef B200
722     { 200, B200 },
723 #endif
724 #ifdef B300
725     { 300, B300 },
726 #endif
727 #ifdef B600
728     { 600, B600 },
729 #endif
730 #ifdef B1200
731     { 1200, B1200 },
732 #endif
733 #ifdef B1800
734     { 1800, B1800 },
735 #endif
736 #ifdef B2000
737     { 2000, B2000 },
738 #endif
739 #ifdef B2400
740     { 2400, B2400 },
741 #endif
742 #ifdef B3600
743     { 3600, B3600 },
744 #endif
745 #ifdef B4800
746     { 4800, B4800 },
747 #endif
748 #ifdef B7200
749     { 7200, B7200 },
750 #endif
751 #ifdef B9600
752     { 9600, B9600 },
753 #endif
754 #ifdef B19200
755     { 19200, B19200 },
756 #endif
757 #ifdef B38400
758     { 38400, B38400 },
759 #endif
760 #ifdef B57600
761     { 57600, B57600 },
762 #endif
763 #ifdef B76800
764     { 76800, B76800 },
765 #endif
766 #ifdef B115200
767     { 115200, B115200 },
768 #endif
769 #ifdef EXTA
770     { 19200, EXTA },
771 #endif
772 #ifdef EXTB
773     { 38400, EXTB },
774 #endif
775 #ifdef B230400
776     { 230400, B230400 },
777 #endif
778 #ifdef B460800
779     { 460800, B460800 },
780 #endif
781 #ifdef B921600
782     { 921600, B921600 },
783 #endif
784     { 0, 0 }
785 };
786
787 /********************************************************************
788  *
789  * Translate from bits/second to a speed_t.
790  */
791
792 static int translate_speed (int bps)
793 {
794     struct speed *speedp;
795
796     if (bps != 0) {
797         for (speedp = speeds; speedp->speed_int; speedp++) {
798             if (bps == speedp->speed_int)
799                 return speedp->speed_val;
800         }
801         warn("speed %d not supported", bps);
802     }
803     return 0;
804 }
805
806 /********************************************************************
807  *
808  * Translate from a speed_t to bits/second.
809  */
810
811 static int baud_rate_of (int speed)
812 {
813     struct speed *speedp;
814     
815     if (speed != 0) {
816         for (speedp = speeds; speedp->speed_int; speedp++) {
817             if (speed == speedp->speed_val)
818                 return speedp->speed_int;
819         }
820     }
821     return 0;
822 }
823
824 /********************************************************************
825  *
826  * set_up_tty: Set up the serial port on `fd' for 8 bits, no parity,
827  * at the requested speed, etc.  If `local' is true, set CLOCAL
828  * regardless of whether the modem option was specified.
829  */
830
831 void set_up_tty(int tty_fd, int local)
832 {
833     int speed;
834     struct termios tios;
835
836     setdtr(tty_fd, 1);
837     if (tcgetattr(tty_fd, &tios) < 0) {
838         if (!ok_error(errno))
839             fatal("tcgetattr: %m (line %d)", __LINE__);
840         return;
841     }
842     
843     if (!restore_term)
844         inittermios = tios;
845     
846     tios.c_cflag     &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
847     tios.c_cflag     |= CS8 | CREAD | HUPCL;
848
849     tios.c_iflag      = IGNBRK | IGNPAR;
850     tios.c_oflag      = 0;
851     tios.c_lflag      = 0;
852     tios.c_cc[VMIN]   = 1;
853     tios.c_cc[VTIME]  = 0;
854     
855     if (local || !modem)
856         tios.c_cflag ^= (CLOCAL | HUPCL);
857
858     switch (crtscts) {
859     case 1:
860         tios.c_cflag |= CRTSCTS;
861         break;
862
863     case -2:
864         tios.c_iflag     |= IXON | IXOFF;
865         tios.c_cc[VSTOP]  = 0x13;       /* DC3 = XOFF = ^S */
866         tios.c_cc[VSTART] = 0x11;       /* DC1 = XON  = ^Q */
867         break;
868
869     case -1:
870         tios.c_cflag &= ~CRTSCTS;
871         break;
872
873     default:
874         break;
875     }
876     
877     speed = translate_speed(inspeed);
878     if (speed) {
879         cfsetospeed (&tios, speed);
880         cfsetispeed (&tios, speed);
881     }
882 /*
883  * We can't proceed if the serial port speed is B0,
884  * since that implies that the serial port is disabled.
885  */
886     else {
887         speed = cfgetospeed(&tios);
888         if (speed == B0)
889             fatal("Baud rate for %s is 0; need explicit baud rate", devnam);
890     }
891
892     if (tcsetattr(tty_fd, TCSAFLUSH, &tios) < 0)
893         if (!ok_error(errno))
894             fatal("tcsetattr: %m (line %d)", __LINE__);
895     
896     baud_rate    = baud_rate_of(speed);
897     restore_term = 1;
898 }
899
900 /********************************************************************
901  *
902  * setdtr - control the DTR line on the serial port.
903  * This is called from die(), so it shouldn't call die().
904  */
905
906 void setdtr (int tty_fd, int on)
907 {
908     int modembits = TIOCM_DTR;
909
910     ioctl(tty_fd, (on ? TIOCMBIS : TIOCMBIC), &modembits);
911 }
912
913 /********************************************************************
914  *
915  * restore_tty - restore the terminal to the saved settings.
916  */
917
918 void restore_tty (int tty_fd)
919 {
920     if (restore_term) {
921         restore_term = 0;
922 /*
923  * Turn off echoing, because otherwise we can get into
924  * a loop with the tty and the modem echoing to each other.
925  * We presume we are the sole user of this tty device, so
926  * when we close it, it will revert to its defaults anyway.
927  */
928         if (!default_device)
929             inittermios.c_lflag &= ~(ECHO | ECHONL);
930         
931         if (tcsetattr(tty_fd, TCSAFLUSH, &inittermios) < 0) {
932             if (! ok_error (errno))
933                 warn("tcsetattr: %m (line %d)", __LINE__);
934         }
935     }
936 }
937
938 /********************************************************************
939  *
940  * output - Output PPP packet.
941  */
942
943 void output (int unit, unsigned char *p, int len)
944 {
945     int fd = ppp_fd;
946     int proto;
947
948     if (debug)
949         dbglog("sent %P", p, len);
950
951     if (len < PPP_HDRLEN)
952         return;
953     if (new_style_driver) {
954         p += 2;
955         len -= 2;
956         proto = (p[0] << 8) + p[1];
957         if (ifunit >= 0 && !(proto >= 0xc000 || proto == PPP_CCPFRAG))
958             fd = ppp_dev_fd;
959     }
960     if (write(fd, p, len) < 0) {
961         if (errno == EWOULDBLOCK || errno == ENOBUFS
962             || errno == ENXIO || errno == EIO || errno == EINTR)
963             warn("write: warning: %m (%d)", errno);
964         else
965             error("write: %m (%d)", errno);
966     }
967 }
968
969 /********************************************************************
970  *
971  * wait_input - wait until there is data available,
972  * for the length of time specified by *timo (indefinite
973  * if timo is NULL).
974  */
975
976 void wait_input(struct timeval *timo)
977 {
978     fd_set ready, exc;
979     int n;
980
981     ready = in_fds;
982     exc = in_fds;
983     n = select(max_in_fd + 1, &ready, NULL, &exc, timo);
984     if (n < 0 && errno != EINTR)
985         fatal("select: %m");
986 }
987
988 /*
989  * add_fd - add an fd to the set that wait_input waits for.
990  */
991 void add_fd(int fd)
992 {
993     FD_SET(fd, &in_fds);
994     if (fd > max_in_fd)
995         max_in_fd = fd;
996 }
997
998 /*
999  * remove_fd - remove an fd from the set that wait_input waits for.
1000  */
1001 void remove_fd(int fd)
1002 {
1003     FD_CLR(fd, &in_fds);
1004 }
1005
1006
1007 /********************************************************************
1008  *
1009  * read_packet - get a PPP packet from the serial device.
1010  */
1011
1012 int read_packet (unsigned char *buf)
1013 {
1014     int len, nr;
1015
1016     len = PPP_MRU + PPP_HDRLEN;
1017     if (new_style_driver) {
1018         *buf++ = PPP_ALLSTATIONS;
1019         *buf++ = PPP_UI;
1020         len -= 2;
1021     }
1022     nr = -1;
1023     if (ppp_fd >= 0) {
1024         nr = read(ppp_fd, buf, len);
1025         if (nr < 0 && errno != EWOULDBLOCK && errno != EIO && errno != EINTR)
1026             error("read: %m");
1027         if (nr < 0 && errno == ENXIO)
1028             return 0;
1029     }
1030     if (nr < 0 && new_style_driver && ifunit >= 0) {
1031         /* N.B. we read ppp_fd first since LCP packets come in there. */
1032         nr = read(ppp_dev_fd, buf, len);
1033         if (nr < 0 && errno != EWOULDBLOCK && errno != EIO && errno != EINTR)
1034             error("read /dev/ppp: %m");
1035         if (nr < 0 && errno == ENXIO)
1036             return 0;
1037     }
1038     return (new_style_driver && nr > 0)? nr+2: nr;
1039 }
1040
1041 /********************************************************************
1042  *
1043  * get_loop_output - get outgoing packets from the ppp device,
1044  * and detect when we want to bring the real link up.
1045  * Return value is 1 if we need to bring up the link, 0 otherwise.
1046  */
1047 int
1048 get_loop_output(void)
1049 {
1050     int rv = 0;
1051     int n;
1052
1053     if (new_style_driver) {
1054         while ((n = read_packet(inpacket_buf)) > 0)
1055             if (loop_frame(inpacket_buf, n))
1056                 rv = 1;
1057         return rv;
1058     }
1059
1060     while ((n = read(master_fd, inbuf, sizeof(inbuf))) > 0)
1061         if (loop_chars(inbuf, n))
1062             rv = 1;
1063
1064     if (n == 0)
1065         fatal("eof on loopback");
1066
1067     if (errno != EWOULDBLOCK)
1068         fatal("read from loopback: %m(%d)", errno);
1069
1070     return rv;
1071 }
1072
1073 /*
1074  * netif_set_mtu - set the MTU on the PPP network interface.
1075  */
1076 void
1077 netif_set_mtu(int unit, int mtu)
1078 {
1079     struct ifreq ifr;
1080
1081     SYSDEBUG ((LOG_DEBUG, "netif_set_mtu: mtu = %d\n", mtu));
1082
1083     memset (&ifr, '\0', sizeof (ifr));
1084     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
1085     ifr.ifr_mtu = mtu;
1086         
1087     if (ifunit >= 0 && ioctl(sock_fd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
1088         error("ioctl(SIOCSIFMTU): %m (line %d)", __LINE__);
1089 }
1090
1091 /********************************************************************
1092  *
1093  * tty_send_config - configure the transmit characteristics of
1094  * the ppp interface.
1095  */
1096
1097 void tty_send_config (int mtu,u_int32_t asyncmap,int pcomp,int accomp)
1098 {
1099     u_int x;
1100
1101 /*
1102  * Set the asyncmap and other parameters for the ppp device
1103  */
1104     if (!still_ppp())
1105         return;
1106     link_mtu = mtu;
1107     SYSDEBUG ((LOG_DEBUG, "send_config: asyncmap = %lx\n", asyncmap));
1108     if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0) {
1109         if (!ok_error(errno))
1110             fatal("ioctl(PPPIOCSASYNCMAP): %m (line %d)", __LINE__);
1111         return;
1112     }
1113     
1114     x = get_flags(ppp_fd);
1115     x = pcomp  ? x | SC_COMP_PROT : x & ~SC_COMP_PROT;
1116     x = accomp ? x | SC_COMP_AC   : x & ~SC_COMP_AC;
1117     x = sync_serial ? x | SC_SYNC : x & ~SC_SYNC;
1118     set_flags(ppp_fd, x);
1119 }
1120
1121 /********************************************************************
1122  *
1123  * tty_set_xaccm - set the extended transmit ACCM for the interface.
1124  */
1125
1126 void tty_set_xaccm (ext_accm accm)
1127 {
1128     SYSDEBUG ((LOG_DEBUG, "set_xaccm: %08lx %08lx %08lx %08lx\n",
1129                 accm[0], accm[1], accm[2], accm[3]));
1130
1131     if (!still_ppp())
1132         return;
1133     if (ioctl(ppp_fd, PPPIOCSXASYNCMAP, accm) < 0 && errno != ENOTTY) {
1134         if ( ! ok_error (errno))
1135             warn("ioctl(set extended ACCM): %m (line %d)", __LINE__);
1136     }
1137 }
1138
1139 /********************************************************************
1140  *
1141  * tty_recv_config - configure the receive-side characteristics of
1142  * the ppp interface.
1143  */
1144
1145 void tty_recv_config (int mru,u_int32_t asyncmap,int pcomp,int accomp)
1146 {
1147     SYSDEBUG ((LOG_DEBUG, "recv_config: mru = %d\n", mru));
1148 /*
1149  * If we were called because the link has gone down then there is nothing
1150  * which may be done. Just return without incident.
1151  */
1152     if (!still_ppp())
1153         return;
1154 /*
1155  * Set the receiver parameters
1156  */
1157     if (ioctl(ppp_fd, PPPIOCSMRU, (caddr_t) &mru) < 0) {
1158         if ( ! ok_error (errno))
1159             error("ioctl(PPPIOCSMRU): %m (line %d)", __LINE__);
1160     }
1161     if (new_style_driver && ifunit >= 0
1162         && ioctl(ppp_dev_fd, PPPIOCSMRU, (caddr_t) &mru) < 0)
1163         error("Couldn't set MRU in generic PPP layer: %m");
1164
1165     SYSDEBUG ((LOG_DEBUG, "recv_config: asyncmap = %lx\n", asyncmap));
1166     if (ioctl(ppp_fd, PPPIOCSRASYNCMAP, (caddr_t) &asyncmap) < 0) {
1167         if (!ok_error(errno))
1168             error("ioctl(PPPIOCSRASYNCMAP): %m (line %d)", __LINE__);
1169     }
1170 }
1171
1172 /********************************************************************
1173  *
1174  * ccp_test - ask kernel whether a given compression method
1175  * is acceptable for use.
1176  */
1177
1178 int ccp_test (int unit, u_char *opt_ptr, int opt_len, int for_transmit)
1179 {
1180     struct ppp_option_data data;
1181
1182     memset (&data, '\0', sizeof (data));
1183     data.ptr      = opt_ptr;
1184     data.length   = opt_len;
1185     data.transmit = for_transmit;
1186
1187     if (ioctl(ppp_dev_fd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0)
1188         return 1;
1189
1190     return (errno == ENOBUFS)? 0: -1;
1191 }
1192
1193 /********************************************************************
1194  *
1195  * ccp_flags_set - inform kernel about the current state of CCP.
1196  */
1197
1198 void ccp_flags_set (int unit, int isopen, int isup)
1199 {
1200     if (still_ppp() && ifunit >= 0) {
1201         int x = get_flags(ppp_dev_fd);
1202         x = isopen? x | SC_CCP_OPEN : x &~ SC_CCP_OPEN;
1203         x = isup?   x | SC_CCP_UP   : x &~ SC_CCP_UP;
1204         set_flags (ppp_dev_fd, x);
1205     }
1206 }
1207
1208 #ifdef PPP_FILTER
1209 /*
1210  * set_filters - set the active and pass filters in the kernel driver.
1211  */
1212 int set_filters(struct bpf_program *pass, struct bpf_program *active)
1213 {
1214         struct sock_fprog fp;
1215
1216         fp.len = pass->bf_len;
1217         fp.filter = (struct sock_filter *) pass->bf_insns;
1218         if (ioctl(ppp_dev_fd, PPPIOCSPASS, &fp) < 0) {
1219                 if (errno == ENOTTY)
1220                         warn("kernel does not support PPP filtering");
1221                 else
1222                         error("Couldn't set pass-filter in kernel: %m");
1223                 return 0;
1224         }
1225         fp.len = active->bf_len;
1226         fp.filter = (struct sock_filter *) active->bf_insns;
1227         if (ioctl(ppp_dev_fd, PPPIOCSACTIVE, &fp) < 0) {
1228                 error("Couldn't set active-filter in kernel: %m");
1229                 return 0;
1230         }
1231         return 1;
1232 }
1233 #endif /* PPP_FILTER */
1234
1235 /********************************************************************
1236  *
1237  * get_idle_time - return how long the link has been idle.
1238  */
1239 int
1240 get_idle_time(u, ip)
1241     int u;
1242     struct ppp_idle *ip;
1243 {
1244     return ioctl(ppp_dev_fd, PPPIOCGIDLE, ip) >= 0;
1245
1246
1247 /********************************************************************
1248  *
1249  * get_ppp_stats - return statistics for the link.
1250  */
1251 int
1252 get_ppp_stats(u, stats)
1253     int u;
1254     struct pppd_stats *stats;
1255 {
1256     struct ifpppstatsreq req;
1257
1258     memset (&req, 0, sizeof (req));
1259
1260     req.stats_ptr = (caddr_t) &req.stats;
1261     strlcpy(req.ifr__name, ifname, sizeof(req.ifr__name));
1262     if (ioctl(sock_fd, SIOCGPPPSTATS, &req) < 0) {
1263         error("Couldn't get PPP statistics: %m");
1264         return 0;
1265     }
1266     stats->bytes_in = req.stats.p.ppp_ibytes;
1267     stats->bytes_out = req.stats.p.ppp_obytes;
1268     stats->pkts_in = req.stats.p.ppp_ipackets;
1269     stats->pkts_out = req.stats.p.ppp_opackets;
1270     return 1;
1271 }
1272
1273 /********************************************************************
1274  *
1275  * ccp_fatal_error - returns 1 if decompression was disabled as a
1276  * result of an error detected after decompression of a packet,
1277  * 0 otherwise.  This is necessary because of patent nonsense.
1278  */
1279
1280 int ccp_fatal_error (int unit)
1281 {
1282     int x = get_flags(ppp_dev_fd);
1283
1284     return x & SC_DC_FERROR;
1285 }
1286
1287 /********************************************************************
1288  *
1289  * path_to_procfs - find the path to the proc file system mount point
1290  */
1291 static char proc_path[MAXPATHLEN];
1292 static int proc_path_len;
1293
1294 static char *path_to_procfs(const char *tail)
1295 {
1296     struct mntent *mntent;
1297     FILE *fp;
1298
1299     if (proc_path_len == 0) {
1300         /* Default the mount location of /proc */
1301         strlcpy (proc_path, "/proc", sizeof(proc_path));
1302         proc_path_len = 5;
1303         fp = fopen(MOUNTED, "r");
1304         if (fp != NULL) {
1305             while ((mntent = getmntent(fp)) != NULL) {
1306                 if (strcmp(mntent->mnt_type, MNTTYPE_IGNORE) == 0)
1307                     continue;
1308                 if (strcmp(mntent->mnt_type, "proc") == 0) {
1309                     strlcpy(proc_path, mntent->mnt_dir, sizeof(proc_path));
1310                     proc_path_len = strlen(proc_path);
1311                     break;
1312                 }
1313             }
1314             fclose (fp);
1315         }
1316     }
1317
1318     strlcpy(proc_path + proc_path_len, tail,
1319             sizeof(proc_path) - proc_path_len);
1320     return proc_path;
1321 }
1322
1323 /*
1324  * /proc/net/route parsing stuff.
1325  */
1326 #define ROUTE_MAX_COLS  12
1327 FILE *route_fd = (FILE *) 0;
1328 static char route_buffer[512];
1329 static int route_dev_col, route_dest_col, route_gw_col;
1330 static int route_flags_col, route_mask_col;
1331 static int route_num_cols;
1332
1333 static int open_route_table (void);
1334 static void close_route_table (void);
1335 static int read_route_table (struct rtentry *rt);
1336
1337 /********************************************************************
1338  *
1339  * close_route_table - close the interface to the route table
1340  */
1341
1342 static void close_route_table (void)
1343 {
1344     if (route_fd != (FILE *) 0) {
1345         fclose (route_fd);
1346         route_fd = (FILE *) 0;
1347     }
1348 }
1349
1350 /********************************************************************
1351  *
1352  * open_route_table - open the interface to the route table
1353  */
1354 static char route_delims[] = " \t\n";
1355
1356 static int open_route_table (void)
1357 {
1358     char *path;
1359
1360     close_route_table();
1361
1362     path = path_to_procfs("/net/route");
1363     route_fd = fopen (path, "r");
1364     if (route_fd == NULL) {
1365         error("can't open routing table %s: %m", path);
1366         return 0;
1367     }
1368
1369     route_dev_col = 0;          /* default to usual columns */
1370     route_dest_col = 1;
1371     route_gw_col = 2;
1372     route_flags_col = 3;
1373     route_mask_col = 7;
1374     route_num_cols = 8;
1375
1376     /* parse header line */
1377     if (fgets(route_buffer, sizeof(route_buffer), route_fd) != 0) {
1378         char *p = route_buffer, *q;
1379         int col;
1380         for (col = 0; col < ROUTE_MAX_COLS; ++col) {
1381             int used = 1;
1382             if ((q = strtok(p, route_delims)) == 0)
1383                 break;
1384             if (strcasecmp(q, "iface") == 0)
1385                 route_dev_col = col;
1386             else if (strcasecmp(q, "destination") == 0)
1387                 route_dest_col = col;
1388             else if (strcasecmp(q, "gateway") == 0)
1389                 route_gw_col = col;
1390             else if (strcasecmp(q, "flags") == 0)
1391                 route_flags_col = col;
1392             else if (strcasecmp(q, "mask") == 0)
1393                 route_mask_col = col;
1394             else
1395                 used = 0;
1396             if (used && col >= route_num_cols)
1397                 route_num_cols = col + 1;
1398             p = NULL;
1399         }
1400     }
1401
1402     return 1;
1403 }
1404
1405 /********************************************************************
1406  *
1407  * read_route_table - read the next entry from the route table
1408  */
1409
1410 static int read_route_table(struct rtentry *rt)
1411 {
1412     char *cols[ROUTE_MAX_COLS], *p;
1413     int col;
1414         
1415     memset (rt, '\0', sizeof (struct rtentry));
1416
1417     if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0)
1418         return 0;
1419
1420     p = route_buffer;
1421     for (col = 0; col < route_num_cols; ++col) {
1422         cols[col] = strtok(p, route_delims);
1423         if (cols[col] == NULL)
1424             return 0;           /* didn't get enough columns */
1425         p = NULL;
1426     }
1427
1428     SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
1429     SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
1430     SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
1431
1432     rt->rt_flags = (short) strtoul(cols[route_flags_col], NULL, 16);
1433     rt->rt_dev   = cols[route_dev_col];
1434
1435     return 1;
1436 }
1437
1438 /********************************************************************
1439  *
1440  * defaultroute_exists - determine if there is a default route
1441  */
1442
1443 static int defaultroute_exists (struct rtentry *rt)
1444 {
1445     int result = 0;
1446
1447     if (!open_route_table())
1448         return 0;
1449
1450     while (read_route_table(rt) != 0) {
1451         if ((rt->rt_flags & RTF_UP) == 0)
1452             continue;
1453
1454         if (kernel_version > KVERSION(2,1,0) && SIN_ADDR(rt->rt_genmask) != 0)
1455             continue;
1456         if (SIN_ADDR(rt->rt_dst) == 0L) {
1457             result = 1;
1458             break;
1459         }
1460     }
1461
1462     close_route_table();
1463     return result;
1464 }
1465
1466 /*
1467  * have_route_to - determine if the system has any route to
1468  * a given IP address.  `addr' is in network byte order.
1469  * Return value is 1 if yes, 0 if no, -1 if don't know.
1470  * For demand mode to work properly, we have to ignore routes
1471  * through our own interface.
1472  */
1473 int have_route_to(u_int32_t addr)
1474 {
1475     struct rtentry rt;
1476     int result = 0;
1477
1478     if (!open_route_table())
1479         return -1;              /* don't know */
1480
1481     while (read_route_table(&rt)) {
1482         if ((rt.rt_flags & RTF_UP) == 0 || strcmp(rt.rt_dev, ifname) == 0)
1483             continue;
1484         if ((addr & SIN_ADDR(rt.rt_genmask)) == SIN_ADDR(rt.rt_dst)) {
1485             result = 1;
1486             break;
1487         }
1488     }
1489
1490     close_route_table();
1491     return result;
1492 }
1493
1494 /********************************************************************
1495  *
1496  * sifdefaultroute - assign a default route through the address given.
1497  */
1498
1499 int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1500 {
1501     struct rtentry rt;
1502
1503     if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
1504         u_int32_t old_gateway = SIN_ADDR(rt.rt_gateway);
1505
1506         if (old_gateway != gateway)
1507             error("not replacing existing default route to %s [%I]",
1508                   rt.rt_dev, old_gateway);
1509         return 0;
1510     }
1511
1512     memset (&rt, '\0', sizeof (rt));
1513     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
1514     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1515
1516     if (kernel_version > KVERSION(2,1,0)) {
1517         SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1518         SIN_ADDR(rt.rt_genmask) = 0L;
1519     }
1520
1521     SIN_ADDR(rt.rt_gateway) = gateway;
1522     
1523     rt.rt_flags = RTF_UP | RTF_GATEWAY;
1524     if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
1525         if ( ! ok_error ( errno ))
1526             error("default route ioctl(SIOCADDRT): %m");
1527         return 0;
1528     }
1529
1530     default_route_gateway = gateway;
1531     return 1;
1532 }
1533
1534 /********************************************************************
1535  *
1536  * cifdefaultroute - delete a default route through the address given.
1537  */
1538
1539 int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
1540 {
1541     struct rtentry rt;
1542
1543     default_route_gateway = 0;
1544
1545     memset (&rt, '\0', sizeof (rt));
1546     SET_SA_FAMILY (rt.rt_dst,     AF_INET);
1547     SET_SA_FAMILY (rt.rt_gateway, AF_INET);
1548
1549     if (kernel_version > KVERSION(2,1,0)) {
1550         SET_SA_FAMILY (rt.rt_genmask, AF_INET);
1551         SIN_ADDR(rt.rt_genmask) = 0L;
1552     }
1553
1554     SIN_ADDR(rt.rt_gateway) = gateway;
1555     
1556     rt.rt_flags = RTF_UP | RTF_GATEWAY;
1557     if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
1558         if (still_ppp()) {
1559             if ( ! ok_error ( errno ))
1560                 error("default route ioctl(SIOCDELRT): %m");
1561             return 0;
1562         }
1563     }
1564
1565     return 1;
1566 }
1567
1568 /********************************************************************
1569  *
1570  * sifproxyarp - Make a proxy ARP entry for the peer.
1571  */
1572
1573 int sifproxyarp (int unit, u_int32_t his_adr)
1574 {
1575     struct arpreq arpreq;
1576     char *forw_path;
1577
1578     if (has_proxy_arp == 0) {
1579         memset (&arpreq, '\0', sizeof(arpreq));
1580     
1581         SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1582         SIN_ADDR(arpreq.arp_pa) = his_adr;
1583         arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1584 /*
1585  * Get the hardware address of an interface on the same subnet
1586  * as our local address.
1587  */
1588         if (!get_ether_addr(his_adr, &arpreq.arp_ha, proxy_arp_dev,
1589                             sizeof(proxy_arp_dev))) {
1590             error("Cannot determine ethernet address for proxy ARP");
1591             return 0;
1592         }
1593         strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
1594
1595         if (ioctl(sock_fd, SIOCSARP, (caddr_t)&arpreq) < 0) {
1596             if ( ! ok_error ( errno ))
1597                 error("ioctl(SIOCSARP): %m");
1598             return 0;
1599         }
1600         proxy_arp_addr = his_adr;
1601         has_proxy_arp = 1;
1602
1603         if (tune_kernel) {
1604             forw_path = path_to_procfs("/sys/net/ipv4/ip_forward");
1605             if (forw_path != 0) {
1606                 int fd = open(forw_path, O_WRONLY);
1607                 if (fd >= 0) {
1608                     if (write(fd, "1", 1) != 1)
1609                         error("Couldn't enable IP forwarding: %m");
1610                     close(fd);
1611                 }
1612             }
1613         }
1614     }
1615
1616     return 1;
1617 }
1618
1619 /********************************************************************
1620  *
1621  * cifproxyarp - Delete the proxy ARP entry for the peer.
1622  */
1623
1624 int cifproxyarp (int unit, u_int32_t his_adr)
1625 {
1626     struct arpreq arpreq;
1627
1628     if (has_proxy_arp) {
1629         has_proxy_arp = 0;
1630         memset (&arpreq, '\0', sizeof(arpreq));
1631         SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
1632         SIN_ADDR(arpreq.arp_pa) = his_adr;
1633         arpreq.arp_flags = ATF_PERM | ATF_PUBL;
1634         strlcpy(arpreq.arp_dev, proxy_arp_dev, sizeof(arpreq.arp_dev));
1635
1636         if (ioctl(sock_fd, SIOCDARP, (caddr_t)&arpreq) < 0) {
1637             if ( ! ok_error ( errno ))
1638                 warn("ioctl(SIOCDARP): %m");
1639             return 0;
1640         }
1641     }
1642     return 1;
1643 }
1644      
1645 /********************************************************************
1646  *
1647  * get_ether_addr - get the hardware address of an interface on the
1648  * the same subnet as ipaddr.
1649  */
1650
1651 static int get_ether_addr (u_int32_t ipaddr,
1652                            struct sockaddr *hwaddr,
1653                            char *name, int namelen)
1654 {
1655     struct ifreq *ifr, *ifend;
1656     u_int32_t ina, mask;
1657     char *aliasp;
1658     struct ifreq ifreq;
1659     struct ifconf ifc;
1660     struct ifreq ifs[MAX_IFS];
1661     
1662     ifc.ifc_len = sizeof(ifs);
1663     ifc.ifc_req = ifs;
1664     if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1665         if ( ! ok_error ( errno ))
1666             error("ioctl(SIOCGIFCONF): %m (line %d)", __LINE__);
1667         return 0;
1668     }
1669
1670     SYSDEBUG ((LOG_DEBUG, "proxy arp: scanning %d interfaces for IP %s",
1671                 ifc.ifc_len / sizeof(struct ifreq), ip_ntoa(ipaddr)));
1672 /*
1673  * Scan through looking for an interface with an Internet
1674  * address on the same subnet as `ipaddr'.
1675  */
1676     ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq));
1677     for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1678         if (ifr->ifr_addr.sa_family == AF_INET) {
1679             ina = SIN_ADDR(ifr->ifr_addr);
1680             strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1681             SYSDEBUG ((LOG_DEBUG, "proxy arp: examining interface %s",
1682                         ifreq.ifr_name));
1683 /*
1684  * Check that the interface is up, and not point-to-point
1685  * nor loopback.
1686  */
1687             if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1688                 continue;
1689
1690             if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1691                 continue;
1692 /*
1693  * Get its netmask and check that it's on the right subnet.
1694  */
1695             if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1696                 continue;
1697
1698             mask = SIN_ADDR(ifreq.ifr_addr);
1699             SYSDEBUG ((LOG_DEBUG, "proxy arp: interface addr %s mask %lx",
1700                         ip_ntoa(ina), ntohl(mask)));
1701
1702             if (((ipaddr ^ ina) & mask) != 0)
1703                 continue;
1704             break;
1705         }
1706     }
1707     
1708     if (ifr >= ifend)
1709         return 0;
1710
1711     strlcpy(name, ifreq.ifr_name, namelen);
1712
1713     /* trim off the :1 in eth0:1 */
1714     aliasp = strchr(name, ':');
1715     if (aliasp != 0)
1716         *aliasp = 0;
1717
1718     info("found interface %s for proxy arp", name);
1719 /*
1720  * Now get the hardware address.
1721  */
1722     memset (&ifreq.ifr_hwaddr, 0, sizeof (struct sockaddr));
1723     if (ioctl (sock_fd, SIOCGIFHWADDR, &ifreq) < 0) {
1724         error("SIOCGIFHWADDR(%s): %m", ifreq.ifr_name);
1725         return 0;
1726     }
1727
1728     memcpy (hwaddr,
1729             &ifreq.ifr_hwaddr,
1730             sizeof (struct sockaddr));
1731
1732     SYSDEBUG ((LOG_DEBUG,
1733            "proxy arp: found hwaddr %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
1734                 (int) ((unsigned char *) &hwaddr->sa_data)[0],
1735                 (int) ((unsigned char *) &hwaddr->sa_data)[1],
1736                 (int) ((unsigned char *) &hwaddr->sa_data)[2],
1737                 (int) ((unsigned char *) &hwaddr->sa_data)[3],
1738                 (int) ((unsigned char *) &hwaddr->sa_data)[4],
1739                 (int) ((unsigned char *) &hwaddr->sa_data)[5],
1740                 (int) ((unsigned char *) &hwaddr->sa_data)[6],
1741                 (int) ((unsigned char *) &hwaddr->sa_data)[7]));
1742     return 1;
1743 }
1744
1745 /*
1746  * get_if_hwaddr - get the hardware address for the specified
1747  * network interface device.
1748  */
1749 int
1750 get_if_hwaddr(u_char *addr, char *name)
1751 {
1752         struct ifreq ifreq;
1753         int ret, sock_fd;
1754
1755         sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
1756         if (sock_fd < 0)
1757                 return 0;
1758         memset(&ifreq.ifr_hwaddr, 0, sizeof(struct sockaddr));
1759         strlcpy(ifreq.ifr_name, name, sizeof(ifreq.ifr_name));
1760         ret = ioctl(sock_fd, SIOCGIFHWADDR, &ifreq);
1761         close(sock_fd);
1762         if (ret >= 0)
1763                 memcpy(addr, ifreq.ifr_hwaddr.sa_data, 6);
1764         return ret;
1765 }
1766
1767 /*
1768  * get_first_ethernet - return the name of the first ethernet-style
1769  * interface on this system.
1770  */
1771 char *
1772 get_first_ethernet()
1773 {
1774         return "eth0";
1775 }
1776
1777 /********************************************************************
1778  *
1779  * Return user specified netmask, modified by any mask we might determine
1780  * for address `addr' (in network byte order).
1781  * Here we scan through the system's list of interfaces, looking for
1782  * any non-point-to-point interfaces which might appear to be on the same
1783  * network as `addr'.  If we find any, we OR in their netmask to the
1784  * user-specified netmask.
1785  */
1786
1787 u_int32_t GetMask (u_int32_t addr)
1788 {
1789     u_int32_t mask, nmask, ina;
1790     struct ifreq *ifr, *ifend, ifreq;
1791     struct ifconf ifc;
1792     struct ifreq ifs[MAX_IFS];
1793
1794     addr = ntohl(addr);
1795     
1796     if (IN_CLASSA(addr))        /* determine network mask for address class */
1797         nmask = IN_CLASSA_NET;
1798     else if (IN_CLASSB(addr))
1799             nmask = IN_CLASSB_NET;
1800     else
1801             nmask = IN_CLASSC_NET;
1802     
1803     /* class D nets are disallowed by bad_ip_adrs */
1804     mask = netmask | htonl(nmask);
1805 /*
1806  * Scan through the system's network interfaces.
1807  */
1808     ifc.ifc_len = sizeof(ifs);
1809     ifc.ifc_req = ifs;
1810     if (ioctl(sock_fd, SIOCGIFCONF, &ifc) < 0) {
1811         if ( ! ok_error ( errno ))
1812             warn("ioctl(SIOCGIFCONF): %m (line %d)", __LINE__);
1813         return mask;
1814     }
1815     
1816     ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
1817     for (ifr = ifc.ifc_req; ifr < ifend; ifr++) {
1818 /*
1819  * Check the interface's internet address.
1820  */
1821         if (ifr->ifr_addr.sa_family != AF_INET)
1822             continue;
1823         ina = SIN_ADDR(ifr->ifr_addr);
1824         if (((ntohl(ina) ^ addr) & nmask) != 0)
1825             continue;
1826 /*
1827  * Check that the interface is up, and not point-to-point nor loopback.
1828  */
1829         strlcpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
1830         if (ioctl(sock_fd, SIOCGIFFLAGS, &ifreq) < 0)
1831             continue;
1832         
1833         if (((ifreq.ifr_flags ^ FLAGS_GOOD) & FLAGS_MASK) != 0)
1834             continue;
1835 /*
1836  * Get its netmask and OR it into our mask.
1837  */
1838         if (ioctl(sock_fd, SIOCGIFNETMASK, &ifreq) < 0)
1839             continue;
1840         mask |= SIN_ADDR(ifreq.ifr_addr);
1841         break;
1842     }
1843     return mask;
1844 }
1845
1846 /********************************************************************
1847  *
1848  * Internal routine to decode the version.modification.patch level
1849  */
1850
1851 static void decode_version (char *buf, int *version,
1852                             int *modification, int *patch)
1853 {
1854     char *endp;
1855
1856     *version      = (int) strtoul (buf, &endp, 10);
1857     *modification = 0;
1858     *patch        = 0;
1859     
1860     if (endp != buf && *endp == '.') {
1861         buf = endp + 1;
1862         *modification = (int) strtoul (buf, &endp, 10);
1863         if (endp != buf && *endp == '.') {
1864             buf = endp + 1;
1865             *patch = (int) strtoul (buf, &buf, 10);
1866         }
1867     }
1868 }
1869
1870 /********************************************************************
1871  *
1872  * Procedure to determine if the PPP line discipline is registered.
1873  */
1874
1875 static int
1876 ppp_registered(void)
1877 {
1878     int local_fd;
1879     int mfd = -1;
1880     int ret = 0;
1881     char slave[16];
1882
1883     /*
1884      * We used to open the serial device and set it to the ppp line
1885      * discipline here, in order to create a ppp unit.  But that is
1886      * not a good idea - the user might have specified a device that
1887      * they can't open (permission, or maybe it doesn't really exist).
1888      * So we grab a pty master/slave pair and use that.
1889      */
1890     if (!get_pty(&mfd, &local_fd, slave, 0)) {
1891         no_ppp_msg = "Couldn't determine if PPP is supported (no free ptys)";
1892         return 0;
1893     }
1894
1895     /*
1896      * Try to put the device into the PPP discipline.
1897      */
1898     if (ioctl(local_fd, TIOCSETD, &ppp_disc) < 0) {
1899         error("ioctl(TIOCSETD(PPP)): %m (line %d)", __LINE__);
1900     } else
1901         ret = 1;
1902     
1903     close(local_fd);
1904     close(mfd);
1905     return ret;
1906 }
1907
1908 /********************************************************************
1909  *
1910  * ppp_available - check whether the system has any ppp interfaces
1911  * (in fact we check whether we can do an ioctl on ppp0).
1912  */
1913
1914 int ppp_available(void)
1915 {
1916     int s, ok, fd;
1917     struct ifreq ifr;
1918     int    size;
1919     int    my_version, my_modification, my_patch;
1920     int osmaj, osmin, ospatch;
1921
1922     no_ppp_msg = 
1923         "This system lacks kernel support for PPP.  This could be because\n"
1924         "the PPP kernel module could not be loaded, or because PPP was not\n"
1925         "included in the kernel configuration.  If PPP was included as a\n"
1926         "module, try `/sbin/modprobe -v ppp'.  If that fails, check that\n"
1927         "ppp.o exists in /lib/modules/`uname -r`/net.\n"
1928         "See README.linux file in the ppp distribution for more details.\n";
1929
1930     /* get the kernel version now, since we are called before sys_init */
1931     uname(&utsname);
1932     osmaj = osmin = ospatch = 0;
1933     sscanf(utsname.release, "%d.%d.%d", &osmaj, &osmin, &ospatch);
1934     kernel_version = KVERSION(osmaj, osmin, ospatch);
1935
1936     fd = open("/dev/ppp", O_RDWR);
1937 #if 0
1938     if (fd < 0 && errno == ENOENT) {
1939         /* try making it and see if that helps. */
1940         if (mknod("/dev/ppp", S_IFCHR | S_IRUSR | S_IWUSR,
1941                   makedev(108, 0)) >= 0) {
1942             fd = open("/dev/ppp", O_RDWR);
1943             if (fd >= 0)
1944                 info("Created /dev/ppp device node");
1945             else
1946                 unlink("/dev/ppp");     /* didn't work, undo the mknod */
1947         } else if (errno == EEXIST) {
1948             fd = open("/dev/ppp", O_RDWR);
1949         }
1950     }
1951 #endif /* 0 */
1952     if (fd >= 0) {
1953         new_style_driver = 1;
1954
1955         /* XXX should get from driver */
1956         driver_version = 2;
1957         driver_modification = 4;
1958         driver_patch = 0;
1959         close(fd);
1960         return 1;
1961     }
1962     if (kernel_version >= KVERSION(2,3,13)) {
1963         if (errno == ENOENT)
1964             no_ppp_msg =
1965                 "pppd is unable to open the /dev/ppp device.\n"
1966                 "You need to create the /dev/ppp device node by\n"
1967                 "executing the following command as root:\n"
1968                 "       mknod /dev/ppp c 108 0\n";
1969         return 0;
1970     }
1971
1972 /*
1973  * Open a socket for doing the ioctl operations.
1974  */    
1975     s = socket(AF_INET, SOCK_DGRAM, 0);
1976     if (s < 0)
1977         return 0;
1978     
1979     strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
1980     ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
1981 /*
1982  * If the device did not exist then attempt to create one by putting the
1983  * current tty into the PPP discipline. If this works then obtain the
1984  * flags for the device again.
1985  */
1986     if (!ok) {
1987         if (ppp_registered()) {
1988             strlcpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name));
1989             ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0;
1990         }
1991     }
1992 /*
1993  * Ensure that the hardware address is for PPP and not something else
1994  */
1995     if (ok)
1996         ok = ioctl (s, SIOCGIFHWADDR, (caddr_t) &ifr) >= 0;
1997
1998     if (ok && ((ifr.ifr_hwaddr.sa_family & ~0xFF) != ARPHRD_PPP))
1999         ok = 0;
2000
2001 /*
2002  *  This is the PPP device. Validate the version of the driver at this
2003  *  point to ensure that this program will work with the driver.
2004  */
2005     if (ok) {
2006         char   abBuffer [1024];
2007
2008         ifr.ifr_data = abBuffer;
2009         size = ioctl (s, SIOCGPPPVER, (caddr_t) &ifr);
2010         if (size < 0) {
2011             error("Couldn't read driver version: %m");
2012             ok = 0;
2013             no_ppp_msg = "Sorry, couldn't verify kernel driver version\n";
2014
2015         } else {
2016             decode_version(abBuffer,
2017                            &driver_version,
2018                            &driver_modification,
2019                            &driver_patch);
2020 /*
2021  * Validate the version of the driver against the version that we used.
2022  */
2023             decode_version(VERSION,
2024                            &my_version,
2025                            &my_modification,
2026                            &my_patch);
2027
2028             /* The version numbers must match */
2029             if (driver_version != my_version)
2030                 ok = 0;
2031       
2032             /* The modification levels must be legal */
2033             if (driver_modification < 3) {
2034                 if (driver_modification >= 2) {
2035                     /* we can cope with 2.2.0 and above */
2036                     driver_is_old = 1;
2037                 } else {
2038                     ok = 0;
2039                 }
2040             }
2041
2042             close (s);
2043             if (!ok) {
2044                 slprintf(route_buffer, sizeof(route_buffer),
2045                          "Sorry - PPP driver version %d.%d.%d is out of date\n",
2046                          driver_version, driver_modification, driver_patch);
2047
2048                 no_ppp_msg = route_buffer;
2049             }
2050         }
2051     }
2052     return ok;
2053 }
2054
2055 /********************************************************************
2056  *
2057  * Update the wtmp file with the appropriate user name and tty device.
2058  */
2059
2060 void logwtmp (const char *line, const char *name, const char *host)
2061 {
2062     struct utmp ut, *utp;
2063     pid_t  mypid = getpid();
2064 #if __GLIBC__ < 2
2065     int    wtmp;
2066 #endif
2067
2068 /*
2069  * Update the signon database for users.
2070  * Christoph Lameter: Copied from poeigl-1.36 Jan 3, 1996
2071  */
2072     utmpname(_PATH_UTMP);
2073     setutent();
2074     while ((utp = getutent()) && (utp->ut_pid != mypid))
2075         /* nothing */;
2076
2077     /* Is this call really necessary? There is another one after the 'put' */
2078     endutent();
2079     
2080     if (utp)
2081         memcpy(&ut, utp, sizeof(ut));
2082     else
2083         /* some gettys/telnetds don't initialize utmp... */
2084         memset(&ut, 0, sizeof(ut));
2085
2086     if (ut.ut_id[0] == 0)
2087         strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
2088         
2089     strncpy(ut.ut_user, name, sizeof(ut.ut_user));
2090     strncpy(ut.ut_line, line, sizeof(ut.ut_line));
2091
2092     time(&ut.ut_time);
2093
2094     ut.ut_type = USER_PROCESS;
2095     ut.ut_pid  = mypid;
2096
2097     /* Insert the host name if one is supplied */
2098     if (*host)
2099         strncpy (ut.ut_host, host, sizeof(ut.ut_host));
2100
2101     /* Insert the IP address of the remote system if IP is enabled */
2102     if (ipcp_protent.enabled_flag && ipcp_hisoptions[0].neg_addr)
2103         memcpy(&ut.ut_addr, (char *) &ipcp_hisoptions[0].hisaddr,
2104                  sizeof(ut.ut_addr));
2105         
2106     /* CL: Makes sure that the logout works */
2107     if (*host == 0 && *name==0)
2108         ut.ut_host[0]=0;
2109
2110     pututline(&ut);
2111     endutent();
2112 /*
2113  * Update the wtmp file.
2114  */
2115 #if __GLIBC__ >= 2
2116     updwtmp(_PATH_WTMP, &ut);
2117 #else
2118     wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY);
2119     if (wtmp >= 0) {
2120         flock(wtmp, LOCK_EX);
2121
2122         if (write (wtmp, (char *)&ut, sizeof(ut)) != sizeof(ut))
2123             warn("error writing %s: %m", _PATH_WTMP);
2124
2125         flock(wtmp, LOCK_UN);
2126
2127         close (wtmp);
2128     }
2129 #endif
2130 }
2131
2132
2133 /********************************************************************
2134  *
2135  * sifvjcomp - config tcp header compression
2136  */
2137
2138 int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid)
2139 {
2140     u_int x = get_flags(ppp_dev_fd);
2141
2142     if (vjcomp) {
2143         if (ioctl (ppp_dev_fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) {
2144             if (! ok_error (errno))
2145                 error("ioctl(PPPIOCSMAXCID): %m (line %d)", __LINE__);
2146             vjcomp = 0;
2147         }
2148     }
2149
2150     x = vjcomp  ? x | SC_COMP_TCP     : x &~ SC_COMP_TCP;
2151     x = cidcomp ? x & ~SC_NO_TCP_CCID : x | SC_NO_TCP_CCID;
2152     set_flags (ppp_dev_fd, x);
2153
2154     return 1;
2155 }
2156
2157 /********************************************************************
2158  *
2159  * sifup - Config the interface up and enable IP packets to pass.
2160  */
2161
2162 int sifup(int u)
2163 {
2164     struct ifreq ifr;
2165
2166     memset (&ifr, '\0', sizeof (ifr));
2167     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2168     if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
2169         if (! ok_error (errno))
2170             error("ioctl (SIOCGIFFLAGS): %m (line %d)", __LINE__);
2171         return 0;
2172     }
2173
2174     ifr.ifr_flags |= (IFF_UP | IFF_POINTOPOINT);
2175     if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
2176         if (! ok_error (errno))
2177             error("ioctl(SIOCSIFFLAGS): %m (line %d)", __LINE__);
2178         return 0;
2179     }
2180     if_is_up++;
2181
2182     return 1;
2183 }
2184
2185 /********************************************************************
2186  *
2187  * sifdown - Disable the indicated protocol and config the interface
2188  *           down if there are no remaining protocols.
2189  */
2190
2191 int sifdown (int u)
2192 {
2193     struct ifreq ifr;
2194
2195     if (if_is_up && --if_is_up > 0)
2196         return 1;
2197
2198     memset (&ifr, '\0', sizeof (ifr));
2199     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2200     if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
2201         if (! ok_error (errno))
2202             error("ioctl (SIOCGIFFLAGS): %m (line %d)", __LINE__);
2203         return 0;
2204     }
2205
2206     ifr.ifr_flags &= ~IFF_UP;
2207     ifr.ifr_flags |= IFF_POINTOPOINT;
2208     if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
2209         if (! ok_error (errno))
2210             error("ioctl(SIOCSIFFLAGS): %m (line %d)", __LINE__);
2211         return 0;
2212     }
2213     return 1;
2214 }
2215
2216 /********************************************************************
2217  *
2218  * sifaddr - Config the interface IP addresses and netmask.
2219  */
2220
2221 int sifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr,
2222              u_int32_t net_mask)
2223 {
2224     struct ifreq   ifr; 
2225     struct rtentry rt;
2226     
2227     memset (&ifr, '\0', sizeof (ifr));
2228     memset (&rt,  '\0', sizeof (rt));
2229     
2230     SET_SA_FAMILY (ifr.ifr_addr,    AF_INET); 
2231     SET_SA_FAMILY (ifr.ifr_dstaddr, AF_INET); 
2232     SET_SA_FAMILY (ifr.ifr_netmask, AF_INET); 
2233
2234     strlcpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
2235 /*
2236  *  Set our IP address
2237  */
2238     SIN_ADDR(ifr.ifr_addr) = our_adr;
2239     if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2240         if (errno != EEXIST) {
2241             if (! ok_error (errno))
2242                 error("ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
2243         }
2244         else {
2245             warn("ioctl(SIOCSIFADDR): Address already exists");
2246         }
2247         return (0);
2248     }
2249 /*
2250  *  Set the gateway address
2251  */
2252     SIN_ADDR(ifr.ifr_dstaddr) = his_adr;
2253     if (ioctl(sock_fd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) {
2254         if (! ok_error (errno))
2255             error("ioctl(SIOCSIFDSTADDR): %m (line %d)", __LINE__); 
2256         return (0);
2257     } 
2258 /*
2259  *  Set the netmask.
2260  *  For recent kernels, force the netmask to 255.255.255.255.
2261  */
2262     if (kernel_version >= KVERSION(2,1,16))
2263         net_mask = ~0L;
2264     if (net_mask != 0) {
2265         SIN_ADDR(ifr.ifr_netmask) = net_mask;
2266         if (ioctl(sock_fd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) {
2267             if (! ok_error (errno))
2268                 error("ioctl(SIOCSIFNETMASK): %m (line %d)", __LINE__); 
2269             return (0);
2270         } 
2271     }
2272 /*
2273  *  Add the device route
2274  */
2275     if (kernel_version < KVERSION(2,1,16)) {
2276         SET_SA_FAMILY (rt.rt_dst,     AF_INET);
2277         SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2278         rt.rt_dev = ifname;
2279
2280         SIN_ADDR(rt.rt_gateway) = 0L;
2281         SIN_ADDR(rt.rt_dst)     = his_adr;
2282         rt.rt_flags = RTF_UP | RTF_HOST;
2283
2284         if (kernel_version > KVERSION(2,1,0)) {
2285             SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2286             SIN_ADDR(rt.rt_genmask) = -1L;
2287         }
2288
2289         if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
2290             if (! ok_error (errno))
2291                 error("ioctl(SIOCADDRT) device route: %m (line %d)", __LINE__);
2292             return (0);
2293         }
2294     }
2295
2296     /* set ip_dynaddr in demand mode if address changes */
2297     if (demand && tune_kernel && !dynaddr_set
2298         && our_old_addr && our_old_addr != our_adr) {
2299         /* set ip_dynaddr if possible */
2300         char *path;
2301         int fd;
2302
2303         path = path_to_procfs("/sys/net/ipv4/ip_dynaddr");
2304         if (path != 0 && (fd = open(path, O_WRONLY)) >= 0) {
2305             if (write(fd, "1", 1) != 1)
2306                 error("Couldn't enable dynamic IP addressing: %m");
2307             close(fd);
2308         }
2309         dynaddr_set = 1;        /* only 1 attempt */
2310     }
2311     our_old_addr = 0;
2312
2313     return 1;
2314 }
2315
2316 /********************************************************************
2317  *
2318  * cifaddr - Clear the interface IP addresses, and delete routes
2319  * through the interface if possible.
2320  */
2321
2322 int cifaddr (int unit, u_int32_t our_adr, u_int32_t his_adr)
2323 {
2324     struct ifreq ifr;
2325
2326     if (kernel_version < KVERSION(2,1,16)) {
2327 /*
2328  *  Delete the route through the device
2329  */
2330         struct rtentry rt;
2331         memset (&rt, '\0', sizeof (rt));
2332
2333         SET_SA_FAMILY (rt.rt_dst,     AF_INET);
2334         SET_SA_FAMILY (rt.rt_gateway, AF_INET);
2335         rt.rt_dev = ifname;
2336
2337         SIN_ADDR(rt.rt_gateway) = 0;
2338         SIN_ADDR(rt.rt_dst)     = his_adr;
2339         rt.rt_flags = RTF_UP | RTF_HOST;
2340
2341         if (kernel_version > KVERSION(2,1,0)) {
2342             SET_SA_FAMILY (rt.rt_genmask, AF_INET);
2343             SIN_ADDR(rt.rt_genmask) = -1L;
2344         }
2345
2346         if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
2347             if (still_ppp() && ! ok_error (errno))
2348                 error("ioctl(SIOCDELRT) device route: %m (line %d)", __LINE__);
2349             return (0);
2350         }
2351     }
2352
2353     /* This way it is possible to have an IPX-only or IPv6-only interface */
2354     memset(&ifr, 0, sizeof(ifr));
2355     SET_SA_FAMILY(ifr.ifr_addr, AF_INET);
2356     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2357     
2358     if (ioctl(sock_fd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2359         if (! ok_error (errno)) {
2360             error("ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
2361             return 0;
2362         }
2363     }
2364
2365     our_old_addr = our_adr;
2366
2367     return 1;
2368 }
2369
2370 #ifdef INET6
2371 /********************************************************************
2372  * 
2373  * sif6addr - Config the interface with an IPv6 link-local address
2374  */
2375 int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
2376 {
2377     struct in6_ifreq ifr6;
2378     struct ifreq ifr;
2379     struct in6_rtmsg rt6;
2380
2381     if (sock6_fd < 0) {
2382         errno = -sock6_fd;
2383         error("IPv6 socket creation failed: %m");
2384         return 0;
2385     }
2386     memset(&ifr, 0, sizeof (ifr));
2387     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2388     if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
2389         error("sif6addr: ioctl(SIOCGIFINDEX): %m (line %d)", __LINE__);
2390         return 0;
2391     }
2392     
2393     /* Local interface */
2394     memset(&ifr6, 0, sizeof(ifr6));
2395     IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
2396     ifr6.ifr6_ifindex = ifr.ifr_ifindex;
2397     ifr6.ifr6_prefixlen = 10;
2398
2399     if (ioctl(sock6_fd, SIOCSIFADDR, &ifr6) < 0) {
2400         error("sif6addr: ioctl(SIOCSIFADDR): %m (line %d)", __LINE__);
2401         return 0;
2402     }
2403     
2404     /* Route to remote host */
2405     memset(&rt6, 0, sizeof(rt6));
2406     IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
2407     rt6.rtmsg_flags = RTF_UP;
2408     rt6.rtmsg_dst_len = 10;
2409     rt6.rtmsg_ifindex = ifr.ifr_ifindex;
2410     rt6.rtmsg_metric = 1;
2411     
2412     if (ioctl(sock6_fd, SIOCADDRT, &rt6) < 0) {
2413         error("sif6addr: ioctl(SIOCADDRT): %m (line %d)", __LINE__);
2414         return 0;
2415     }
2416
2417     return 1;
2418 }
2419
2420
2421 /********************************************************************
2422  *
2423  * cif6addr - Remove IPv6 address from interface
2424  */
2425 int cif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
2426 {
2427     struct ifreq ifr;
2428     struct in6_ifreq ifr6;
2429
2430     if (sock6_fd < 0) {
2431         errno = -sock6_fd;
2432         error("IPv6 socket creation failed: %m");
2433         return 0;
2434     }
2435     memset(&ifr, 0, sizeof(ifr));
2436     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2437     if (ioctl(sock6_fd, SIOCGIFINDEX, (caddr_t) &ifr) < 0) {
2438         error("cif6addr: ioctl(SIOCGIFINDEX): %m (line %d)", __LINE__);
2439         return 0;
2440     }
2441     
2442     memset(&ifr6, 0, sizeof(ifr6));
2443     IN6_LLADDR_FROM_EUI64(ifr6.ifr6_addr, our_eui64);
2444     ifr6.ifr6_ifindex = ifr.ifr_ifindex;
2445     ifr6.ifr6_prefixlen = 10;
2446
2447     if (ioctl(sock6_fd, SIOCDIFADDR, &ifr6) < 0) {
2448         if (errno != EADDRNOTAVAIL) {
2449             if (! ok_error (errno))
2450                 error("cif6addr: ioctl(SIOCDIFADDR): %m (line %d)", __LINE__);
2451         }
2452         else {
2453             warn("cif6addr: ioctl(SIOCDIFADDR): No such address");
2454         }
2455         return (0);
2456     }
2457     return 1;
2458 }
2459 #endif /* INET6 */
2460
2461 /*
2462  * get_pty - get a pty master/slave pair and chown the slave side
2463  * to the uid given.  Assumes slave_name points to >= 16 bytes of space.
2464  */
2465 int
2466 get_pty(master_fdp, slave_fdp, slave_name, uid)
2467     int *master_fdp;
2468     int *slave_fdp;
2469     char *slave_name;
2470     int uid;
2471 {
2472     int i, mfd, sfd = -1;
2473     char pty_name[16];
2474     struct termios tios;
2475
2476 #ifdef TIOCGPTN
2477     /*
2478      * Try the unix98 way first.
2479      */
2480     mfd = open("/dev/ptmx", O_RDWR);
2481     if (mfd >= 0) {
2482         int ptn;
2483         if (ioctl(mfd, TIOCGPTN, &ptn) >= 0) {
2484             slprintf(pty_name, sizeof(pty_name), "/dev/pts/%d", ptn);
2485             chmod(pty_name, S_IRUSR | S_IWUSR);
2486 #ifdef TIOCSPTLCK
2487             ptn = 0;
2488             if (ioctl(mfd, TIOCSPTLCK, &ptn) < 0)
2489                 warn("Couldn't unlock pty slave %s: %m", pty_name);
2490 #endif
2491             if ((sfd = open(pty_name, O_RDWR | O_NOCTTY)) < 0)
2492                 warn("Couldn't open pty slave %s: %m", pty_name);
2493         }
2494     }
2495 #endif /* TIOCGPTN */
2496
2497     if (sfd < 0) {
2498         /* the old way - scan through the pty name space */
2499         for (i = 0; i < 64; ++i) {
2500             slprintf(pty_name, sizeof(pty_name), "/dev/pty%c%x",
2501                      'p' + i / 16, i % 16);
2502             mfd = open(pty_name, O_RDWR, 0);
2503             if (mfd >= 0) {
2504                 pty_name[5] = 't';
2505                 sfd = open(pty_name, O_RDWR | O_NOCTTY, 0);
2506                 if (sfd >= 0) {
2507                     fchown(sfd, uid, -1);
2508                     fchmod(sfd, S_IRUSR | S_IWUSR);
2509                     break;
2510                 }
2511                 close(mfd);
2512             }
2513         }
2514     }
2515
2516     if (sfd < 0)
2517         return 0;
2518
2519     strlcpy(slave_name, pty_name, 16);
2520     *master_fdp = mfd;
2521     *slave_fdp = sfd;
2522     if (tcgetattr(sfd, &tios) == 0) {
2523         tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB);
2524         tios.c_cflag |= CS8 | CREAD | CLOCAL;
2525         tios.c_iflag  = IGNPAR;
2526         tios.c_oflag  = 0;
2527         tios.c_lflag  = 0;
2528         if (tcsetattr(sfd, TCSAFLUSH, &tios) < 0)
2529             warn("couldn't set attributes on pty: %m");
2530     } else
2531         warn("couldn't get attributes on pty: %m");
2532
2533     return 1;
2534 }
2535
2536 /********************************************************************
2537  *
2538  * open_loopback - open the device we use for getting packets
2539  * in demand mode.  Under Linux, we use a pty master/slave pair.
2540  */
2541 int
2542 open_ppp_loopback(void)
2543 {
2544     int flags;
2545
2546     looped = 1;
2547     if (new_style_driver) {
2548         /* allocate ourselves a ppp unit */
2549         if (make_ppp_unit() < 0)
2550             die(1);
2551         set_flags(ppp_dev_fd, SC_LOOP_TRAFFIC);
2552         set_kdebugflag(kdebugflag);
2553         ppp_fd = -1;
2554         return ppp_dev_fd;
2555     }
2556
2557     if (!get_pty(&master_fd, &slave_fd, loop_name, 0))
2558         fatal("No free pty for loopback");
2559     SYSDEBUG(("using %s for loopback", loop_name));
2560
2561     set_ppp_fd(slave_fd);
2562
2563     flags = fcntl(master_fd, F_GETFL);
2564     if (flags == -1 ||
2565         fcntl(master_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2566         warn("couldn't set master loopback to nonblock: %m");
2567
2568     flags = fcntl(ppp_fd, F_GETFL);
2569     if (flags == -1 ||
2570         fcntl(ppp_fd, F_SETFL, flags | O_NONBLOCK) == -1)
2571         warn("couldn't set slave loopback to nonblock: %m");
2572
2573     if (ioctl(ppp_fd, TIOCSETD, &ppp_disc) < 0)
2574         fatal("ioctl(TIOCSETD): %m (line %d)", __LINE__);
2575 /*
2576  * Find out which interface we were given.
2577  */
2578     if (ioctl(ppp_fd, PPPIOCGUNIT, &ifunit) < 0)
2579         fatal("ioctl(PPPIOCGUNIT): %m (line %d)", __LINE__);
2580 /*
2581  * Enable debug in the driver if requested.
2582  */
2583     set_kdebugflag (kdebugflag);
2584
2585     return master_fd;
2586 }
2587
2588 /********************************************************************
2589  *
2590  * sifnpmode - Set the mode for handling packets for a given NP.
2591  */
2592
2593 int
2594 sifnpmode(u, proto, mode)
2595     int u;
2596     int proto;
2597     enum NPmode mode;
2598 {
2599     struct npioctl npi;
2600
2601     npi.protocol = proto;
2602     npi.mode     = mode;
2603     if (ioctl(ppp_dev_fd, PPPIOCSNPMODE, (caddr_t) &npi) < 0) {
2604         if (! ok_error (errno))
2605             error("ioctl(PPPIOCSNPMODE, %d, %d): %m", proto, mode);
2606         return 0;
2607     }
2608     return 1;
2609 }
2610
2611 \f
2612 /********************************************************************
2613  *
2614  * sipxfaddr - Config the interface IPX networknumber
2615  */
2616
2617 int sipxfaddr (int unit, unsigned long int network, unsigned char * node )
2618 {
2619     int    result = 1;
2620
2621 #ifdef IPX_CHANGE
2622     int    skfd; 
2623     struct ifreq         ifr;
2624     struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2625
2626     skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2627     if (skfd < 0) { 
2628         if (! ok_error (errno))
2629             dbglog("socket(AF_IPX): %m (line %d)", __LINE__);
2630         result = 0;
2631     }
2632     else {
2633         memset (&ifr, '\0', sizeof (ifr));
2634         strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2635
2636         memcpy (sipx->sipx_node, node, IPX_NODE_LEN);
2637         sipx->sipx_family  = AF_IPX;
2638         sipx->sipx_port    = 0;
2639         sipx->sipx_network = htonl (network);
2640         sipx->sipx_type    = IPX_FRAME_ETHERII;
2641         sipx->sipx_action  = IPX_CRTITF;
2642 /*
2643  *  Set the IPX device
2644  */
2645         if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2646             result = 0;
2647             if (errno != EEXIST) {
2648                 if (! ok_error (errno))
2649                     dbglog("ioctl(SIOCSIFADDR, CRTITF): %m (line %d)", __LINE__);
2650             }
2651             else {
2652                 warn("ioctl(SIOCSIFADDR, CRTITF): Address already exists");
2653             }
2654         }
2655         close (skfd);
2656     }
2657 #endif
2658     return result;
2659 }
2660
2661 /********************************************************************
2662  *
2663  * cipxfaddr - Clear the information for the IPX network. The IPX routes
2664  *             are removed and the device is no longer able to pass IPX
2665  *             frames.
2666  */
2667
2668 int cipxfaddr (int unit)
2669 {
2670     int    result = 1;
2671
2672 #ifdef IPX_CHANGE
2673     int    skfd; 
2674     struct ifreq         ifr;
2675     struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) &ifr.ifr_addr;
2676
2677     skfd = socket (AF_IPX, SOCK_DGRAM, 0);
2678     if (skfd < 0) { 
2679         if (! ok_error (errno))
2680             dbglog("socket(AF_IPX): %m (line %d)", __LINE__);
2681         result = 0;
2682     }
2683     else {
2684         memset (&ifr, '\0', sizeof (ifr));
2685         strlcpy (ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
2686
2687         sipx->sipx_type    = IPX_FRAME_ETHERII;
2688         sipx->sipx_action  = IPX_DLTITF;
2689         sipx->sipx_family  = AF_IPX;
2690 /*
2691  *  Set the IPX device
2692  */
2693         if (ioctl(skfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) {
2694             if (! ok_error (errno))
2695                 info("ioctl(SIOCSIFADDR, IPX_DLTITF): %m (line %d)", __LINE__);
2696             result = 0;
2697         }
2698         close (skfd);
2699     }
2700 #endif
2701     return result;
2702 }
2703
2704 /*
2705  * Use the hostname as part of the random number seed.
2706  */
2707 int
2708 get_host_seed()
2709 {
2710     int h;
2711     char *p = hostname;
2712
2713     h = 407;
2714     for (p = hostname; *p != 0; ++p)
2715         h = h * 37 + *p;
2716     return h;
2717 }
2718
2719 /********************************************************************
2720  *
2721  * sys_check_options - check the options that the user specified
2722  */
2723
2724 int
2725 sys_check_options(void)
2726 {
2727 #ifdef IPX_CHANGE
2728 /*
2729  * Disable the IPX protocol if the support is not present in the kernel.
2730  */
2731     char *path;
2732
2733     if (ipxcp_protent.enabled_flag) {
2734         struct stat stat_buf;
2735         if ((path = path_to_procfs("/net/ipx_interface")) == 0
2736             || lstat(path, &stat_buf) < 0) {
2737             error("IPX support is not present in the kernel\n");
2738             ipxcp_protent.enabled_flag = 0;
2739         }
2740     }
2741 #endif
2742     if (demand && driver_is_old) {
2743         option_error("demand dialling is not supported by kernel driver "
2744                      "version %d.%d.%d", driver_version, driver_modification,
2745                      driver_patch);
2746         return 0;
2747     }
2748     if (multilink && !new_style_driver) {
2749         warn("Warning: multilink is not supported by the kernel driver");
2750         multilink = 0;
2751     }
2752     return 1;
2753 }