Added missing IF index check
This commit is contained in:
parent
24f9394f64
commit
04640eb629
20
src/conn.go
20
src/conn.go
|
@ -5,9 +5,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func updateUDPConn(device *Device) error {
|
func updateUDPConn(device *Device) error {
|
||||||
var err error
|
|
||||||
netc := &device.net
|
netc := &device.net
|
||||||
netc.mutex.Lock()
|
netc.mutex.Lock()
|
||||||
|
defer netc.mutex.Unlock()
|
||||||
|
|
||||||
// close existing connection
|
// close existing connection
|
||||||
|
|
||||||
|
@ -18,15 +18,23 @@ func updateUDPConn(device *Device) error {
|
||||||
// open new connection
|
// open new connection
|
||||||
|
|
||||||
if device.tun.isUp.Get() {
|
if device.tun.isUp.Get() {
|
||||||
|
|
||||||
|
// listen on new address
|
||||||
|
|
||||||
conn, err := net.ListenUDP("udp", netc.addr)
|
conn, err := net.ListenUDP("udp", netc.addr)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
netc.conn = conn
|
return err
|
||||||
signalSend(device.signal.newUDPConn)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// retrieve port (may have been chosen by kernel)
|
||||||
|
|
||||||
|
addr := conn.LocalAddr()
|
||||||
|
netc.conn = conn
|
||||||
|
netc.addr, _ = net.ResolveUDPAddr(addr.Network(), addr.String())
|
||||||
|
signalSend(device.signal.newUDPConn)
|
||||||
}
|
}
|
||||||
|
|
||||||
netc.mutex.Unlock()
|
return nil
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func closeUDPConn(device *Device) {
|
func closeUDPConn(device *Device) {
|
||||||
|
|
|
@ -196,15 +196,19 @@ func (device *Device) RoutineTUNEventReader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if event&TUNEventUp != 0 {
|
if event&TUNEventUp != 0 {
|
||||||
device.tun.isUp.Set(true)
|
if !device.tun.isUp.Get() {
|
||||||
updateUDPConn(device)
|
device.tun.isUp.Set(true)
|
||||||
logInfo.Println("Interface set up")
|
updateUDPConn(device)
|
||||||
|
logInfo.Println("Interface set up")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if event&TUNEventDown != 0 {
|
if event&TUNEventDown != 0 {
|
||||||
device.tun.isUp.Set(false)
|
if device.tun.isUp.Get() {
|
||||||
closeUDPConn(device)
|
device.tun.isUp.Set(false)
|
||||||
logInfo.Println("Interface set down")
|
closeUDPConn(device)
|
||||||
|
logInfo.Println("Interface set down")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,10 +50,10 @@ const (
|
||||||
|
|
||||||
type NativeTun struct {
|
type NativeTun struct {
|
||||||
fd *os.File
|
fd *os.File
|
||||||
index int
|
index int32 // if index
|
||||||
name string
|
name string // name of interface
|
||||||
errors chan error // async error handling
|
errors chan error // async error handling
|
||||||
events chan TUNEvent //
|
events chan TUNEvent // device related events
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tun *NativeTun) RoutineNetlinkListener() {
|
func (tun *NativeTun) RoutineNetlinkListener() {
|
||||||
|
@ -86,6 +86,11 @@ func (tun *NativeTun) RoutineNetlinkListener() {
|
||||||
case unix.RTM_NEWLINK:
|
case unix.RTM_NEWLINK:
|
||||||
info := *(*unix.IfInfomsg)(unsafe.Pointer(&remain[unix.SizeofNlMsghdr]))
|
info := *(*unix.IfInfomsg)(unsafe.Pointer(&remain[unix.SizeofNlMsghdr]))
|
||||||
|
|
||||||
|
if info.Index != tun.index {
|
||||||
|
// not our interface
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if info.Flags&unix.IFF_RUNNING != 0 {
|
if info.Flags&unix.IFF_RUNNING != 0 {
|
||||||
tun.events <- TUNEventUp
|
tun.events <- TUNEventUp
|
||||||
}
|
}
|
||||||
|
@ -112,12 +117,12 @@ func (tun *NativeTun) Name() string {
|
||||||
return tun.name
|
return tun.name
|
||||||
}
|
}
|
||||||
|
|
||||||
func toInt32(val []byte) int {
|
func toInt32(val []byte) int32 {
|
||||||
n := binary.LittleEndian.Uint32(val[:4])
|
n := binary.LittleEndian.Uint32(val[:4])
|
||||||
if n >= (1 << 31) {
|
if n >= (1 << 31) {
|
||||||
return int(n-(1<<31)) - (1 << 31)
|
return -int32(^n) - 1
|
||||||
}
|
}
|
||||||
return int(n)
|
return int32(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDummySock() (int, error) {
|
func getDummySock() (int, error) {
|
||||||
|
@ -128,7 +133,7 @@ func getDummySock() (int, error) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIFIndex(name string) (int, error) {
|
func getIFIndex(name string) (int32, error) {
|
||||||
fd, err := getDummySock()
|
fd, err := getDummySock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -288,7 +293,7 @@ func CreateTUN(name string) (TUNDevice, error) {
|
||||||
errors: make(chan error, 5),
|
errors: make(chan error, 5),
|
||||||
}
|
}
|
||||||
|
|
||||||
// fetch IF index
|
// start event listener
|
||||||
|
|
||||||
device.index, err = getIFIndex(device.name)
|
device.index, err = getIFIndex(device.name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -299,7 +304,5 @@ func CreateTUN(name string) (TUNDevice, error) {
|
||||||
|
|
||||||
// set default MTU
|
// set default MTU
|
||||||
|
|
||||||
fmt.Println(device)
|
|
||||||
|
|
||||||
return device, device.setMTU(DefaultMTU)
|
return device, device.setMTU(DefaultMTU)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue