package main import ( "net" ) func updateUDPConn(device *Device) error { netc := &device.net netc.mutex.Lock() defer netc.mutex.Unlock() // close existing connection if netc.conn != nil { netc.conn.Close() netc.conn = nil } // open new connection if device.tun.isUp.Get() { // listen on new address conn, err := net.ListenUDP("udp", netc.addr) if err != nil { return err } // set fwmark err = setMark(netc.conn, netc.fwmark) if err != nil { return err } // retrieve port (may have been chosen by kernel) addr := conn.LocalAddr() netc.conn = conn netc.addr, _ = net.ResolveUDPAddr( addr.Network(), addr.String(), ) // notify goroutines signalSend(device.signal.newUDPConn) } return nil } func closeUDPConn(device *Device) { netc := &device.net netc.mutex.Lock() if netc.conn != nil { netc.conn.Close() } netc.mutex.Unlock() signalSend(device.signal.newUDPConn) }