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 New Issue
	
	Block a user