Committed by
Gerrit Code Review
ONOS-2926 Sending DHCPNAKs to failed ASSIGN request
Change-Id: I04658313c516934cd946733d8e30093523f83d7e
Showing
1 changed file
with
34 additions
and
16 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); |
| 295 | + dhcpReply.setFlags(dhcpPacket.getFlags()); | ||
| 296 | + dhcpReply.setGatewayIPAddress(dhcpPacket.getGatewayIPAddress()); | ||
| 297 | + dhcpReply.setClientHardwareAddress(dhcpPacket.getClientHardwareAddress()); | ||
| 298 | + dhcpReply.setTransactionId(dhcpPacket.getTransactionId()); | ||
| 293 | 299 | ||
| 300 | + if (outgoingMessageType != DHCPPacketType.DHCPNAK.getValue()) { | ||
| 294 | dhcpReply.setYourIPAddress(ipOffered.toInt()); | 301 | dhcpReply.setYourIPAddress(ipOffered.toInt()); |
| 295 | dhcpReply.setServerIPAddress(myIP.toInt()); | 302 | dhcpReply.setServerIPAddress(myIP.toInt()); |
| 296 | - | 303 | + if (dhcpPacket.getGatewayIPAddress() == 0) { |
| 297 | - dhcpReply.setTransactionId(dhcpPacket.getTransactionId()); | 304 | + ipv4Reply.setDestinationAddress(IP_BROADCAST.toInt()); |
| 298 | - dhcpReply.setClientHardwareAddress(dhcpPacket.getClientHardwareAddress()); | 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,6 +325,8 @@ public class DhcpManager implements DhcpService { | ... | @@ -317,6 +325,8 @@ 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 | ||
| 328 | + if (outgoingMessageType != DHCPPacketType.DHCPNAK.getValue()) { | ||
| 329 | + | ||
| 320 | // IP Address Lease Time. | 330 | // IP Address Lease Time. |
| 321 | option = new DHCPOption(); | 331 | option = new DHCPOption(); |
| 322 | option.setCode(DHCP.DHCPOptionCode.OptionCode_LeaseTime.getValue()); | 332 | option.setCode(DHCP.DHCPOptionCode.OptionCode_LeaseTime.getValue()); |
| ... | @@ -365,6 +375,7 @@ public class DhcpManager implements DhcpService { | ... | @@ -365,6 +375,7 @@ public class DhcpManager implements DhcpService { |
| 365 | option.setLength((byte) 4); | 375 | option.setLength((byte) 4); |
| 366 | option.setData(domainServer.toOctets()); | 376 | option.setData(domainServer.toOctets()); |
| 367 | optionList.add(option); | 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; |
| 459 | - sendReply(context, ethReply); | ||
| 460 | discoverHost(context, requestedIP); | 467 | discoverHost(context, requestedIP); |
| 468 | + } else { | ||
| 469 | + outgoingPacketType = DHCPPacketType.DHCPNAK; | ||
| 470 | + } | ||
| 471 | + Ethernet ethReply = buildReply(packet, requestedIP, (byte) outgoingPacketType.getValue()); | ||
| 472 | + sendReply(context, ethReply); | ||
| 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