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