aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tun.h
blob: 8fa1c613c3800cf21ee639ed80dd9621e8b74a9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* 
 * TUN interface functions.
 * Copyright (C) 2002, 2003 Mondru AB.
 * Copyright (C) 2017 by Harald Welte <laforge@gnumonks.org>
 * 
 * The contents of this file may be used under the terms of the GNU
 * General Public License Version 2, provided that the above copyright
 * notice and this permission notice is included in all copies or
 * substantial portions of the software.
 * 
 */

#ifndef _TUN_H
#define _TUN_H

#include <net/if.h>

#include "../lib/in46_addr.h"

#define PACKET_MAX      8196	/* Maximum packet size we receive */
#define TUN_SCRIPTSIZE   256
#define TUN_ADDRSIZE     128
#define TUN_NLBUFSIZE   1024

#include "config.h"
#ifndef HAVE_IPHDR
struct iphdr
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ihl:4;
    unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
    unsigned int version:4;
    unsigned int ihl:4;
#else
# error	"Please fix <bits/endian.h>"
#endif
    u_int8_t tos;
    u_int16_t tot_len;
    u_int16_t id;
    u_int16_t frag_off;
    u_int8_t ttl;
    u_int8_t protocol;
    u_int16_t check;
    u_int32_t saddr;
    u_int32_t daddr;
    /*The options start here. */
  };
#endif /* !HAVE_IPHDR */

/* ***********************************************************
 * Information storage for each tun instance
 *************************************************************/

struct tun_t {
	int fd;			/* File descriptor to tun interface */
	struct in_addr addr;
	struct in_addr dstaddr;
	struct in_addr netmask;
	int addrs;		/* Number of allocated IP addresses */
	int routes;		/* One if we allocated an automatic route */
	char devname[IFNAMSIZ];	/* Name of the tun device */
	int (*cb_ind) (struct tun_t * tun, void *pack, unsigned len);
};

extern int tun_new(struct tun_t **tun);
extern int tun_free(struct tun_t *tun);
extern int tun_decaps(struct tun_t *this);
extern int tun_encaps(struct tun_t *tun, void *pack, unsigned len);

extern int tun_addaddr(struct tun_t *this, struct in_addr *addr,
		       struct in_addr *dstaddr, struct in_addr *netmask);

extern int tun_setaddr(struct tun_t *this, struct in46_addr *our_adr,
		       struct in46_addr *his_adr, size_t prefixlen);

int tun_addroute(struct tun_t *this, struct in_addr *dst,
		 struct in_addr *gateway, struct in_addr *mask);

extern int tun_set_cb_ind(struct tun_t *this,
			  int (*cb_ind) (struct tun_t * tun, void *pack,
					 unsigned len));

extern int tun_runscript(struct tun_t *tun, char *script);

#endif /* !_TUN_H */