implement IP primitives in proto buffer

This commit is contained in:
mykola2312 2025-01-18 16:40:01 +02:00
parent 7999d56959
commit 7c5410441a
2 changed files with 56 additions and 18 deletions

View file

@ -1,9 +1,7 @@
package node package node
import ( import (
"fmt"
"lux/proto" "lux/proto"
"net/netip"
ipnet "net" ipnet "net"
) )
@ -48,25 +46,10 @@ func (sync *LuxNodeSync) Read(rd *proto.LuxBuffer) error {
return err return err
} }
ipOctets, err := rd.ReadVarBlock() addrPort, err := rd.ReadIPPort()
if err != nil { if err != nil {
return err return err
} }
portNum, err := rd.ReadUint16()
if err != nil {
return err
}
// TODO: move this to proto
var addrPort netip.AddrPort
switch len(ipOctets) {
case ipnet.IPv4len:
addrPort = netip.AddrPortFrom(netip.AddrFrom4([4]byte(ipOctets)), portNum)
case ipnet.IPv6len:
addrPort = netip.AddrPortFrom(netip.AddrFrom16([16]byte(ipOctets)), portNum)
default:
return fmt.Errorf("received wrong sized neighbor ip len %d", len(ipOctets))
}
sync.Neighbors[id] = ipnet.UDPAddrFromAddrPort(addrPort) sync.Neighbors[id] = ipnet.UDPAddrFromAddrPort(addrPort)
} }

View file

@ -3,6 +3,8 @@ package proto
import ( import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"net"
"net/netip"
) )
var NO = binary.BigEndian var NO = binary.BigEndian
@ -191,3 +193,56 @@ func (buf *LuxBuffer) ReadString() (string, error) {
func (buf *LuxBuffer) WriteString(val string) { func (buf *LuxBuffer) WriteString(val string) {
buf.WriteVarBlock([]byte(val)) buf.WriteVarBlock([]byte(val))
} }
func (buf *LuxBuffer) ReadIP() (netip.Addr, error) {
var addr netip.Addr
ipOctets, err := buf.ReadVarBlock()
if err != nil {
return addr, err
}
switch len(ipOctets) {
case net.IPv4len:
addr = netip.AddrFrom4([4]byte(ipOctets))
case net.IPv6len:
addr = netip.AddrFrom16([16]byte(ipOctets))
default:
return addr, fmt.Errorf("wrong ip size %d", len(ipOctets))
}
return addr, nil
}
func (buf *LuxBuffer) WriteIP(addr netip.Addr) {
if addr.Is4() {
octets := addr.As4()
buf.WriteVarBlock(octets[:])
} else if addr.Is6() {
octets := addr.As16()
buf.WriteVarBlock(octets[:])
} else {
panic("WriteIP addr is neither IPv4 nor IPv6")
}
}
func (buf *LuxBuffer) ReadIPPort() (netip.AddrPort, error) {
var addrPort netip.AddrPort
addr, err := buf.ReadIP()
if err != nil {
return addrPort, err
}
portNum, err := buf.ReadUint16()
if err != nil {
return addrPort, err
}
return netip.AddrPortFrom(addr, portNum), nil
}
func (buf *LuxBuffer) WriteIPPort(addrPort netip.AddrPort) {
buf.WriteIP(addrPort.Addr())
buf.WriteUint16(addrPort.Port())
}