fdbased还是走不了环回啊

This commit is contained in:
impact-eintr
2022-12-30 11:00:56 +08:00
parent e7e3da0c62
commit 49c7cd2ff4
6 changed files with 43 additions and 9 deletions

View File

@@ -16,7 +16,8 @@ import (
// Dial 呼叫tcp服务端 // Dial 呼叫tcp服务端
func Dial(s *stack.Stack, proto tcpip.NetworkProtocolNumber, addr tcpip.Address, port int) (*TcpConn, error) { func Dial(s *stack.Stack, proto tcpip.NetworkProtocolNumber, addr tcpip.Address, port int) (*TcpConn, error) {
remote := tcpip.FullAddress{ remote := tcpip.FullAddress{
Addr: addr, NIC: 1, // 用 eth1 发送数据 自动绑定了 192.168.1.1
Addr: addr, // 192.168.1.1
Port: uint16(port), Port: uint16(port),
} }
var wq waiter.Queue var wq waiter.Queue
@@ -88,7 +89,6 @@ func (conn *TcpConn) Write(snd []byte) error {
n, _, err := conn.ep.Write(tcpip.SlicePayload(snd), tcpip.WriteOptions{To: &conn.raddr}) n, _, err := conn.ep.Write(tcpip.SlicePayload(snd), tcpip.WriteOptions{To: &conn.raddr})
if err != nil { if err != nil {
if err == tcpip.ErrWouldBlock { if err == tcpip.ErrWouldBlock {
logger.NOTICE("阻塞力!!!!!!!!!!!!!!!!!")
<-conn.notifyCh <-conn.notifyCh
if int(n) < len(snd) && n > 0 { if int(n) < len(snd) && n > 0 {
snd = snd[n:] snd = snd[n:]

View File

@@ -26,13 +26,15 @@ import (
var mac = flag.String("mac", "aa:00:01:01:01:01", "mac address to use in tap device") var mac = flag.String("mac", "aa:00:01:01:01:01", "mac address to use in tap device")
var mac2 = flag.String("mac2", "bb:00:01:01:01:01", "mac address to use in tap2 device")
func main() { func main() {
flag.Parse() flag.Parse()
if len(flag.Args()) != 4 { if len(flag.Args()) != 4 {
log.Fatal("Usage: ", os.Args[0], " <tap-device> <local-address/mask> <ip-address> <local-port>") log.Fatal("Usage: ", os.Args[0], " <tap-device> <local-address/mask> <ip-address> <local-port>")
} }
logger.SetFlags(logger.ETH) logger.SetFlags(logger.ETH|logger.IP)
log.SetFlags(log.Lshortfile | log.LstdFlags) log.SetFlags(log.Lshortfile | log.LstdFlags)
tapName := flag.Arg(0) tapName := flag.Arg(0)
@@ -47,6 +49,11 @@ func main() {
log.Fatalf("Bad MAC address: %v", *mac) log.Fatalf("Bad MAC address: %v", *mac)
} }
maddr2, err := net.ParseMAC(*mac2)
if err != nil {
log.Fatalf("Bad MAC address: %v", *mac)
}
parsedAddr := net.ParseIP(addrName) parsedAddr := net.ParseIP(addrName)
if err != nil { if err != nil {
log.Fatalf("Bad addrress: %v", addrName) log.Fatalf("Bad addrress: %v", addrName)
@@ -97,12 +104,24 @@ func main() {
HandleLocal: true, HandleLocal: true,
}) })
linkID2 := fdbased.New(&fdbased.Options{
FD: fd,
MTU: 1500,
Address: tcpip.LinkAddress(maddr2),
ResolutionRequired: true,
HandleLocal: true,
})
// 新建相关协议的协议栈 // 新建相关协议的协议栈
s := stack.New([]string{ipv4.ProtocolName, arp.ProtocolName}, s := stack.New([]string{ipv4.ProtocolName, arp.ProtocolName},
[]string{tcp.ProtocolName, udp.ProtocolName}, stack.Options{}) []string{tcp.ProtocolName, udp.ProtocolName}, stack.Options{})
// 新建抽象的网卡 // 新建抽象的网卡
if err := s.CreateNamedNIC(1, "eth0", linkID); err != nil { if err := s.CreateNamedNIC(1, "eth1", linkID); err != nil {
log.Fatal(err)
}
if err := s.CreateNamedNIC(2, "eth2", linkID2); err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -111,10 +130,17 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
if err := s.AddAddress(2, proto, "192.168.1.2"); err != nil {
log.Fatal(err)
}
// 在该协议栈上添加和注册ARP协议 // 在该协议栈上添加和注册ARP协议
if err := s.AddAddress(1, arp.ProtocolNumber, arp.ProtocolAddress); err != nil { if err := s.AddAddress(1, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
log.Fatal(err) log.Fatal(err)
} }
if err := s.AddAddress(2, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
log.Fatal(err)
}
// 添加默认路由 // 添加默认路由
s.SetRouteTable([]tcpip.Route{ s.SetRouteTable([]tcpip.Route{
@@ -124,6 +150,12 @@ func main() {
Gateway: "", Gateway: "",
NIC: 1, NIC: 1,
}, },
{
Destination: tcpip.Address(strings.Repeat("\x00", len(addr))),
Mask: tcpip.AddressMask(strings.Repeat("\x00", len(addr))),
Gateway: "",
NIC: 2,
},
}) })
done := make(chan struct{}, 2) done := make(chan struct{}, 2)

View File

@@ -128,7 +128,7 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable,
} }
eth.Encode(ethHdr) // 将以太帧信息作为报文头编入 eth.Encode(ethHdr) // 将以太帧信息作为报文头编入
logger.GetInstance().Info(logger.ETH, func() { logger.GetInstance().Info(logger.ETH, func() {
log.Println(e.handleLocal, r.LocalLinkAddress, "链路层写回以太报文 ", r.LocalAddress, " to ", r.RemoteAddress) log.Println(ethHdr.SrcAddr, "链路层写回以太报文 ", r.RemoteLinkAddress, " to ", r.RemoteAddress)
}) })
// 写入网卡中 // 写入网卡中
if payload.Size() == 0 { if payload.Size() == 0 {

View File

@@ -151,7 +151,7 @@ func (*protocol) LinkAddressRequest(addr, localAddr tcpip.Address, linkEP stack.
copy(h.HardwareAddressSender(), linkEP.LinkAddress()) copy(h.HardwareAddressSender(), linkEP.LinkAddress())
copy(h.ProtocolAddressSender(), localAddr) copy(h.ProtocolAddressSender(), localAddr)
copy(h.ProtocolAddressTarget(), addr) copy(h.ProtocolAddressTarget(), addr)
log.Println("arp发起广播 寻找:", addr) log.Println("arp发起广播 寻找:", addr, r)
return linkEP.WritePacket(r, hdr, buffer.VectorisedView{}, ProtocolNumber) return linkEP.WritePacket(r, hdr, buffer.VectorisedView{}, ProtocolNumber)
} }

View File

@@ -101,9 +101,6 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
if err != nil { if err != nil {
return nil, err return nil, err
} }
logger.GetInstance().Info(logger.IP, func() {
log.Printf("基于[%d]协议 为 #%d 网卡 添加网络层实现 并绑定地址到: %s\n", netProto.Number(), n.id, ep.ID().LocalAddress)
})
// 获取网络层端的id 其实就是ip地址 // 获取网络层端的id 其实就是ip地址
id := *ep.ID() id := *ep.ID()
@@ -133,6 +130,10 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
// 注册该网络端 // 注册该网络端
n.endpoints[id] = ref n.endpoints[id] = ref
logger.GetInstance().Info(logger.IP, func() {
log.Printf("基于[%d]协议 为 #%d 网卡 添加网络层实现 并绑定地址到: %s\n", netProto.Number(), n.id, ep.ID().LocalAddress)
})
l, ok := n.primary[protocol] l, ok := n.primary[protocol]
if !ok { if !ok {
l = &ilist.List{} l = &ilist.List{}

View File

@@ -606,6 +606,7 @@ func (s *Stack) FindRoute(id tcpip.NICID, localAddr, remoteAddr tcpip.Address,
logger.GetInstance().Info(logger.IP, func() { logger.GetInstance().Info(logger.IP, func() {
log.Println(r.LocalLinkAddress, r.LocalAddress, r.RemoteLinkAddress, r.RemoteAddress, r.NextHop) log.Println(r.LocalLinkAddress, r.LocalAddress, r.RemoteLinkAddress, r.RemoteAddress, r.NextHop)
}) })
log.Println(s.routeTable[i])
return r, nil return r, nil
} }