1+ //go:build linux
12// +build linux
23
34package netlink
@@ -11,7 +12,12 @@ import (
1112)
1213
1314func TestXfrmStateAddGetDel (t * testing.T ) {
14- for _ , s := range []* XfrmState {getBaseState (), getAeadState ()} {
15+ for _ , s := range []* XfrmState {
16+ getBaseState (),
17+ getAeadState (),
18+ getBaseStateV6oV4 (),
19+ getBaseStateV4oV6 (),
20+ } {
1521 testXfrmStateAddGetDel (t , s )
1622 }
1723}
@@ -26,7 +32,6 @@ func testXfrmStateAddGetDel(t *testing.T, state *XfrmState) {
2632 if err != nil {
2733 t .Fatal (err )
2834 }
29-
3035 if len (states ) != 1 {
3136 t .Fatal ("State not added properly" )
3237 }
@@ -77,6 +82,7 @@ func TestXfrmStateAllocSpi(t *testing.T) {
7782 t .Fatalf ("SPI is not allocated" )
7883 }
7984 rstate .Spi = 0
85+
8086 if ! compareStates (state , rstate ) {
8187 t .Fatalf ("State not properly allocated" )
8288 }
@@ -268,6 +274,21 @@ func TestXfrmStateWithOutputMarkAndMask(t *testing.T) {
268274 t .Fatal (err )
269275 }
270276}
277+ func genStateSelectorForV6Payload () * XfrmPolicy {
278+ _ , wildcardV6Net , _ := net .ParseCIDR ("::/0" )
279+ return & XfrmPolicy {
280+ Src : wildcardV6Net ,
281+ Dst : wildcardV6Net ,
282+ }
283+ }
284+
285+ func genStateSelectorForV4Payload () * XfrmPolicy {
286+ _ , wildcardV4Net , _ := net .ParseCIDR ("0.0.0.0/0" )
287+ return & XfrmPolicy {
288+ Src : wildcardV4Net ,
289+ Dst : wildcardV4Net ,
290+ }
291+ }
271292
272293func getBaseState () * XfrmState {
273294 return & XfrmState {
@@ -292,6 +313,54 @@ func getBaseState() *XfrmState {
292313 }
293314}
294315
316+ func getBaseStateV4oV6 () * XfrmState {
317+ return & XfrmState {
318+ // Force 4 byte notation for the IPv4 addressesd
319+ Src : net .ParseIP ("2001:dead::1" ).To16 (),
320+ Dst : net .ParseIP ("2001:beef::1" ).To16 (),
321+ Proto : XFRM_PROTO_ESP ,
322+ Mode : XFRM_MODE_TUNNEL ,
323+ Spi : 1 ,
324+ Auth : & XfrmStateAlgo {
325+ Name : "hmac(sha256)" ,
326+ Key : []byte ("abcdefghijklmnopqrstuvwzyzABCDEF" ),
327+ },
328+ Crypt : & XfrmStateAlgo {
329+ Name : "cbc(aes)" ,
330+ Key : []byte ("abcdefghijklmnopqrstuvwzyzABCDEF" ),
331+ },
332+ Mark : & XfrmMark {
333+ Value : 0x12340000 ,
334+ Mask : 0xffff0000 ,
335+ },
336+ Selector : genStateSelectorForV4Payload (),
337+ }
338+ }
339+
340+ func getBaseStateV6oV4 () * XfrmState {
341+ return & XfrmState {
342+ // Force 4 byte notation for the IPv4 addressesd
343+ Src : net .ParseIP ("192.168.1.1" ).To4 (),
344+ Dst : net .ParseIP ("192.168.2.2" ).To4 (),
345+ Proto : XFRM_PROTO_ESP ,
346+ Mode : XFRM_MODE_TUNNEL ,
347+ Spi : 1 ,
348+ Auth : & XfrmStateAlgo {
349+ Name : "hmac(sha256)" ,
350+ Key : []byte ("abcdefghijklmnopqrstuvwzyzABCDEF" ),
351+ },
352+ Crypt : & XfrmStateAlgo {
353+ Name : "cbc(aes)" ,
354+ Key : []byte ("abcdefghijklmnopqrstuvwzyzABCDEF" ),
355+ },
356+ Mark : & XfrmMark {
357+ Value : 0x12340000 ,
358+ Mask : 0xffff0000 ,
359+ },
360+ Selector : genStateSelectorForV6Payload (),
361+ }
362+ }
363+
295364func getAeadState () * XfrmState {
296365 // 128 key bits + 32 salt bits
297366 k , _ := hex .DecodeString ("d0562776bf0e75830ba3f7f8eb6c09b555aa1177" )
@@ -309,6 +378,14 @@ func getAeadState() *XfrmState {
309378 },
310379 }
311380}
381+ func compareSelector (a , b * XfrmPolicy ) bool {
382+ return a .Src .String () == b .Src .String () &&
383+ a .Dst .String () == b .Dst .String () &&
384+ a .Proto == b .Proto &&
385+ a .DstPort == b .DstPort &&
386+ a .SrcPort == b .SrcPort &&
387+ a .Ifindex == b .Ifindex
388+ }
312389
313390func compareStates (a , b * XfrmState ) bool {
314391 if a == b {
@@ -317,6 +394,12 @@ func compareStates(a, b *XfrmState) bool {
317394 if a == nil || b == nil {
318395 return false
319396 }
397+ if a .Selector != nil && b .Selector != nil {
398+ if ! compareSelector (a .Selector , b .Selector ) {
399+ return false
400+ }
401+ }
402+
320403 return a .Src .Equal (b .Src ) && a .Dst .Equal (b .Dst ) &&
321404 a .Mode == b .Mode && a .Spi == b .Spi && a .Proto == b .Proto &&
322405 a .Ifid == b .Ifid &&
@@ -325,6 +408,7 @@ func compareStates(a, b *XfrmState) bool {
325408 compareAlgo (a .Aead , b .Aead ) &&
326409 compareMarks (a .Mark , b .Mark ) &&
327410 compareMarks (a .OutputMark , b .OutputMark )
411+
328412}
329413
330414func compareLimits (a , b * XfrmState ) bool {
0 commit comments