-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathifconfig_freebsd.go
151 lines (121 loc) · 3.68 KB
/
ifconfig_freebsd.go
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package ifconfig
/*
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "ifconfig.h"
*/
import "C"
import (
"fmt"
"net"
"syscall"
"unsafe"
)
// Initializes AF_INET and AF_INET6 control sockets that are required by many of the C functions
func init() {
if res := C.set_fd(syscall.AF_INET); res != 0 {
panic(fmt.Sprintln("set_fd(AF_INET) failed:", syscall.Errno(res)))
}
if res := C.set_fd(syscall.AF_INET6); res != 0 {
panic(fmt.Sprintln("set_fd(AF_INET6) failed:", syscall.Errno(res)))
}
}
func GetDrvSpec(ifname string, cmd C.ulong, data unsafe.Pointer, len uintptr) error {
name := C.CString(ifname)
defer C.free(unsafe.Pointer(name))
return retval(C.get_drv_spec(name, cmd, data, C.size_t(len)))
}
func SetDrvSpec(ifname string, cmd C.ulong, data unsafe.Pointer, len uintptr) error {
name := C.CString(ifname)
defer C.free(unsafe.Pointer(name))
return retval(C.set_drv_spec(name, cmd, data, C.size_t(len)))
}
func Clone(name string, data unsafe.Pointer) (string, error) {
var ifname [C.IFNAMSIZ]C.char
for i, c := range name {
ifname[i] = C.char(c)
}
err := C.if_clone(&ifname[0], data)
if err != 0 {
return "", syscall.Errno(err)
} else {
return C.GoString(&ifname[0]), nil
}
}
func GetMTU(ifname string) (uint16, error) {
c_ifname := C.CString(ifname)
defer C.free(unsafe.Pointer(c_ifname))
var mtu C.int
if err := C.get_mtu(c_ifname, &mtu); err != 0 {
return 0, syscall.Errno(err)
} else {
return uint16(mtu), nil
}
}
func SetMTU(ifname string, mtu uint16) error {
c_ifname := C.CString(ifname)
defer C.free(unsafe.Pointer(c_ifname))
return retval(C.set_mtu(c_ifname, C.int(mtu)))
}
func GetDescr(ifname string) (string, error) {
var c_descr [64]C.char
c_ifname := C.CString(ifname)
defer C.free(unsafe.Pointer(c_ifname))
if err := C.get_descr(c_ifname, &c_descr[0], C.size_t(len(c_descr))); err != 0 {
return "", syscall.Errno(err)
} else {
return C.GoString(&c_descr[0]), nil
}
}
func SetDescr(ifname string, descr string) error {
c_ifname := C.CString(ifname)
c_descr := C.CString(descr)
defer C.free(unsafe.Pointer(c_ifname))
defer C.free(unsafe.Pointer(c_descr))
return retval(C.set_descr(c_ifname, c_descr))
}
func Destroy(name string) error {
var ifname [C.IFNAMSIZ]C.char
for i, c := range name {
ifname[i] = C.char(c)
}
return retval(C.if_destroy(&ifname[0]))
}
func SetAddr(ifname string, addr net.IP, prefixlen uint8) (err error) {
var res C.int
name := C.CString(ifname)
defer C.free(unsafe.Pointer(name))
if IsIPv4(addr) {
addr_sa := (*C.struct_sockaddr_in)(unsafe.Pointer(Sockaddr(addr)))
netmask := net.IP(net.CIDRMask(int(prefixlen), 32))
netmask_sa := (*C.struct_sockaddr_in)(unsafe.Pointer(Sockaddr(netmask)))
res = C.set_addr4(name, addr_sa, netmask_sa)
} else {
addr_sa := (*C.struct_sockaddr_in6)(unsafe.Pointer(Sockaddr(addr)))
res = C.add_addr6(name, addr_sa, C.uint8_t(prefixlen))
}
return retval(res)
}
func RemoveAddr4(ifname string) (err error) {
name := C.CString(ifname)
defer C.free(unsafe.Pointer(name))
return retval(C.remove_addr4(name))
}
func SetAddrPTP(ifname string, addr, dstaddr net.IP) (err error) {
var res C.int
name := C.CString(ifname)
defer C.free(unsafe.Pointer(name))
if IsIPv4(addr) {
C.remove_addr4(name)
addr_sa := (*C.struct_sockaddr_in)(unsafe.Pointer(Sockaddr(addr)))
dstaddr_sa := (*C.struct_sockaddr_in)(unsafe.Pointer(Sockaddr(dstaddr)))
res = C.add_addr4_ptp(name, addr_sa, dstaddr_sa)
} else {
addr_sa := (*C.struct_sockaddr_in6)(unsafe.Pointer(Sockaddr(addr)))
dstaddr_sa := (*C.struct_sockaddr_in6)(unsafe.Pointer(Sockaddr(dstaddr)))
C.remove_addr6(name, addr_sa)
res = C.add_addr6_ptp(name, addr_sa, dstaddr_sa)
}
return retval(res)
}