@@ -114,6 +114,17 @@ var (
114114 ipV6AnyMask = make ([]byte , 16 )
115115)
116116
117+ func maskBytes (ip , mask []byte ) []byte {
118+ if len (ip ) != len (mask ) {
119+ return ip
120+ }
121+ out := make ([]byte , len (ip ))
122+ for i := 0 ; i < len (ip ); i ++ {
123+ out [i ] = ip [i ] & mask [i ]
124+ }
125+ return out
126+ }
127+
117128func termFieldsFromReq (req * saipb.CreateTunnelTermTableEntryRequest ) ([]* fwdpb.PacketFieldMaskedBytes , fwdpb.PacketHeaderId , error ) {
118129 fields := []* fwdpb.PacketFieldMaskedBytes {}
119130
@@ -151,23 +162,23 @@ func termFieldsFromReq(req *saipb.CreateTunnelTermTableEntryRequest) ([]*fwdpb.P
151162 switch req .GetType () {
152163 case saipb .TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P : // src IP, dst IP
153164 fields = append (fields ,
154- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (srcIP , exactMask ).Build (),
155- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (dstIP , exactMask ).Build (),
165+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (maskBytes ( srcIP , exactMask ) , exactMask ).Build (),
166+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (maskBytes ( dstIP , exactMask ) , exactMask ).Build (),
156167 )
157168 case saipb .TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2MP : // src IP, dst IP & mask
158169 fields = append (fields ,
159- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (srcIP , exactMask ).Build (),
160- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (dstIP , dstIPMask ).Build (),
170+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (maskBytes ( srcIP , exactMask ) , exactMask ).Build (),
171+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (maskBytes ( dstIP , dstIPMask ) , dstIPMask ).Build (),
161172 )
162173 case saipb .TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2P : // src IP & mask, dst IP
163174 fields = append (fields ,
164- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (srcIP , srcIPMask ).Build (),
165- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (dstIP , exactMask ).Build (),
175+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (maskBytes ( srcIP , srcIPMask ) , srcIPMask ).Build (),
176+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (maskBytes ( dstIP , exactMask ) , exactMask ).Build (),
166177 )
167178 case saipb .TunnelTermTableEntryType_TUNNEL_TERM_TABLE_ENTRY_TYPE_MP2MP : // src IP & mask, dst IP &mask
168179 fields = append (fields ,
169- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (srcIP , srcIPMask ).Build (),
170- fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (srcIP , dstIPMask ).Build (),
180+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_SRC ).WithBytes (maskBytes ( srcIP , srcIPMask ) , srcIPMask ).Build (),
181+ fwdconfig .PacketFieldMaskedBytes (fwdpb .PacketFieldNum_PACKET_FIELD_NUM_IP_ADDR_DST ).WithBytes (maskBytes ( dstIP , dstIPMask ) , dstIPMask ).Build (),
171182 )
172183 default :
173184 return nil , fwdpb .PacketHeaderId_PACKET_HEADER_ID_UNSPECIFIED , status .Errorf (codes .InvalidArgument , "invalid tunnel type: %v" , req .GetType ())
0 commit comments