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