package stack_test import ( "log" "netstack/tcpip" "netstack/tcpip/buffer" "netstack/tcpip/link/channel" "netstack/tcpip/stack" "testing" ) const ( fakeNetHeaderLen = 12 defaultMTU = 65536 ) type fakeNetworkEndpoint struct { nicid tcpip.NICID id stack.NetworkEndpointID proto *fakeNetworkProtocol dispatcher stack.TransportDispatcher linkEP stack.LinkEndpoint } func (f *fakeNetworkEndpoint) DefaultTTL() uint8 { return 123 } func (f *fakeNetworkEndpoint) MTU() uint32 { return f.linkEP.MTU() - uint32(f.MaxHeaderLength()) } func (f *fakeNetworkEndpoint) Capabilities() stack.LinkEndpointCapabilities { return f.linkEP.Capabilities() } func (f *fakeNetworkEndpoint) MaxHeaderLength() uint16 { return f.linkEP.MaxHeaderLength() + fakeNetHeaderLen } func (f *fakeNetworkEndpoint) WritePacket(r *stack.Route, hdr buffer.Prependable, payload buffer.VectorisedView, protocol tcpip.TransportProtocolNumber, ttl uint8) *tcpip.Error { return nil } func (f *fakeNetworkEndpoint) ID() *stack.NetworkEndpointID { return &f.id } func (f *fakeNetworkEndpoint) NICID() tcpip.NICID { return f.nicid } func (f *fakeNetworkEndpoint) HandlePacket(r *stack.Route, vv buffer.VectorisedView) { log.Println("执行这个函数 接下来它会去向传输层分发数据") } func (f *fakeNetworkEndpoint) Close() {} // dst|src|payload type fakeNetworkProtocol struct{} func (f *fakeNetworkProtocol) Number() tcpip.NetworkProtocolNumber { return 114514 } func (f *fakeNetworkProtocol) NewEndpoint(nicid tcpip.NICID, addr tcpip.Address, linkAddrCache stack.LinkAddressCache, dispatcher stack.TransportDispatcher, linkEP stack.LinkEndpoint) (stack.NetworkEndpoint, *tcpip.Error) { return &fakeNetworkEndpoint{ nicid: nicid, id: stack.NetworkEndpointID{addr}, proto: f, dispatcher: dispatcher, linkEP: linkEP, }, nil } func (f *fakeNetworkProtocol) MinimumPacketSize() int { return fakeNetHeaderLen } func (f *fakeNetworkProtocol) ParseAddresses(v buffer.View) (src, dst tcpip.Address) { return tcpip.Address(v[4:8]), tcpip.Address(v[0:4]) } func (f *fakeNetworkProtocol) SetOption(option interface{}) *tcpip.Error { return nil } func (f *fakeNetworkProtocol) Option(option interface{}) *tcpip.Error { return nil } func init() { stack.RegisterNetworkProtocolFactory("fakeNet", func() stack.NetworkProtocol { return &fakeNetworkProtocol{} }) } func TestStackBase(t *testing.T) { myStack := stack.New([]string{"fakeNet"}, nil, stack.Options{}) id1, ep1 := channel.New(10, defaultMTU, "00:15:5d:26:d7:a1") // 这是一个物理设备 if err := myStack.CreateNIC(1, id1); err != nil { // 将上面的物理设备抽象成我们的网卡对象 panic(err) } myStack.AddAddress(1, 114514, "\x0a\xff\x01\x01") // 给网卡对象绑定一个IP地址 可以绑定多个 id2, _ := channel.New(10, defaultMTU, "50:5B:C2:D0:96:57") // 这是一个物理设备 if err := myStack.CreateNIC(2, id2); err != nil { // 将上面的物理设备抽象成我们的网卡对象 panic(err) } myStack.AddAddress(1, 114514, "\x0a\xff\x01\x02") // 给网卡对象绑定一个IP地址 可以绑定多个 buf := buffer.NewView(30) for i := range buf { buf[i] = 0 } // dst 10.255.1.2 buf[0] = '\x0a' buf[1] = '\xff' buf[2] = '\x01' buf[3] = '\x02' // src 10.255.1.1 buf[4] = '\x0a' buf[5] = '\xff' buf[6] = '\x01' buf[7] = '\x01' ep1.Inject(114514, buf.ToVectoriseView()) }