tom

Merge remote-tracking branch 'origin/master'

...@@ -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 }
......
...@@ -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...
......