func (p *GoPacketProbesHandler) RegisterProbe(n *graph.Node, capture *api.Capture, ft *flow.Table) error { name, ok := n.Metadata()["Name"] if !ok || name == "" { return fmt.Errorf("No name for node %v", n) } encapType, ok := n.Metadata()["EncapType"] if !ok || encapType == "" { return fmt.Errorf("No EncapType for node %v", n) } tid, ok := n.Metadata()["TID"] if !ok { return fmt.Errorf("No TID for node %v", n) } id := string(n.ID) ifName := name.(string) if _, ok = p.probes[id]; ok { return fmt.Errorf("Already registered %s", ifName) } port, ok := n.Metadata()["MPLSUDPPort"].(int) if ok { // All gopacket instance of this agent will classify UDP packets coming // from UDP port MPLSUDPPort as MPLS whatever the source interface layers.RegisterUDPPortLayerType(layers.UDPPort(port), layers.LayerTypeMPLS) logging.GetLogger().Infof("MPLSoUDP port: %v", port) } probe := &GoPacketProbe{ NodeTID: tid.(string), state: common.StoppedState, flowTable: ft, } p.probesLock.Lock() p.probes[id] = probe p.probesLock.Unlock() p.wg.Add(1) go func() { defer p.wg.Done() probe.run(p.graph, n, capture) }() return nil }
func TestFlowEncaspulationMplsUdp(t *testing.T) { layers.RegisterUDPPortLayerType(layers.UDPPort(444), layers.LayerTypeMPLS) table := NewTable(nil, nil) packet := forgeTestPacket(t, 64, false, ETH, IPv4, UDP_MPLS, MPLS, IPv4, TCP) flowPackets := FlowPacketsFromGoPacket(packet, 0) table.FlowPacketsToFlow(flowPackets) flows := table.GetFlows(nil).GetFlows() if len(flows) != 2 { t.Error("An MPLSoUDP packet must generate 2 flows") } flows = sortFlowByRelationship(flows) if flows[0].LayersPath != "Ethernet/IPv4/UDP/MPLS" || flows[1].LayersPath != "IPv4/TCP/Payload" { t.Errorf("Flows LayersPath must be Ethernet/IPv4/UDP/MPLS | IPv4/TCP/Payload") } }