Fix up fwmark handling
This commit is contained in:
parent
47a21c8bb0
commit
c545d63bb9
|
@ -6,6 +6,6 @@ import (
|
|||
"net"
|
||||
)
|
||||
|
||||
func setMark(conn *net.UDPConn, value int) error {
|
||||
func setMark(conn *net.UDPConn, value uint32) error {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -5,8 +5,8 @@ import (
|
|||
"net"
|
||||
)
|
||||
|
||||
func setMark(conn *net.UDPConn, value int) error {
|
||||
if conn == nil || value == 0 {
|
||||
func setMark(conn *net.UDPConn, value uint32) error {
|
||||
if conn == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,6 @@ func setMark(conn *net.UDPConn, value int) error {
|
|||
int(file.Fd()),
|
||||
unix.SOL_SOCKET,
|
||||
unix.SO_MARK,
|
||||
value,
|
||||
int(value),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ type Device struct {
|
|||
mutex sync.RWMutex
|
||||
addr *net.UDPAddr // UDP source address
|
||||
conn *net.UDPConn // UDP "connection"
|
||||
fwmark int
|
||||
fwmark uint32
|
||||
}
|
||||
mutex sync.RWMutex
|
||||
privateKey NoisePrivateKey
|
||||
|
|
40
src/uapi.go
40
src/uapi.go
|
@ -42,6 +42,9 @@ func ipcGetOperation(device *Device, socket *bufio.ReadWriter) *IPCError {
|
|||
if device.net.addr != nil {
|
||||
send(fmt.Sprintf("listen_port=%d", device.net.addr.Port))
|
||||
}
|
||||
if device.net.fwmark != 0 {
|
||||
send(fmt.Sprintf("fwmark=%d", device.net.fwmark))
|
||||
}
|
||||
|
||||
for _, peer := range device.peers {
|
||||
func() {
|
||||
|
@ -158,25 +161,32 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError {
|
|||
// TODO: Clear source address of all peers
|
||||
|
||||
case "fwmark":
|
||||
fwmark, err := strconv.ParseInt(value, 10, 32)
|
||||
if err != nil {
|
||||
logError.Println("Invalid fwmark", err)
|
||||
return &IPCError{Code: ipcErrorInvalid}
|
||||
var fwmark uint64 = 0
|
||||
if value != "" {
|
||||
var err error
|
||||
fwmark, err = strconv.ParseUint(value, 10, 32)
|
||||
if err != nil {
|
||||
logError.Println("Invalid fwmark", err)
|
||||
return &IPCError{Code: ipcErrorInvalid}
|
||||
}
|
||||
}
|
||||
|
||||
device.net.mutex.Lock()
|
||||
device.net.fwmark = int(fwmark)
|
||||
err = setMark(
|
||||
device.net.conn,
|
||||
device.net.fwmark,
|
||||
)
|
||||
device.net.mutex.Unlock()
|
||||
if err != nil {
|
||||
logError.Println("Failed to set fwmark:", err)
|
||||
return &IPCError{Code: ipcErrorIO}
|
||||
}
|
||||
if fwmark > 0 || device.net.fwmark > 0 {
|
||||
device.net.fwmark = uint32(fwmark)
|
||||
err := setMark(
|
||||
device.net.conn,
|
||||
device.net.fwmark,
|
||||
)
|
||||
if err != nil {
|
||||
logError.Println("Failed to set fwmark:", err)
|
||||
device.net.mutex.Unlock()
|
||||
return &IPCError{Code: ipcErrorIO}
|
||||
}
|
||||
|
||||
// TODO: Clear source address of all peers
|
||||
// TODO: Clear source address of all peers
|
||||
}
|
||||
device.net.mutex.Unlock()
|
||||
|
||||
case "public_key":
|
||||
|
||||
|
|
Loading…
Reference in a new issue