endpoint.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //go:build windows
  2. package ndis
  3. import (
  4. "sync"
  5. "github.com/sagernet/gvisor/pkg/buffer"
  6. "github.com/sagernet/gvisor/pkg/tcpip"
  7. "github.com/sagernet/gvisor/pkg/tcpip/header"
  8. "github.com/sagernet/gvisor/pkg/tcpip/stack"
  9. "github.com/wiresock/ndisapi-go"
  10. "github.com/wiresock/ndisapi-go/driver"
  11. )
  12. var _ stack.LinkEndpoint = (*ndisEndpoint)(nil)
  13. type ndisEndpoint struct {
  14. filter *driver.QueuedPacketFilter
  15. mtu uint32
  16. address tcpip.LinkAddress
  17. dispatcher stack.NetworkDispatcher
  18. }
  19. func (e *ndisEndpoint) MTU() uint32 {
  20. return e.mtu
  21. }
  22. func (e *ndisEndpoint) SetMTU(mtu uint32) {
  23. }
  24. func (e *ndisEndpoint) MaxHeaderLength() uint16 {
  25. return header.EthernetMinimumSize
  26. }
  27. func (e *ndisEndpoint) LinkAddress() tcpip.LinkAddress {
  28. return e.address
  29. }
  30. func (e *ndisEndpoint) SetLinkAddress(addr tcpip.LinkAddress) {
  31. }
  32. func (e *ndisEndpoint) Capabilities() stack.LinkEndpointCapabilities {
  33. return 0
  34. }
  35. func (e *ndisEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
  36. e.dispatcher = dispatcher
  37. }
  38. func (e *ndisEndpoint) IsAttached() bool {
  39. return e.dispatcher != nil
  40. }
  41. func (e *ndisEndpoint) Wait() {
  42. }
  43. func (e *ndisEndpoint) ARPHardwareType() header.ARPHardwareType {
  44. return header.ARPHardwareEther
  45. }
  46. func (e *ndisEndpoint) AddHeader(pkt *stack.PacketBuffer) {
  47. eth := header.Ethernet(pkt.LinkHeader().Push(header.EthernetMinimumSize))
  48. fields := header.EthernetFields{
  49. SrcAddr: pkt.EgressRoute.LocalLinkAddress,
  50. DstAddr: pkt.EgressRoute.RemoteLinkAddress,
  51. Type: pkt.NetworkProtocolNumber,
  52. }
  53. eth.Encode(&fields)
  54. }
  55. func (e *ndisEndpoint) ParseHeader(pkt *stack.PacketBuffer) bool {
  56. _, ok := pkt.LinkHeader().Consume(header.EthernetMinimumSize)
  57. return ok
  58. }
  59. func (e *ndisEndpoint) Close() {
  60. }
  61. func (e *ndisEndpoint) SetOnCloseAction(f func()) {
  62. }
  63. var bufferPool = sync.Pool{
  64. New: func() any {
  65. return new(ndisapi.IntermediateBuffer)
  66. },
  67. }
  68. func (e *ndisEndpoint) WritePackets(list stack.PacketBufferList) (int, tcpip.Error) {
  69. for _, packetBuffer := range list.AsSlice() {
  70. ndisBuf := bufferPool.Get().(*ndisapi.IntermediateBuffer)
  71. viewList, offset := packetBuffer.AsViewList()
  72. var view *buffer.View
  73. for view = viewList.Front(); view != nil && offset >= view.Size(); view = view.Next() {
  74. offset -= view.Size()
  75. }
  76. index := copy(ndisBuf.Buffer[:], view.AsSlice()[offset:])
  77. for view = view.Next(); view != nil; view = view.Next() {
  78. index += copy(ndisBuf.Buffer[index:], view.AsSlice())
  79. }
  80. ndisBuf.Length = uint32(index)
  81. err := e.filter.InsertPacketToMstcp(ndisBuf)
  82. bufferPool.Put(ndisBuf)
  83. if err != nil {
  84. return 0, &tcpip.ErrAborted{}
  85. }
  86. }
  87. return list.Len(), nil
  88. }