Files
netstack/tcpip/stack/stack_test.go

132 lines
3.4 KiB
Go

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())
}