func (d *of10Driver) nomMatch(m of10.Match) (nom.Match, error) { nm := nom.Match{} wc := of10.FlowWildcards(m.Wildcards()) if wc&of10.PFW_IN_PORT == 0 { ofp := m.InPort() nomp, ok := d.ofPorts[ofp] if !ok { return nom.Match{}, fmt.Errorf("of10Driver: cannot find port %v", ofp) } nm.AddField(nom.InPort(nomp.UID())) } if wc&of10.PFW_DL_SRC == 0 { nm.AddField(nom.EthSrc{ Addr: m.DlSrc(), Mask: nom.MaskNoneMAC, }) } if wc&of10.PFW_DL_DST == 0 { nm.AddField(nom.EthDst{ Addr: m.DlDst(), Mask: nom.MaskNoneMAC, }) } if wc&of10.PFW_DL_TYPE == 0 { nm.AddField(nom.EthType(m.DlType())) } if wc&of10.PFW_NW_SRC_MASK != of10.PFW_NW_SRC_ALL && m.NwSrc() != 0 { mask := uint(wc&of10.PFW_NW_SRC_MASK) >> uint(of10.PFW_NW_SRC_SHIFT) nm.AddField(nom.IPv4Src(nom.CIDRToMaskedIPv4(m.NwSrc(), mask))) } if wc&of10.PFW_NW_DST_MASK != of10.PFW_NW_DST_ALL && m.NwDst() != 0 { mask := uint(wc&of10.PFW_NW_DST_MASK) >> uint(of10.PFW_NW_DST_SHIFT) nm.AddField(nom.IPv4Dst(nom.CIDRToMaskedIPv4(m.NwDst(), mask))) } if wc&of10.PFW_TP_SRC == 0 { nm.AddField(nom.TransportPortSrc(m.TpSrc())) } if wc&of10.PFW_TP_DST == 0 { nm.AddField(nom.TransportPortDst(m.TpDst())) } return nm, nil }
func (h *nodeJoinedHandler) Rcv(msg bh.Msg, ctx bh.RcvContext) error { joined := msg.Data().(nom.NodeJoined) d := ctx.Dict(nodeDict) n := nom.Node(joined) k := string(n.UID()) var np nodePortsAndLinks if v, err := d.Get(k); err != nil { glog.Warningf("%v rejoins", n) } else { np = v.(nodePortsAndLinks) } np.N = n // Add a flow entry to forward arp packets to the controller mt := nom.Match{} mt.AddField(nom.EthType(nom.EthTypeARP)) acs := []nom.Action{ nom.ActionSendToController{ MaxLen: 0xffff, }, } fe := nom.FlowEntry{ ID: "Discovery-Host-ARP", Node: n.UID(), Priority: 0, Match: mt, Actions: acs, } afe := nom.AddFlowEntry{ Flow: fe, Subscriber: bh.AppCellKey{ App: ctx.App(), Key: k, Dict: nodeDict, }, } ctx.Emit(afe) // Add a flow entry to forward lldp packets to the controller mt = nom.Match{} mt.AddField(nom.EthType(nom.EthTypeLLDP)) acs = []nom.Action{ nom.ActionSendToController{ MaxLen: 0xffff, }, } fe = nom.FlowEntry{ ID: "Discovery-Topo-LLDP", Node: n.UID(), Priority: 0, Match: mt, Actions: acs, } afe = nom.AddFlowEntry{ Flow: fe, Subscriber: bh.AppCellKey{ App: ctx.App(), Key: k, Dict: nodeDict, }, } ctx.Emit(afe) return d.Put(k, np) }
func (d *of12Driver) nomMatch(m of12.Match) (nom.Match, error) { nm := nom.Match{} if !of12.IsOXMatch(m) { return nm, fmt.Errorf("of12Driver: std math is not supported") } xm, err := of12.ToOXMatch(m) if err != nil { return nm, err } for _, f := range xm.Fields() { if of12.IsOxmInPort(f) { xf, err := of12.ToOxmInPort(f) if err != nil { return nom.Match{}, err } np, ok := d.ofPorts[xf.InPort()] if !ok { return nom.Match{}, fmt.Errorf("of12Driver-Match: cannot find port %v", xf.InPort()) } nm.AddField(nom.InPort(np.UID())) } if of12.IsOxmEthType(f) { xf, err := of12.ToOxmEthType(f) if err != nil { return nom.Match{}, err } nm.AddField(nom.EthType(xf.Type())) } if of12.IsOxmEthSrc(f) { xf, err := of12.ToOxmEthSrc(f) if err != nil { return nom.Match{}, err } nf := nom.EthSrc{} nf.Addr = xf.MacAddr() nf.Mask = nom.MaskNoneMAC nm.AddField(nf) } switch f.OxmField() { case uint8(of12.PXMT_ETH_SRC_MASKED): xf, err := of12.ToOxmEthSrcMasked(f) if err != nil { return nom.Match{}, err } nf := nom.EthSrc{} nf.Addr = xf.MacAddr() nf.Mask = xf.Mask() nm.AddField(nf) case uint8(of12.PXMT_ETH_DST): xf, err := of12.ToOxmEthDst(f) if err != nil { return nom.Match{}, err } nf := nom.EthDst{} nf.Addr = xf.MacAddr() nf.Mask = nom.MaskNoneMAC nm.AddField(nf) case uint8(of12.PXMT_ETH_DST_MASKED): xf, err := of12.ToOxmEthDstMasked(f) if err != nil { return nom.Match{}, err } nf := nom.EthDst{} nf.Addr = xf.MacAddr() nf.Mask = xf.Mask() nm.AddField(nf) case uint8(of12.PXMT_IP_PROTO): xf, err := of12.ToOxmIpProto(f) if err != nil { return nom.Match{}, err } nm.AddField(nom.IPProto(xf.Proto())) case uint8(of12.PXMT_IPV4_SRC): xf, err := of12.ToOxmIpV4Src(f) if err != nil { return nom.Match{}, err } nf := nom.IPv4Src{} nf.Addr = nom.IPv4Addr(xf.Addr()) nf.Mask = nom.MaskNoneIPV4 nm.AddField(nf) case uint8(of12.PXMT_IPV4_SRC_MASKED): xf, err := of12.ToOxmIpV4SrcMasked(f) if err != nil { return nom.Match{}, err } nf := nom.IPv4Src{} nf.Addr = nom.IPv4Addr(xf.Addr()) nf.Mask = nom.IPv4Addr(xf.Mask()) nm.AddField(nf) case uint8(of12.PXMT_IPV4_DST): xf, err := of12.ToOxmIpV4Dst(f) if err != nil { return nom.Match{}, err } nf := nom.IPv4Dst{} nf.Addr = nom.IPv4Addr(xf.Addr()) nf.Mask = nom.MaskNoneIPV4 nm.AddField(nf) case uint8(of12.PXMT_IPV4_DST_MASKED): xf, err := of12.ToOxmIpV4DstMasked(f) if err != nil { return nom.Match{}, err } nf := nom.IPv4Dst{} nf.Addr = nom.IPv4Addr(xf.Addr()) nf.Mask = nom.IPv4Addr(xf.Mask()) nm.AddField(nf) case uint8(of12.PXMT_IPV6_SRC): xf, err := of12.ToOxmIpV6Src(f) if err != nil { return nom.Match{}, err } nf := nom.IPv6Src{} nf.Addr = nom.IPv6Addr(xf.Addr()) nf.Mask = nom.MaskNoneIPV6 nm.AddField(nf) case uint8(of12.PXMT_IPV6_SRC_MASKED): xf, err := of12.ToOxmIpV6SrcMasked(f) if err != nil { return nom.Match{}, err } nf := nom.IPv6Src{} nf.Addr = nom.IPv6Addr(xf.Addr()) nf.Mask = nom.IPv6Addr(xf.Mask()) nm.AddField(nf) case uint8(of12.PXMT_IPV6_DST): xf, err := of12.ToOxmIpV6Dst(f) if err != nil { return nom.Match{}, err } nf := nom.IPv6Dst{} nf.Addr = nom.IPv6Addr(xf.Addr()) nf.Mask = nom.MaskNoneIPV6 nm.AddField(nf) case uint8(of12.PXMT_IPV6_DST_MASKED): xf, err := of12.ToOxmIpV6DstMasked(f) if err != nil { return nom.Match{}, err } nf := nom.IPv6Dst{} nf.Addr = nom.IPv6Addr(xf.Addr()) nf.Mask = nom.IPv6Addr(xf.Mask()) nm.AddField(nf) case uint8(of12.PXMT_TCP_SRC): xf, err := of12.ToOxmTcpSrc(f) if err != nil { return nom.Match{}, err } nm.AddField(nom.TransportPortSrc(xf.Port())) case uint8(of12.PXMT_TCP_DST): xf, err := of12.ToOxmTcpDst(f) if err != nil { return nom.Match{}, err } nm.AddField(nom.TransportPortDst(xf.Port())) } } return nm, nil }