-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgre.c
124 lines (94 loc) · 1.77 KB
/
gre.c
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// gre.c
// gre
//
// Created by Zhenlei Huang.
//
//
#include <mach/mach_types.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include "gre_locks.h"
#include "gre_ip_encap.h"
#include "if_gre.h"
#include "gre_ipfilter.h"
static int gre_init;
kern_return_t
gre_start(kmod_info_t *ki, void *data)
{
#ifdef DEBUG
printf("%s ...\n", __FUNCTION__);
#endif
if (gre_init)
goto success;
if (gre_locks_init() != 0)
goto failed;
if (gre_encap_init())
goto failed;
if (gre_proto_register() != 0)
goto error;
if (gre_if_init() != 0)
goto error;
if (gre_ip4filter_init() != 0)
goto error;
if (gre_ip6filter_init() != 0)
goto error;
/* add first gre interface */
gre_if_attach();
gre_init = 1;
success:
#ifdef DEBUG
printf("%s: done\n", __FUNCTION__);
#endif
return KERN_SUCCESS;
error:
gre_ip6filter_dispose();
gre_ip4filter_dispose();
gre_if_dispose();
gre_proto_unregister();
gre_encap_dispose();
gre_locks_dispose();
failed:
#ifdef DEBUG
printf("%s: fail\n", __FUNCTION__);
#endif
return KERN_FAILURE;
}
kern_return_t
gre_stop(kmod_info_t *ki, void *data)
{
#ifdef DEBUG
printf("%s ...\n", __FUNCTION__);
#endif
if (!gre_init)
goto success;
if (gre_ip6filter_dispose()) {
printf("gre: gre_ip6filter_dispose error\n");
goto failed;
}
if (gre_ip4filter_dispose()) {
printf("gre: gre_ip4filter_dispose error\n");
goto failed;
}
if (gre_if_dispose()) {
printf("gre: gre_dispose error\n");
goto failed;
}
gre_proto_unregister();
if (gre_encap_dispose()) {
printf("gre: gre_encap_dispose error\n");
goto failed;
}
gre_locks_dispose();
gre_init = 0;
success:
#ifdef DEBUG
printf("%s: done\n", __FUNCTION__);
#endif
return KERN_SUCCESS;
failed:
#ifdef DEBUG
printf("%s: fail\n", __FUNCTION__);
#endif
return KERN_FAILURE;
}