1c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams/*
2c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams * Use of this source code is governed by a BSD-style license that can be
4c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams * found in the LICENSE file.
5c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams */
6c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
7c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <errno.h>
8c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <fcntl.h>
9c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <stdio.h>
10c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <stdlib.h>
11c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <string.h>
12c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <unistd.h>
13c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
14c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <sys/stat.h>
15c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <sys/types.h>
16c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
17c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <sys/ioctl.h>
18c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <sys/socket.h>
19c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
20c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <linux/if.h>
21c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams#include <linux/if_tun.h>
22c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
23c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williamsstatic int
24c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williamstun_alloc(char *dev)
25c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams{
26c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  struct ifreq ifr;
27c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  int fd, err;
28c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
29c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  if ((fd = open ("/dev/net/tun", O_RDWR)) < 0) {
30c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    printf ("Error opening /dev/net/tun: %s\n", strerror (errno));
31c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    return -1;
32c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  }
33c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
34c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  memset (&ifr, 0, sizeof (ifr));
35c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
36c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  /* Flags: IFF_TUN   - TUN device (no Ethernet headers)
37c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams   *        IFF_TAP   - TAP device
38c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams   *
39c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams   *        IFF_NO_PI - Do not provide packet information
40c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams   */
41c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  ifr.ifr_flags = IFF_TAP;
42c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  if (*dev)
43c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    strncpy (ifr.ifr_name, dev, IFNAMSIZ);
44c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
45c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  if ((err = ioctl (fd, TUNSETIFF, (void *) &ifr)) < 0) {
46c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    printf ("Error calling TUNSETIFF: %s\n", strerror (errno));
47c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    close (fd);
48c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    return err;
49c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  }
50c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  strncpy (dev, ifr.ifr_name, IFNAMSIZ);
51c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  return fd;
52c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams}
53c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
54c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williamsint
55c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williamsmain (int argc, const char *argv[])
56c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams{
57c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
58c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  int fd;
59c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  char namebuf[IFNAMSIZ];
60c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
61c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  strcpy (namebuf, "pseudo-modem%d");
62c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  fd = tun_alloc (namebuf);
63c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  if (fd == -1)
64c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    exit (1);
65c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
66c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  printf ("%s\n", namebuf);
67c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  fflush(stdout);
68c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
69c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  while (1)
70c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams    sleep (3600);
71c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams
72c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams  return 0;
73c2a8f8b5d56157355034375dae1b29df78e1d357Nathan Williams}
74