From f0956ae742c9df4bf165a56264d27f21975e884e Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 28 Dec 2021 16:18:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20router?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gold/head/packet.go | 1 + gold/link/crypto.go | 11 +++++++++-- gold/link/router.go | 12 +++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gold/head/packet.go b/gold/head/packet.go index 620e7fa..d67dc2a 100644 --- a/gold/head/packet.go +++ b/gold/head/packet.go @@ -62,6 +62,7 @@ func (p *Packet) FillHash() { p.Hash = *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum))) } +// IsVaildHash 验证 packet 合法性 func (p *Packet) IsVaildHash() bool { sum := blake2b.New256().Sum(p.Data) return *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum))) == p.Hash diff --git a/gold/link/crypto.go b/gold/link/crypto.go index 489840a..6394d71 100644 --- a/gold/link/crypto.go +++ b/gold/link/crypto.go @@ -17,6 +17,8 @@ type Me struct { privKey [32]byte // 本机虚拟 ip me net.IP + // 本机子网 + subnet net.IPNet // 本机 endpoint myend *net.UDPAddr // 本机活跃的所有连接 @@ -30,14 +32,19 @@ type Me struct { } // NewMe 设置本机参数 -func NewMe(privateKey *[32]byte, myIP string, myEndpoint string) (m Me) { +func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string) (m Me) { m.privKey = *privateKey var err error m.myend, err = net.ResolveUDPAddr("udp", myEndpoint) if err != nil { panic(err) } - m.me = net.ParseIP(myIP) + ip, cidr, err := net.ParseCIDR(myipwithmask) + if err != nil { + panic(err) + } + m.me = ip + m.subnet = *cidr m.myconn, err = m.listen() if err != nil { panic(err) diff --git a/gold/link/router.go b/gold/link/router.go index e1eb3ad..9bdbce3 100644 --- a/gold/link/router.go +++ b/gold/link/router.go @@ -1,6 +1,7 @@ package link import ( + "encoding/binary" "net" "sync" @@ -26,7 +27,7 @@ func (l *Link) Accept(ip net.IP) bool { // IsToMe 判断是否是发给自己的包 func (l *Link) IsToMe(ip net.IP) bool { - return ip.Equal(l.me.me) + return ip.Equal(l.me.me) || ip.Equal(net.IPv4bcast) || isSubnetBcast(ip, &l.me.subnet) } // SetDefault 设置默认网关 @@ -69,3 +70,12 @@ func (r *Router) SetItem(ip *net.IPNet, l *Link) { } r.mu.Unlock() } + +func isSubnetBcast(ip net.IP, subnet *net.IPNet) bool { + if !subnet.Contains(ip) { + return false + } + maskr := make(net.IPMask, 4) + binary.LittleEndian.PutUint32(maskr[:], ^binary.LittleEndian.Uint32(subnet.Mask)) + return ip.Mask(maskr).Equal(net.IP(maskr)) +}