1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/*-
2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * All rights reserved.
4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in source and binary forms, with or without
6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * modification, are permitted provided that the following conditions
7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * are met:
8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 1. Redistributions of source code must retain the above copyright
9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    notice, this list of conditions and the following disclaimer.
10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 2. Redistributions in binary form must reproduce the above copyright
11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    notice, this list of conditions and the following disclaimer in the
12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    documentation and/or other materials provided with the distribution.
13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * SUCH DAMAGE.
25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/tun.c,v 1.28.40.1 2010/12/21 17:10:29 kensmith Exp $
27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */
28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/param.h>
30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/socket.h>		/* For IFF_ defines */
32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef __FreeBSD__
33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <net/if.h>		/* For IFF_ defines */
34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <net/route.h>
36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/in.h>
37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <net/if_types.h>
38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <net/if_tun.h>
39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/in_systm.h>
40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/ip.h>
41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/un.h>
42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <errno.h>
44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <string.h>
45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#if defined(__OpenBSD__) || defined(__NetBSD__)
46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/ioctl.h>
47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdio.h>
49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <termios.h>
50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef __NetBSD__
51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <unistd.h>
52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "layer.h"
55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "mbuf.h"
56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "log.h"
57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "id.h"
58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "timer.h"
59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "lqr.h"
60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "hdlc.h"
61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "defs.h"
62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "fsm.h"
63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "throughput.h"
64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "iplist.h"
65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "slcompress.h"
66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ncpaddr.h"
67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ipcp.h"
68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "filter.h"
69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "descriptor.h"
70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "lcp.h"
71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ccp.h"
72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "link.h"
73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "mp.h"
74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "iface.h"
75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NORADIUS
76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "radius.h"
77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ipv6cp.h"
79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ncp.h"
80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "bundle.h"
81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "tun.h"
82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehtun_configure(struct bundle *bundle)
85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef __NetBSD__
87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct ifreq ifr;
88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  int s;
89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  s = socket(PF_INET, SOCK_DGRAM, 0);
91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (s < 0) {
93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    log_Printf(LogERROR, "tun_configure: socket(): %s\n", strerror(errno));
94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return;
95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  sprintf(ifr.ifr_name, "tun%d", bundle->unit);
98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  ifr.ifr_mtu = bundle->iface->mtu;
99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (ioctl(s, SIOCSIFMTU, &ifr) < 0)
100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(LogERROR, "tun_configure: ioctl(SIOCSIFMTU): %s\n",
101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh             strerror(errno));
102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  close(s);
104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#else
105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct tuninfo info;
106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  memset(&info, '\0', sizeof info);
108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  info.type = IFT_PPP;
109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  info.mtu = bundle->iface->mtu;
110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  info.baudrate = bundle->bandwidth;
112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifdef __OpenBSD__
113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  info.flags = IFF_UP|IFF_POINTOPOINT|IFF_MULTICAST;
114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (ID0ioctl(bundle->dev.fd, TUNSIFINFO, &info) < 0)
116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    log_Printf(LogERROR, "tun_configure: ioctl(TUNSIFINFO): %s\n",
117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	      strerror(errno));
118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif
119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
120