mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-23 03:50:32 +08:00
完善 router
This commit is contained in:
@@ -62,6 +62,7 @@ func (p *Packet) FillHash() {
|
|||||||
p.Hash = *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum)))
|
p.Hash = *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsVaildHash 验证 packet 合法性
|
||||||
func (p *Packet) IsVaildHash() bool {
|
func (p *Packet) IsVaildHash() bool {
|
||||||
sum := blake2b.New256().Sum(p.Data)
|
sum := blake2b.New256().Sum(p.Data)
|
||||||
return *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum))) == p.Hash
|
return *(*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&sum))) == p.Hash
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ type Me struct {
|
|||||||
privKey [32]byte
|
privKey [32]byte
|
||||||
// 本机虚拟 ip
|
// 本机虚拟 ip
|
||||||
me net.IP
|
me net.IP
|
||||||
|
// 本机子网
|
||||||
|
subnet net.IPNet
|
||||||
// 本机 endpoint
|
// 本机 endpoint
|
||||||
myend *net.UDPAddr
|
myend *net.UDPAddr
|
||||||
// 本机活跃的所有连接
|
// 本机活跃的所有连接
|
||||||
@@ -30,14 +32,19 @@ type Me struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewMe 设置本机参数
|
// 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
|
m.privKey = *privateKey
|
||||||
var err error
|
var err error
|
||||||
m.myend, err = net.ResolveUDPAddr("udp", myEndpoint)
|
m.myend, err = net.ResolveUDPAddr("udp", myEndpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
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()
|
m.myconn, err = m.listen()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package link
|
package link
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/binary"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ func (l *Link) Accept(ip net.IP) bool {
|
|||||||
|
|
||||||
// IsToMe 判断是否是发给自己的包
|
// IsToMe 判断是否是发给自己的包
|
||||||
func (l *Link) IsToMe(ip net.IP) bool {
|
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 设置默认网关
|
// SetDefault 设置默认网关
|
||||||
@@ -69,3 +70,12 @@ func (r *Router) SetItem(ip *net.IPNet, l *Link) {
|
|||||||
}
|
}
|
||||||
r.mu.Unlock()
|
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))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user