mirror of
https://github.com/impact-eintr/netstack.git
synced 2025-10-16 18:00:38 +08:00
fdbased还是走不了环回啊
This commit is contained in:
@@ -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:]
|
||||||
|
@@ -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)
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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{}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user