Showing
2 changed files
with
27 additions
and
15 deletions
... | @@ -28,7 +28,7 @@ import com.google.common.collect.Lists; | ... | @@ -28,7 +28,7 @@ import com.google.common.collect.Lists; |
28 | 28 | ||
29 | 29 | ||
30 | /** | 30 | /** |
31 | - * Sample reactive forwarding application. | 31 | + * Sample mobility application. Cleans up flowmods when a host moves. |
32 | */ | 32 | */ |
33 | @Component(immediate = true) | 33 | @Component(immediate = true) |
34 | public class HostMobility { | 34 | public class HostMobility { |
... | @@ -82,6 +82,10 @@ public class HostMobility { | ... | @@ -82,6 +82,10 @@ public class HostMobility { |
82 | 82 | ||
83 | } | 83 | } |
84 | 84 | ||
85 | + /** | ||
86 | + * For a given host, remove any flow rule which references it's addresses. | ||
87 | + * @param host the host to clean up for | ||
88 | + */ | ||
85 | private void cleanup(Host host) { | 89 | private void cleanup(Host host) { |
86 | Iterable<Device> devices = deviceService.getDevices(); | 90 | Iterable<Device> devices = deviceService.getDevices(); |
87 | List<FlowRule> flowRules = Lists.newLinkedList(); | 91 | List<FlowRule> flowRules = Lists.newLinkedList(); |
... | @@ -102,7 +106,6 @@ public class HostMobility { | ... | @@ -102,7 +106,6 @@ public class HostMobility { |
102 | EthCriterion eth = (EthCriterion) c; | 106 | EthCriterion eth = (EthCriterion) c; |
103 | if (eth.mac().equals(mac)) { | 107 | if (eth.mac().equals(mac)) { |
104 | flowRules.add(rule); | 108 | flowRules.add(rule); |
105 | - break; | ||
106 | } | 109 | } |
107 | } | 110 | } |
108 | } | 111 | } | ... | ... |
providers/openflow/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java
... | @@ -31,6 +31,7 @@ import org.onlab.onos.openflow.controller.OpenFlowPacketContext; | ... | @@ -31,6 +31,7 @@ import org.onlab.onos.openflow.controller.OpenFlowPacketContext; |
31 | import org.onlab.onos.openflow.controller.PacketListener; | 31 | import org.onlab.onos.openflow.controller.PacketListener; |
32 | import org.onlab.packet.ARP; | 32 | import org.onlab.packet.ARP; |
33 | import org.onlab.packet.Ethernet; | 33 | import org.onlab.packet.Ethernet; |
34 | +import org.onlab.packet.IPv4; | ||
34 | import org.onlab.packet.IpPrefix; | 35 | import org.onlab.packet.IpPrefix; |
35 | import org.onlab.packet.VlanId; | 36 | import org.onlab.packet.VlanId; |
36 | import org.slf4j.Logger; | 37 | import org.slf4j.Logger; |
... | @@ -92,29 +93,37 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid | ... | @@ -92,29 +93,37 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid |
92 | public void handlePacket(OpenFlowPacketContext pktCtx) { | 93 | public void handlePacket(OpenFlowPacketContext pktCtx) { |
93 | Ethernet eth = pktCtx.parsed(); | 94 | Ethernet eth = pktCtx.parsed(); |
94 | 95 | ||
96 | + VlanId vlan = VlanId.vlanId(eth.getVlanID()); | ||
97 | + ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())), | ||
98 | + portNumber(pktCtx.inPort())); | ||
99 | + | ||
100 | + // If this is not an edge port, bail out. | ||
101 | + Topology topology = topologyService.currentTopology(); | ||
102 | + if (topologyService.isInfrastructure(topology, heardOn)) { | ||
103 | + return; | ||
104 | + } | ||
105 | + | ||
106 | + HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())), | ||
107 | + portNumber(pktCtx.inPort()), | ||
108 | + System.currentTimeMillis()); | ||
109 | + HostId hid = HostId.hostId(eth.getSourceMAC(), vlan); | ||
95 | // Potentially a new or moved host | 110 | // Potentially a new or moved host |
96 | if (eth.getEtherType() == Ethernet.TYPE_ARP) { | 111 | if (eth.getEtherType() == Ethernet.TYPE_ARP) { |
97 | - VlanId vlan = VlanId.vlanId(eth.getVlanID()); | ||
98 | - ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())), | ||
99 | - portNumber(pktCtx.inPort())); | ||
100 | - | ||
101 | - // If this is not an edge port, bail out. | ||
102 | - Topology topology = topologyService.currentTopology(); | ||
103 | - if (topologyService.isInfrastructure(topology, heardOn)) { | ||
104 | - return; | ||
105 | - } | ||
106 | 112 | ||
107 | - HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())), | ||
108 | - portNumber(pktCtx.inPort()), | ||
109 | - System.currentTimeMillis()); | ||
110 | 113 | ||
111 | - HostId hid = HostId.hostId(eth.getSourceMAC(), vlan); | ||
112 | ARP arp = (ARP) eth.getPayload(); | 114 | ARP arp = (ARP) eth.getPayload(); |
113 | Set<IpPrefix> ips = newHashSet(IpPrefix.valueOf(arp.getSenderProtocolAddress())); | 115 | Set<IpPrefix> ips = newHashSet(IpPrefix.valueOf(arp.getSenderProtocolAddress())); |
114 | HostDescription hdescr = | 116 | HostDescription hdescr = |
115 | new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ips); | 117 | new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ips); |
116 | providerService.hostDetected(hid, hdescr); | 118 | providerService.hostDetected(hid, hdescr); |
117 | 119 | ||
120 | + } else if (eth.getEtherType() == Ethernet.TYPE_IPV4) { | ||
121 | + IPv4 ip = (IPv4) eth.getPayload(); | ||
122 | + Set<IpPrefix> ips = newHashSet(IpPrefix.valueOf(ip.getSourceAddress())); | ||
123 | + HostDescription hdescr = | ||
124 | + new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ips); | ||
125 | + providerService.hostDetected(hid, hdescr); | ||
126 | + | ||
118 | } | 127 | } |
119 | 128 | ||
120 | // TODO: Use DHCP packets as well later... | 129 | // TODO: Use DHCP packets as well later... | ... | ... |
-
Please register or login to post a comment