From 7cb3ef6488323ec216c726b6e975c5f9e04d3ce4 Mon Sep 17 00:00:00 2001 From: fumiama Date: Mon, 25 Oct 2021 21:35:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B7=AF=E7=94=B1=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gold/head/nat.go | 4 ++-- gold/link/listen.go | 4 ++-- gold/link/nat.go | 15 +++++++++++++-- gold/link/peer.go | 3 ++- gold/link/router.go | 12 +++++++++++- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/gold/head/nat.go b/gold/head/nat.go index 9f10424..2aedf8c 100644 --- a/gold/head/nat.go +++ b/gold/head/nat.go @@ -1,7 +1,7 @@ package head // Notify 是 map[peerip]endpoint -type Notify map[string]string +type Notify = map[string]string // Query 是 peerips 组成的数组 -type Query []string +type Query = []string diff --git a/gold/link/listen.go b/gold/link/listen.go index 34c3554..997fbec 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -54,10 +54,10 @@ func listen() (conn *net.UDPConn, err error) { } case head.ProtoNotify: logrus.Infoln("[link] recv notify") - onNotify(&packet) + p.onNotify(&packet) case head.ProtoQuery: logrus.Infoln("[link] recv query") - onQuery(&packet) + p.onQuery(&packet) case head.ProtoData: logrus.Infoln("[link] deliver to", p.peerip) p.pipe <- &packet diff --git a/gold/link/nat.go b/gold/link/nat.go index 590d15a..2302713 100644 --- a/gold/link/nat.go +++ b/gold/link/nat.go @@ -24,11 +24,22 @@ func (l *Link) keepAlive() { } // 收到询问包的处理函数 -func onQuery(packet *head.Packet) { +func (l *Link) onQuery(packet *head.Packet) { // TODO: 完成data解包与notify分发 + // 1. Data 解包 + // ---- 使用 head.Query 解释 packet.Data + // ---- 根据 Query 确定需要封装的 Notify + // 2. notify分发 + // ---- 封装 Notify 到 新的 packet.Data + // ---- 调用 l.Send 发送到对方 } // 收到通告包的处理函数 -func onNotify(packet *head.Packet) { +func (l *Link) onNotify(packet *head.Packet) { // TODO: 完成data解包与endpoint注册 + // 1. Data 解包 + // ---- 使用 head.Notify 解释 packet.Data + // 2. endpoint注册 + // ---- 遍历 Notify,注册对方的 endpoint 到 + // ---- connections,注意使用读写锁connmapmu } diff --git a/gold/link/peer.go b/gold/link/peer.go index 51c83c3..d0d7885 100644 --- a/gold/link/peer.go +++ b/gold/link/peer.go @@ -42,8 +42,9 @@ func AddPeer(peerip string, pubicKey *[32]byte, endPoint string, allowedIPs []st l.allowedips = make([]*net.IPNet, len(allowedIPs)) for _, ipnet := range allowedIPs { _, cidr, err := net.ParseCIDR(ipnet) - if err != nil { + if err == nil { l.allowedips = append(l.allowedips, cidr) + routetable[cidr.String()] = append(routetable[cidr.String()], l) } } } diff --git a/gold/link/router.go b/gold/link/router.go index 6328fbc..f25b342 100644 --- a/gold/link/router.go +++ b/gold/link/router.go @@ -1,6 +1,14 @@ package link -import "net" +import ( + "net" + "sync" +) + +var ( + routetable = make(map[string][]*Link) + routetablemu sync.RWMutex +) // Accept 判断是否应当接受 ip 发来的包 func (l *Link) Accept(ip net.IP) bool { @@ -19,5 +27,7 @@ func (l *Link) IsToMe(ip net.IP) bool { // NextHop 得到前往 ip 的下一跳的 link func (l *Link) NextHop(ip net.IP) *Link { + // TODO: 遍历 routetable,得到正确的下一跳 + // 注意使用 routetablemu 读写锁避免竞争 return l }