Committed by
Gerrit Code Review
ONOS-2926 Sending DHCPNAKs to failed ASSIGN request
Change-Id: I04658313c516934cd946733d8e30093523f83d7e
Showing
1 changed file
with
84 additions
and
66 deletions
1 | /* | 1 | /* |
2 | - * Copyright 2014 Open Networking Laboratory | 2 | + * Copyright 2015 Open Networking Laboratory |
3 | * | 3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | 5 | * you may not use this file except in compliance with the License. |
... | @@ -154,6 +154,8 @@ public class DhcpManager implements DhcpService { | ... | @@ -154,6 +154,8 @@ public class DhcpManager implements DhcpService { |
154 | 154 | ||
155 | private static Ip4Address domainServer = Ip4Address.valueOf("10.0.0.2"); | 155 | private static Ip4Address domainServer = Ip4Address.valueOf("10.0.0.2"); |
156 | 156 | ||
157 | + private static final Ip4Address IP_BROADCAST = Ip4Address.valueOf("255.255.255.255"); | ||
158 | + | ||
157 | protected Timeout timeout; | 159 | protected Timeout timeout; |
158 | 160 | ||
159 | protected static int timerDelay = 2; | 161 | protected static int timerDelay = 2; |
... | @@ -290,12 +292,18 @@ public class DhcpManager implements DhcpService { | ... | @@ -290,12 +292,18 @@ public class DhcpManager implements DhcpService { |
290 | DHCP dhcpPacket = (DHCP) udpPacket.getPayload(); | 292 | DHCP dhcpPacket = (DHCP) udpPacket.getPayload(); |
291 | DHCP dhcpReply = new DHCP(); | 293 | DHCP dhcpReply = new DHCP(); |
292 | dhcpReply.setOpCode(DHCP.OPCODE_REPLY); | 294 | dhcpReply.setOpCode(DHCP.OPCODE_REPLY); |
293 | - | 295 | + dhcpReply.setFlags(dhcpPacket.getFlags()); |
294 | - dhcpReply.setYourIPAddress(ipOffered.toInt()); | 296 | + dhcpReply.setGatewayIPAddress(dhcpPacket.getGatewayIPAddress()); |
295 | - dhcpReply.setServerIPAddress(myIP.toInt()); | ||
296 | - | ||
297 | - dhcpReply.setTransactionId(dhcpPacket.getTransactionId()); | ||
298 | dhcpReply.setClientHardwareAddress(dhcpPacket.getClientHardwareAddress()); | 297 | dhcpReply.setClientHardwareAddress(dhcpPacket.getClientHardwareAddress()); |
298 | + dhcpReply.setTransactionId(dhcpPacket.getTransactionId()); | ||
299 | + | ||
300 | + if (outgoingMessageType != DHCPPacketType.DHCPNAK.getValue()) { | ||
301 | + dhcpReply.setYourIPAddress(ipOffered.toInt()); | ||
302 | + dhcpReply.setServerIPAddress(myIP.toInt()); | ||
303 | + if (dhcpPacket.getGatewayIPAddress() == 0) { | ||
304 | + ipv4Reply.setDestinationAddress(IP_BROADCAST.toInt()); | ||
305 | + } | ||
306 | + } | ||
299 | dhcpReply.setHardwareType(DHCP.HWTYPE_ETHERNET); | 307 | dhcpReply.setHardwareType(DHCP.HWTYPE_ETHERNET); |
300 | dhcpReply.setHardwareAddressLength((byte) 6); | 308 | dhcpReply.setHardwareAddressLength((byte) 6); |
301 | 309 | ||
... | @@ -317,54 +325,57 @@ public class DhcpManager implements DhcpService { | ... | @@ -317,54 +325,57 @@ public class DhcpManager implements DhcpService { |
317 | option.setData(myIP.toOctets()); | 325 | option.setData(myIP.toOctets()); |
318 | optionList.add(option); | 326 | optionList.add(option); |
319 | 327 | ||
320 | - // IP Address Lease Time. | 328 | + if (outgoingMessageType != DHCPPacketType.DHCPNAK.getValue()) { |
321 | - option = new DHCPOption(); | 329 | + |
322 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_LeaseTime.getValue()); | 330 | + // IP Address Lease Time. |
323 | - option.setLength((byte) 4); | 331 | + option = new DHCPOption(); |
324 | - option.setData(ByteBuffer.allocate(4).putInt(leaseTime).array()); | 332 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_LeaseTime.getValue()); |
325 | - optionList.add(option); | 333 | + option.setLength((byte) 4); |
326 | - | 334 | + option.setData(ByteBuffer.allocate(4).putInt(leaseTime).array()); |
327 | - // IP Address Renewal Time. | 335 | + optionList.add(option); |
328 | - option = new DHCPOption(); | 336 | + |
329 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_RenewalTime.getValue()); | 337 | + // IP Address Renewal Time. |
330 | - option.setLength((byte) 4); | 338 | + option = new DHCPOption(); |
331 | - option.setData(ByteBuffer.allocate(4).putInt(renewalTime).array()); | 339 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_RenewalTime.getValue()); |
332 | - optionList.add(option); | 340 | + option.setLength((byte) 4); |
333 | - | 341 | + option.setData(ByteBuffer.allocate(4).putInt(renewalTime).array()); |
334 | - // IP Address Rebinding Time. | 342 | + optionList.add(option); |
335 | - option = new DHCPOption(); | 343 | + |
336 | - option.setCode(DHCP.DHCPOptionCode.OPtionCode_RebindingTime.getValue()); | 344 | + // IP Address Rebinding Time. |
337 | - option.setLength((byte) 4); | 345 | + option = new DHCPOption(); |
338 | - option.setData(ByteBuffer.allocate(4).putInt(rebindingTime).array()); | 346 | + option.setCode(DHCP.DHCPOptionCode.OPtionCode_RebindingTime.getValue()); |
339 | - optionList.add(option); | 347 | + option.setLength((byte) 4); |
340 | - | 348 | + option.setData(ByteBuffer.allocate(4).putInt(rebindingTime).array()); |
341 | - // Subnet Mask. | 349 | + optionList.add(option); |
342 | - option = new DHCPOption(); | 350 | + |
343 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_SubnetMask.getValue()); | 351 | + // Subnet Mask. |
344 | - option.setLength((byte) 4); | 352 | + option = new DHCPOption(); |
345 | - option.setData(subnetMask.toOctets()); | 353 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_SubnetMask.getValue()); |
346 | - optionList.add(option); | 354 | + option.setLength((byte) 4); |
347 | - | 355 | + option.setData(subnetMask.toOctets()); |
348 | - // Broadcast Address. | 356 | + optionList.add(option); |
349 | - option = new DHCPOption(); | 357 | + |
350 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_BroadcastAddress.getValue()); | 358 | + // Broadcast Address. |
351 | - option.setLength((byte) 4); | 359 | + option = new DHCPOption(); |
352 | - option.setData(broadcastAddress.toOctets()); | 360 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_BroadcastAddress.getValue()); |
353 | - optionList.add(option); | 361 | + option.setLength((byte) 4); |
354 | - | 362 | + option.setData(broadcastAddress.toOctets()); |
355 | - // Router Address. | 363 | + optionList.add(option); |
356 | - option = new DHCPOption(); | 364 | + |
357 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_RouterAddress.getValue()); | 365 | + // Router Address. |
358 | - option.setLength((byte) 4); | 366 | + option = new DHCPOption(); |
359 | - option.setData(routerAddress.toOctets()); | 367 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_RouterAddress.getValue()); |
360 | - optionList.add(option); | 368 | + option.setLength((byte) 4); |
361 | - | 369 | + option.setData(routerAddress.toOctets()); |
362 | - // DNS Server Address. | 370 | + optionList.add(option); |
363 | - option = new DHCPOption(); | 371 | + |
364 | - option.setCode(DHCP.DHCPOptionCode.OptionCode_DomainServer.getValue()); | 372 | + // DNS Server Address. |
365 | - option.setLength((byte) 4); | 373 | + option = new DHCPOption(); |
366 | - option.setData(domainServer.toOctets()); | 374 | + option.setCode(DHCP.DHCPOptionCode.OptionCode_DomainServer.getValue()); |
367 | - optionList.add(option); | 375 | + option.setLength((byte) 4); |
376 | + option.setData(domainServer.toOctets()); | ||
377 | + optionList.add(option); | ||
378 | + } | ||
368 | 379 | ||
369 | // End Option. | 380 | // End Option. |
370 | option = new DHCPOption(); | 381 | option = new DHCPOption(); |
... | @@ -447,37 +458,44 @@ public class DhcpManager implements DhcpService { | ... | @@ -447,37 +458,44 @@ public class DhcpManager implements DhcpService { |
447 | 458 | ||
448 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPREQUEST.getValue()) { | 459 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPREQUEST.getValue()) { |
449 | 460 | ||
450 | - outgoingPacketType = DHCPPacketType.DHCPACK; | ||
451 | - | ||
452 | if (flagIfServerIP && flagIfRequestedIP) { | 461 | if (flagIfServerIP && flagIfRequestedIP) { |
453 | // SELECTING state | 462 | // SELECTING state |
454 | - if (myIP.equals(serverIP) && | 463 | + if (myIP.equals(serverIP)) { |
455 | - dhcpStore.assignIP(hostId, requestedIP, leaseTime)) { | ||
456 | 464 | ||
457 | - Ethernet ethReply = buildReply(packet, requestedIP, | 465 | + if (dhcpStore.assignIP(hostId, requestedIP, leaseTime)) { |
458 | - (byte) outgoingPacketType.getValue()); | 466 | + outgoingPacketType = DHCPPacketType.DHCPACK; |
467 | + discoverHost(context, requestedIP); | ||
468 | + } else { | ||
469 | + outgoingPacketType = DHCPPacketType.DHCPNAK; | ||
470 | + } | ||
471 | + Ethernet ethReply = buildReply(packet, requestedIP, (byte) outgoingPacketType.getValue()); | ||
459 | sendReply(context, ethReply); | 472 | sendReply(context, ethReply); |
460 | - discoverHost(context, requestedIP); | ||
461 | } | 473 | } |
462 | } else if (flagIfRequestedIP) { | 474 | } else if (flagIfRequestedIP) { |
463 | // INIT-REBOOT state | 475 | // INIT-REBOOT state |
464 | if (dhcpStore.assignIP(hostId, requestedIP, leaseTime)) { | 476 | if (dhcpStore.assignIP(hostId, requestedIP, leaseTime)) { |
465 | - Ethernet ethReply = buildReply(packet, requestedIP, | 477 | + outgoingPacketType = DHCPPacketType.DHCPACK; |
466 | - (byte) outgoingPacketType.getValue()); | 478 | + Ethernet ethReply = buildReply(packet, requestedIP, (byte) outgoingPacketType.getValue()); |
467 | sendReply(context, ethReply); | 479 | sendReply(context, ethReply); |
468 | discoverHost(context, requestedIP); | 480 | discoverHost(context, requestedIP); |
469 | } | 481 | } |
482 | + | ||
470 | } else { | 483 | } else { |
471 | // RENEWING and REBINDING state | 484 | // RENEWING and REBINDING state |
472 | int ciaadr = dhcpPayload.getClientIPAddress(); | 485 | int ciaadr = dhcpPayload.getClientIPAddress(); |
473 | if (ciaadr != 0) { | 486 | if (ciaadr != 0) { |
474 | Ip4Address clientIaddr = Ip4Address.valueOf(ciaadr); | 487 | Ip4Address clientIaddr = Ip4Address.valueOf(ciaadr); |
475 | if (dhcpStore.assignIP(hostId, clientIaddr, leaseTime)) { | 488 | if (dhcpStore.assignIP(hostId, clientIaddr, leaseTime)) { |
476 | - Ethernet ethReply = buildReply(packet, clientIaddr, | 489 | + outgoingPacketType = DHCPPacketType.DHCPACK; |
477 | - (byte) outgoingPacketType.getValue()); | ||
478 | - sendReply(context, ethReply); | ||
479 | discoverHost(context, clientIaddr); | 490 | discoverHost(context, clientIaddr); |
491 | + } else if (packet.getEtherType() == Ethernet.TYPE_IPV4 && | ||
492 | + ((IPv4) packet.getPayload()).getDestinationAddress() == myIP.toInt()) { | ||
493 | + outgoingPacketType = DHCPPacketType.DHCPNAK; | ||
494 | + } else { | ||
495 | + return; | ||
480 | } | 496 | } |
497 | + Ethernet ethReply = buildReply(packet, clientIaddr, (byte) outgoingPacketType.getValue()); | ||
498 | + sendReply(context, ethReply); | ||
481 | } | 499 | } |
482 | } | 500 | } |
483 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPRELEASE.getValue()) { | 501 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPRELEASE.getValue()) { | ... | ... |
-
Please register or login to post a comment