Charles Chan
Committed by Gerrit Code Review

Fix possible concurrency flaws in ArpHandler

Change-Id: I7e869453aefa580246af593c211aa98fb417f5cc
...@@ -88,7 +88,6 @@ public class ArpHandler { ...@@ -88,7 +88,6 @@ public class ArpHandler {
88 } 88 }
89 89
90 private void handleArpRequest(DeviceId deviceId, ConnectPoint inPort, Ethernet payload) { 90 private void handleArpRequest(DeviceId deviceId, ConnectPoint inPort, Ethernet payload) {
91 -
92 ARP arpRequest = (ARP) payload.getPayload(); 91 ARP arpRequest = (ARP) payload.getPayload();
93 HostId targetHostId = HostId.hostId(MacAddress.valueOf( 92 HostId targetHostId = HostId.hostId(MacAddress.valueOf(
94 arpRequest.getTargetHardwareAddress())); 93 arpRequest.getTargetHardwareAddress()));
...@@ -98,16 +97,18 @@ public class ArpHandler { ...@@ -98,16 +97,18 @@ public class ArpHandler {
98 Ip4Address targetAddress = Ip4Address.valueOf(arpRequest.getTargetProtocolAddress()); 97 Ip4Address targetAddress = Ip4Address.valueOf(arpRequest.getTargetProtocolAddress());
99 98
100 sendArpResponse(arpRequest, config.getRouterMacForAGatewayIp(targetAddress)); 99 sendArpResponse(arpRequest, config.getRouterMacForAGatewayIp(targetAddress));
100 + } else {
101 + Host targetHost = srManager.hostService.getHost(targetHostId);
101 // ARP request for known hosts 102 // ARP request for known hosts
102 - } else if (srManager.hostService.getHost(targetHostId) != null) { 103 + if (targetHost != null) {
103 - MacAddress targetMac = srManager.hostService.getHost(targetHostId).mac(); 104 + sendArpResponse(arpRequest, targetHost.mac());
104 - sendArpResponse(arpRequest, targetMac);
105 105
106 // ARP request for unknown host in the subnet 106 // ARP request for unknown host in the subnet
107 } else if (isArpReqForSubnet(deviceId, arpRequest)) { 107 } else if (isArpReqForSubnet(deviceId, arpRequest)) {
108 flood(payload, inPort); 108 flood(payload, inPort);
109 } 109 }
110 } 110 }
111 + }
111 112
112 113
113 private boolean isArpReqForRouter(DeviceId deviceId, ARP arpRequest) { 114 private boolean isArpReqForRouter(DeviceId deviceId, ARP arpRequest) {
......