Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 37 additions & 27 deletions ctlabels.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

*/

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
)

Expand Down Expand Up @@ -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)
Expand Down
28 changes: 15 additions & 13 deletions ctlabels_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

func TestDecodeMicroSegmentation(t *testing.T) {
RegisterTestingT(t)
labelsStr := "0x70001000ae80002a780010e10000000b"
labelsStr := "0x70001000ae80002a780010e10000003b"
labels := ctlabels.CTLabelsStrToLittleEndianBytes(labelsStr)
Expect(labels).ShouldNot(BeNil())

Expand All @@ -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())
Expand Down
Loading