@@ -615,6 +615,9 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
615
615
struct seg6local_context ctx = {};
616
616
struct interface * ifp = NULL ;
617
617
struct vrf * vrf ;
618
+ struct prefix_ipv6 sid_block = {};
619
+ struct prefix_ipv6 locator_block = {};
620
+ struct prefix_ipv6 sid_locator = {};
618
621
619
622
if (!sid )
620
623
return ;
@@ -696,10 +699,30 @@ void static_zebra_srv6_sid_install(struct static_srv6_sid *sid)
696
699
break ;
697
700
}
698
701
699
- ctx .block_len = sid -> locator -> block_bits_length ;
700
- ctx .node_len = sid -> locator -> node_bits_length ;
701
- ctx .function_len = sid -> locator -> function_bits_length ;
702
- ctx .argument_len = sid -> locator -> argument_bits_length ;
702
+ sid_block = sid -> addr ;
703
+ sid_block .prefixlen = sid -> locator -> block_bits_length ;
704
+ apply_mask (& sid_block );
705
+
706
+ locator_block = sid -> locator -> prefix ;
707
+ locator_block .prefixlen = sid -> locator -> block_bits_length ;
708
+ apply_mask (& locator_block );
709
+
710
+ if (prefix_same (& sid_block , & locator_block ))
711
+ ctx .block_len = sid -> locator -> block_bits_length ;
712
+ else {
713
+ zlog_warn ("SID block %pFX does not match locator block %pFX" , & sid_block ,
714
+ & locator_block );
715
+ return ;
716
+ }
717
+
718
+ sid_locator = sid -> addr ;
719
+ sid_locator .prefixlen = sid -> locator -> block_bits_length + sid -> locator -> node_bits_length ;
720
+ apply_mask (& sid_locator );
721
+
722
+ if (prefix_same (& sid_locator , & sid -> locator -> prefix ))
723
+ ctx .node_len = sid -> locator -> node_bits_length ;
724
+
725
+ ctx .function_len = sid -> addr .prefixlen - (ctx .block_len + ctx .node_len );
703
726
704
727
/* Attach the SID to the SRv6 interface */
705
728
if (!ifp ) {
@@ -724,6 +747,9 @@ void static_zebra_srv6_sid_uninstall(struct static_srv6_sid *sid)
724
747
struct interface * ifp = NULL ;
725
748
struct seg6local_context ctx = {};
726
749
struct vrf * vrf ;
750
+ struct prefix_ipv6 sid_block = {};
751
+ struct prefix_ipv6 locator_block = {};
752
+ struct prefix_ipv6 sid_locator = {};
727
753
728
754
if (!sid )
729
755
return ;
@@ -803,10 +829,30 @@ void static_zebra_srv6_sid_uninstall(struct static_srv6_sid *sid)
803
829
}
804
830
}
805
831
806
- ctx .block_len = sid -> locator -> block_bits_length ;
807
- ctx .node_len = sid -> locator -> node_bits_length ;
808
- ctx .function_len = sid -> locator -> function_bits_length ;
809
- ctx .argument_len = sid -> locator -> argument_bits_length ;
832
+ sid_block = sid -> addr ;
833
+ sid_block .prefixlen = sid -> locator -> block_bits_length ;
834
+ apply_mask (& sid_block );
835
+
836
+ locator_block = sid -> locator -> prefix ;
837
+ locator_block .prefixlen = sid -> locator -> block_bits_length ;
838
+ apply_mask (& locator_block );
839
+
840
+ if (prefix_same (& sid_block , & locator_block ))
841
+ ctx .block_len = sid -> locator -> block_bits_length ;
842
+ else {
843
+ zlog_warn ("SID block %pFX does not match locator block %pFX" , & sid_block ,
844
+ & locator_block );
845
+ return ;
846
+ }
847
+
848
+ sid_locator = sid -> addr ;
849
+ sid_locator .prefixlen = sid -> locator -> block_bits_length + sid -> locator -> node_bits_length ;
850
+ apply_mask (& sid_locator );
851
+
852
+ if (prefix_same (& sid_locator , & sid -> locator -> prefix ))
853
+ ctx .node_len = sid -> locator -> node_bits_length ;
854
+
855
+ ctx .function_len = sid -> addr .prefixlen - (ctx .block_len + ctx .node_len );
810
856
811
857
static_zebra_send_localsid (ZEBRA_ROUTE_DELETE , & sid -> addr .prefix , sid -> addr .prefixlen ,
812
858
ifp -> ifindex , action , & ctx );
0 commit comments