@@ -39,7 +39,7 @@ func NewMixed(
3939 }
4040 return & Mixed {
4141 System : system .(* System ),
42- writer : options .Tun . CreateVectorisedWriter ( ),
42+ writer : bufio . NewVectorisedWriter ( options .Tun ),
4343 endpointIndependentNat : options .EndpointIndependentNat ,
4444 }, nil
4545}
@@ -96,21 +96,23 @@ func (m *Mixed) tunLoop() {
9696 m .wintunLoop (winTun )
9797 return
9898 }
99- packetBuffer := make ([]byte , m .mtu + PacketOffset )
99+ frontHeadroom := m .tun .FrontHeadroom ()
100+ packetBuffer := make ([]byte , m .bufferSize + frontHeadroom )
100101 for {
101- n , err := m .tun .Read (packetBuffer )
102+ n , err := m .tun .Read (packetBuffer [ frontHeadroom :] )
102103 if err != nil {
103104 return
104105 }
105106 if n < clashtcpip .IPv4PacketMinLength {
106107 continue
107108 }
108- packet := packetBuffer [PacketOffset :n ]
109+ rawPacket := packetBuffer [:frontHeadroom + n ]
110+ packet := packetBuffer [frontHeadroom : frontHeadroom + n ]
109111 switch ipVersion := packet [0 ] >> 4 ; ipVersion {
110112 case 4 :
111- err = m .processIPv4 (packet )
113+ err = m .processIPv4 (rawPacket , packet )
112114 case 6 :
113- err = m .processIPv6 (packet )
115+ err = m .processIPv6 (rawPacket , packet )
114116 default :
115117 err = E .New ("ip: unknown version: " , ipVersion )
116118 }
@@ -132,9 +134,9 @@ func (m *Mixed) wintunLoop(winTun WinTun) {
132134 }
133135 switch ipVersion := packet [0 ] >> 4 ; ipVersion {
134136 case 4 :
135- err = m .processIPv4 (packet )
137+ err = m .processIPv4 (packet , packet )
136138 case 6 :
137- err = m .processIPv6 (packet )
139+ err = m .processIPv6 (packet , packet )
138140 default :
139141 err = E .New ("ip: unknown version: " , ipVersion )
140142 }
@@ -145,14 +147,14 @@ func (m *Mixed) wintunLoop(winTun WinTun) {
145147 }
146148}
147149
148- func (m * Mixed ) processIPv4 (packet clashtcpip.IPv4Packet ) error {
150+ func (m * Mixed ) processIPv4 (rawPacket [] byte , packet clashtcpip.IPv4Packet ) error {
149151 destination := packet .DestinationIP ()
150152 if destination == m .broadcastAddr || ! destination .IsGlobalUnicast () {
151153 return common .Error (m .tun .Write (packet ))
152154 }
153155 switch packet .Protocol () {
154156 case clashtcpip .TCP :
155- return m .processIPv4TCP (packet , packet .Payload ())
157+ return m .processIPv4TCP (rawPacket , packet , packet .Payload ())
156158 case clashtcpip .UDP :
157159 pkt := stack .NewPacketBuffer (stack.PacketBufferOptions {
158160 Payload : buffer .MakeWithData (packet ),
@@ -161,19 +163,19 @@ func (m *Mixed) processIPv4(packet clashtcpip.IPv4Packet) error {
161163 pkt .DecRef ()
162164 return nil
163165 case clashtcpip .ICMP :
164- return m .processIPv4ICMP (packet , packet .Payload ())
166+ return m .processIPv4ICMP (rawPacket , packet , packet .Payload ())
165167 default :
166168 return common .Error (m .tun .Write (packet ))
167169 }
168170}
169171
170- func (m * Mixed ) processIPv6 (packet clashtcpip.IPv6Packet ) error {
172+ func (m * Mixed ) processIPv6 (rawPacket [] byte , packet clashtcpip.IPv6Packet ) error {
171173 if ! packet .DestinationIP ().IsGlobalUnicast () {
172174 return common .Error (m .tun .Write (packet ))
173175 }
174176 switch packet .Protocol () {
175177 case clashtcpip .TCP :
176- return m .processIPv6TCP (packet , packet .Payload ())
178+ return m .processIPv6TCP (rawPacket , packet , packet .Payload ())
177179 case clashtcpip .UDP :
178180 pkt := stack .NewPacketBuffer (stack.PacketBufferOptions {
179181 Payload : buffer .MakeWithData (packet ),
@@ -182,7 +184,7 @@ func (m *Mixed) processIPv6(packet clashtcpip.IPv6Packet) error {
182184 pkt .DecRef ()
183185 return nil
184186 case clashtcpip .ICMPv6 :
185- return m .processIPv6ICMP (packet , packet .Payload ())
187+ return m .processIPv6ICMP (rawPacket , packet , packet .Payload ())
186188 default :
187189 return common .Error (m .tun .Write (packet ))
188190 }
0 commit comments