mirror of
https://github.com/impact-eintr/netstack.git
synced 2025-10-24 21:20:20 +08:00
fdbased还是走不了环回啊
This commit is contained in:
@@ -16,7 +16,8 @@ import (
|
||||
// Dial 呼叫tcp服务端
|
||||
func Dial(s *stack.Stack, proto tcpip.NetworkProtocolNumber, addr tcpip.Address, port int) (*TcpConn, error) {
|
||||
remote := tcpip.FullAddress{
|
||||
Addr: addr,
|
||||
NIC: 1, // 用 eth1 发送数据 自动绑定了 192.168.1.1
|
||||
Addr: addr, // 192.168.1.1
|
||||
Port: uint16(port),
|
||||
}
|
||||
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})
|
||||
if err != nil {
|
||||
if err == tcpip.ErrWouldBlock {
|
||||
logger.NOTICE("阻塞力!!!!!!!!!!!!!!!!!")
|
||||
<-conn.notifyCh
|
||||
if int(n) < len(snd) && n > 0 {
|
||||
snd = snd[n:]
|
||||
|
||||
@@ -26,13 +26,15 @@ import (
|
||||
|
||||
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() {
|
||||
flag.Parse()
|
||||
if len(flag.Args()) != 4 {
|
||||
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)
|
||||
|
||||
tapName := flag.Arg(0)
|
||||
@@ -47,6 +49,11 @@ func main() {
|
||||
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)
|
||||
if err != nil {
|
||||
log.Fatalf("Bad addrress: %v", addrName)
|
||||
@@ -97,12 +104,24 @@ func main() {
|
||||
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},
|
||||
[]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)
|
||||
}
|
||||
|
||||
@@ -111,10 +130,17 @@ func main() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := s.AddAddress(2, proto, "192.168.1.2"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// 在该协议栈上添加和注册ARP协议
|
||||
if err := s.AddAddress(1, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err := s.AddAddress(2, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// 添加默认路由
|
||||
s.SetRouteTable([]tcpip.Route{
|
||||
@@ -124,6 +150,12 @@ func main() {
|
||||
Gateway: "",
|
||||
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)
|
||||
|
||||
@@ -128,7 +128,7 @@ func (e *endpoint) WritePacket(r *stack.Route, hdr buffer.Prependable,
|
||||
}
|
||||
eth.Encode(ethHdr) // 将以太帧信息作为报文头编入
|
||||
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 {
|
||||
|
||||
@@ -151,7 +151,7 @@ func (*protocol) LinkAddressRequest(addr, localAddr tcpip.Address, linkEP stack.
|
||||
copy(h.HardwareAddressSender(), linkEP.LinkAddress())
|
||||
copy(h.ProtocolAddressSender(), localAddr)
|
||||
copy(h.ProtocolAddressTarget(), addr)
|
||||
log.Println("arp发起广播 寻找:", addr)
|
||||
log.Println("arp发起广播 寻找:", addr, r)
|
||||
return linkEP.WritePacket(r, hdr, buffer.VectorisedView{}, ProtocolNumber)
|
||||
}
|
||||
|
||||
|
||||
@@ -101,9 +101,6 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
|
||||
if err != nil {
|
||||
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 := *ep.ID()
|
||||
@@ -133,6 +130,10 @@ func (n *NIC) addAddressLocked(protocol tcpip.NetworkProtocolNumber, addr tcpip.
|
||||
// 注册该网络端
|
||||
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]
|
||||
if !ok {
|
||||
l = &ilist.List{}
|
||||
|
||||
@@ -606,6 +606,7 @@ func (s *Stack) FindRoute(id tcpip.NICID, localAddr, remoteAddr tcpip.Address,
|
||||
logger.GetInstance().Info(logger.IP, func() {
|
||||
log.Println(r.LocalLinkAddress, r.LocalAddress, r.RemoteLinkAddress, r.RemoteAddress, r.NextHop)
|
||||
})
|
||||
log.Println(s.routeTable[i])
|
||||
return r, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user