@@ -187,48 +187,15 @@ func ipv4CreateRejectTCPPacket(packet []byte, out []byte) []byte {
187187}
188188
189189func ipv6CreateRejectPacket (packet []byte , out []byte ) []byte {
190- proto := ipv6FindUpperProtocol (packet )
190+ proto , offset := ipv6FindUpperProtocol (packet )
191191 switch proto {
192192 case 6 : // tcp
193- return ipv6CreateRejectTCPPacket (packet , out )
193+ return ipv6CreateRejectTCPPacket (packet , out , offset )
194194 default :
195195 return ipv6CreateRejectICMPPacket (packet , out )
196196 }
197197}
198198
199- func ipv6FindUpperProtocol (packet []byte ) uint8 {
200- nextHeader := packet [6 ]
201- offset := ipv6 .HeaderLen
202-
203- for {
204- switch nextHeader {
205- case 0 , 43 , 60 : // Hop-by-Hop, Routing, Destination
206- if len (packet ) < offset + 2 {
207- return nextHeader
208- }
209- nextHeader = packet [offset ]
210- offset += int (packet [offset + 1 ]+ 1 ) << 3
211-
212- case 44 : // Fragment
213- if len (packet ) < offset + 8 {
214- return nextHeader
215- }
216- nextHeader = packet [offset ]
217- offset += 8
218-
219- case 51 : // AH
220- if len (packet ) < offset + 2 {
221- return nextHeader
222- }
223- nextHeader = packet [offset ]
224- offset += int (packet [offset + 1 ]+ 2 ) << 2
225-
226- default :
227- return nextHeader
228- }
229- }
230- }
231-
232199func ipv6CreateRejectICMPPacket (packet []byte , out []byte ) []byte {
233200 // Include as much of the original packet as possible, up to 1000 bytes,
234201 // so the response fits comfortably within any tunnel MTU.
@@ -277,10 +244,9 @@ func ipv6CreateRejectICMPPacket(packet []byte, out []byte) []byte {
277244 return out
278245}
279246
280- func ipv6CreateRejectTCPPacket (packet []byte , out []byte ) []byte {
247+ func ipv6CreateRejectTCPPacket (packet []byte , out []byte , offset int ) []byte {
281248 const tcpLen = 20
282249
283- offset := ipv6FindUpperProtocolOffset (packet )
284250 if len (packet ) < offset + tcpLen {
285251 return nil
286252 }
@@ -344,35 +310,35 @@ func ipv6CreateRejectTCPPacket(packet []byte, out []byte) []byte {
344310 return out
345311}
346312
347- func ipv6FindUpperProtocolOffset (packet []byte ) int {
348- nextHeader : = packet [6 ]
349- offset : = ipv6 .HeaderLen
313+ func ipv6FindUpperProtocol (packet []byte ) ( nextHeader uint8 , offset int ) {
314+ nextHeader = packet [6 ]
315+ offset = ipv6 .HeaderLen
350316
351317 for {
352318 switch nextHeader {
353319 case 0 , 43 , 60 : // Hop-by-Hop, Routing, Destination
354320 if len (packet ) < offset + 2 {
355- return offset
321+ return nextHeader , offset
356322 }
357323 nextHeader = packet [offset ]
358324 offset += int (packet [offset + 1 ]+ 1 ) << 3
359325
360326 case 44 : // Fragment
361327 if len (packet ) < offset + 8 {
362- return offset
328+ return nextHeader , offset
363329 }
364330 nextHeader = packet [offset ]
365331 offset += 8
366332
367333 case 51 : // AH
368334 if len (packet ) < offset + 2 {
369- return offset
335+ return nextHeader , offset
370336 }
371337 nextHeader = packet [offset ]
372338 offset += int (packet [offset + 1 ]+ 2 ) << 2
373339
374340 default :
375- return offset
341+ return nextHeader , offset
376342 }
377343 }
378344}
0 commit comments