diff --git a/ctlabels.go b/ctlabels.go index 6662dbd..1ee0353 100644 --- a/ctlabels.go +++ b/ctlabels.go @@ -10,9 +10,9 @@ Traffic Visualization Micro Segmentation -| 127 | 126 | 125-124 | 123-108 | 107-92 | 91-90 | 89-88 | 87-60 | 59-32 | 31-4 | 3-0 | -| work policy | monitor policy | encoding scheme | reply | origin | reply | origin | work mode | monitor mode | | round | -| action drop | action drop | (0x11) | in_port | in_port | source | source | flow id | flow id | | number | +| 127 | 126 | 125-124 | 123-108 | 107-92 | 91-90 | 89-88 | 87-60 | 59-32 | 31-6 | 5 | 4 | 3-0 | +| work policy | monitor policy | encoding scheme | reply | origin | reply | origin | work mode | monitor mode | | source work mode | target work mode | round | +| action drop | action drop | (0x11) | in_port | in_port | source | source | flow id | flow id | | action drop | action drop | number | */ @@ -61,18 +61,20 @@ type DecodedTrafficVisualizationConntrackLabels struct { } type DecodedMicroSegmentationConntrackLabels struct { - RoundNumber uint8 `json:"round_number"` // 4 bits - MonitorFlowSequence uint32 `json:"monitor_flow_sequence"` // 28 bits - MonitorFlowID uint32 `json:"monitor_flow_id"` // Equals to MonitorFlowSequence | RoundNumber << 28 - WorkFlowSequence uint32 `json:"work_flow_sequence"` // 28 bits - WorkFlowID uint32 `json:"work_flow_id"` // Equals to WorkFlowSequence | RoundNumber << 28 - OriginPacketSource PacketSource `json:"origin_packet_source"` // 2 bits - ReplyPacketSource PacketSource `json:"reply_packet_source"` // 2 bits - OriginInport uint16 `json:"origin_inport"` - ReplyInport uint16 `json:"reply_inport"` - EncodingScheme EncodingScheme `json:"encoding_scheme"` - MonitorPolicyActionDrop bool `json:"monitor_policy_action_drop"` - WorkPolicyActionDrop bool `json:"work_policy_action_drop"` + RoundNumber uint8 `json:"round_number"` // 4 bits + TargetWorkModeActionDrop bool `json:"target_work_mode_action_drop"` // 1 bit + SourceWorkModeActionDrop bool `json:"source_work_mode_action_drop"` // 1 bit + MonitorFlowSequence uint32 `json:"monitor_flow_sequence"` // 28 bits + MonitorFlowID uint32 `json:"monitor_flow_id"` // Equals to MonitorFlowSequence | RoundNumber << 28 + WorkFlowSequence uint32 `json:"work_flow_sequence"` // 28 bits + WorkFlowID uint32 `json:"work_flow_id"` // Equals to WorkFlowSequence | RoundNumber << 28 + OriginPacketSource PacketSource `json:"origin_packet_source"` // 2 bits + ReplyPacketSource PacketSource `json:"reply_packet_source"` // 2 bits + OriginInport uint16 `json:"origin_inport"` + ReplyInport uint16 `json:"reply_inport"` + EncodingScheme EncodingScheme `json:"encoding_scheme"` + MonitorPolicyActionDrop bool `json:"monitor_policy_action_drop"` + WorkPolicyActionDrop bool `json:"work_policy_action_drop"` } // Mask for the conntrack labels @@ -112,18 +114,24 @@ var ( // Encoding Scheme here 125-124 // ReplyInportMask here 123-108 // OriginInportMask here 107-92 - ReplyPacketSourceLength = uint8(2) - ReplyPacketSourceShift = uint8(90) - ReplyPacketSourceMask = numeric.Mask(ReplyPacketSourceLength).ShiftLeft(ReplyPacketSourceShift) - OriginPacketSourceLength = uint8(2) - OriginPacketSourceShift = uint8(88) - OriginPacketSourceMask = numeric.Mask(OriginPacketSourceLength).ShiftLeft(OriginPacketSourceShift) - WorkPolicySequenceLength = uint8(28) - WorkPolicySequenceShift = uint8(60) - WorkPolicySequenceMask = numeric.Mask(WorkPolicySequenceLength).ShiftLeft(WorkPolicySequenceShift) - MonitorPolicySequenceLength = uint8(28) - MonitorPolicySequenceShift = uint8(32) - MonitorPolicySequenceMask = numeric.Mask(MonitorPolicySequenceLength).ShiftLeft(MonitorPolicySequenceShift) + ReplyPacketSourceLength = uint8(2) + ReplyPacketSourceShift = uint8(90) + ReplyPacketSourceMask = numeric.Mask(ReplyPacketSourceLength).ShiftLeft(ReplyPacketSourceShift) + OriginPacketSourceLength = uint8(2) + OriginPacketSourceShift = uint8(88) + OriginPacketSourceMask = numeric.Mask(OriginPacketSourceLength).ShiftLeft(OriginPacketSourceShift) + WorkPolicySequenceLength = uint8(28) + WorkPolicySequenceShift = uint8(60) + WorkPolicySequenceMask = numeric.Mask(WorkPolicySequenceLength).ShiftLeft(WorkPolicySequenceShift) + MonitorPolicySequenceLength = uint8(28) + MonitorPolicySequenceShift = uint8(32) + MonitorPolicySequenceMask = numeric.Mask(MonitorPolicySequenceLength).ShiftLeft(MonitorPolicySequenceShift) + SourceWorkModeActionDropLength = uint8(1) + SourceWorkModeActionDropShift = uint8(5) + SourceWorkModeActionDropMask = numeric.Mask(SourceWorkModeActionDropLength).ShiftLeft(SourceWorkModeActionDropShift) + TargetWorkModeActionDropLength = uint8(1) + TargetWorkModeActionDropShift = uint8(4) + TargetWorkModeActionDropMask = numeric.Mask(TargetWorkModeActionDropLength).ShiftLeft(TargetWorkModeActionDropShift) // round number here 3-0 ) @@ -192,6 +200,8 @@ func DecodeMicroSegmentation(labels numeric.Uint128) (DecodedMicroSegmentationCo decoded := DecodedMicroSegmentationConntrackLabels{} decoded.RoundNumber = uint8(labels.And(RoundNumberMask).ShiftRight(RoundNumberShift).Low) + decoded.TargetWorkModeActionDrop = labels.And(TargetWorkModeActionDropMask).ShiftRight(TargetWorkModeActionDropShift).Low != 0 + decoded.SourceWorkModeActionDrop = labels.And(SourceWorkModeActionDropMask).ShiftRight(SourceWorkModeActionDropShift).Low != 0 decoded.MonitorFlowSequence = uint32(labels.And(MonitorPolicySequenceMask).ShiftRight(MonitorPolicySequenceShift).Low) if decoded.MonitorFlowSequence != 0 { decoded.MonitorFlowID = decoded.MonitorFlowSequence | (uint32(decoded.RoundNumber) << MonitorPolicySequenceLength) diff --git a/ctlabels_test.go b/ctlabels_test.go index 00e9204..80add94 100644 --- a/ctlabels_test.go +++ b/ctlabels_test.go @@ -12,7 +12,7 @@ import ( func TestDecodeMicroSegmentation(t *testing.T) { RegisterTestingT(t) - labelsStr := "0x70001000ae80002a780010e10000000b" + labelsStr := "0x70001000ae80002a780010e10000003b" labels := ctlabels.CTLabelsStrToLittleEndianBytes(labelsStr) Expect(labels).ShouldNot(BeNil()) @@ -21,18 +21,20 @@ func TestDecodeMicroSegmentation(t *testing.T) { jsonStr, err := json.Marshal(decoded) Expect(err).Should(BeNil()) expected := ctlabels.DecodedMicroSegmentationConntrackLabels{ - RoundNumber: 0b1011, - MonitorFlowSequence: 0b1000000000000001000011100001, - MonitorFlowID: 0b1011_1000000000000001000011100001, - WorkFlowSequence: 0b1000000000000000001010100111, - WorkFlowID: 0b1011_1000000000000000001010100111, - OriginPacketSource: ctlabels.PacketSource(0b10), - ReplyPacketSource: ctlabels.PacketSource(0b11), - OriginInport: 0b0000000000001010, - ReplyInport: 0b0000000000000001, - EncodingScheme: ctlabels.EncodingScheme(0b11), - MonitorPolicyActionDrop: true, - WorkPolicyActionDrop: false, + RoundNumber: 0b1011, + TargetWorkModeActionDrop: true, + SourceWorkModeActionDrop: true, + MonitorFlowSequence: 0b1000000000000001000011100001, + MonitorFlowID: 0b1011_1000000000000001000011100001, + WorkFlowSequence: 0b1000000000000000001010100111, + WorkFlowID: 0b1011_1000000000000000001010100111, + OriginPacketSource: ctlabels.PacketSource(0b10), + ReplyPacketSource: ctlabels.PacketSource(0b11), + OriginInport: 0b0000000000001010, + ReplyInport: 0b0000000000000001, + EncodingScheme: ctlabels.EncodingScheme(0b11), + MonitorPolicyActionDrop: true, + WorkPolicyActionDrop: false, } expectJson, err := json.Marshal(expected) Expect(err).Should(Succeed())