Some checks are pending
docker-build-cometbft / vars (push) Waiting to run
docker-build-cometbft / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-cometbft / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-cometbft / merge-images (push) Blocked by required conditions
docker-build-e2e-node / vars (push) Waiting to run
docker-build-e2e-node / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-e2e-node / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-e2e-node / merge-images (push) Blocked by required conditions
82 lines
1.3 KiB
Go
82 lines
1.3 KiB
Go
package p2p
|
|
|
|
import (
|
|
"net"
|
|
|
|
cmtsync "git.cw.tr/mukan-network/mukan-consensus/libs/sync"
|
|
)
|
|
|
|
// ConnSet is a lookup table for connections and all their ips.
|
|
type ConnSet interface {
|
|
Has(net.Conn) bool
|
|
HasIP(net.IP) bool
|
|
Set(net.Conn, []net.IP)
|
|
Remove(net.Conn)
|
|
RemoveAddr(net.Addr)
|
|
}
|
|
|
|
type connSetItem struct {
|
|
conn net.Conn
|
|
ips []net.IP
|
|
}
|
|
|
|
type connSet struct {
|
|
cmtsync.RWMutex
|
|
|
|
conns map[string]connSetItem
|
|
}
|
|
|
|
// NewConnSet returns a ConnSet implementation.
|
|
func NewConnSet() ConnSet {
|
|
return &connSet{
|
|
conns: map[string]connSetItem{},
|
|
}
|
|
}
|
|
|
|
func (cs *connSet) Has(c net.Conn) bool {
|
|
cs.RLock()
|
|
defer cs.RUnlock()
|
|
|
|
_, ok := cs.conns[c.RemoteAddr().String()]
|
|
|
|
return ok
|
|
}
|
|
|
|
func (cs *connSet) HasIP(ip net.IP) bool {
|
|
cs.RLock()
|
|
defer cs.RUnlock()
|
|
|
|
for _, c := range cs.conns {
|
|
for _, known := range c.ips {
|
|
if known.Equal(ip) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (cs *connSet) Remove(c net.Conn) {
|
|
cs.Lock()
|
|
defer cs.Unlock()
|
|
|
|
delete(cs.conns, c.RemoteAddr().String())
|
|
}
|
|
|
|
func (cs *connSet) RemoveAddr(addr net.Addr) {
|
|
cs.Lock()
|
|
defer cs.Unlock()
|
|
|
|
delete(cs.conns, addr.String())
|
|
}
|
|
|
|
func (cs *connSet) Set(c net.Conn, ips []net.IP) {
|
|
cs.Lock()
|
|
defer cs.Unlock()
|
|
|
|
cs.conns[c.RemoteAddr().String()] = connSetItem{
|
|
conn: c,
|
|
ips: ips,
|
|
}
|
|
}
|