use of org.onlab.packet.dhcp.Dhcp6IaAddressOption in project onos by opennetworkinglab.
the class Dhcp6HandlerImpl method handleLeaseQuery6ReplyMsg.
public void handleLeaseQuery6ReplyMsg(PacketContext context, DHCP6 dhcp6Payload) {
ConnectPoint inPort = context.inPacket().receivedFrom();
log.info("Got LQV6-REPLY on port {}", inPort);
List<Dhcp6Option> lopt = dhcp6Payload.getOptions();
log.info("Options list: {}", lopt);
// find out if this lease is known is
Dhcp6ClientDataOption clientDataOption = dhcp6Payload.getOptions().stream().filter(opt -> opt instanceof Dhcp6ClientDataOption).map(pld -> (Dhcp6ClientDataOption) pld).findFirst().orElse(null);
if (clientDataOption == null) {
log.warn("clientDataOption option is not present, " + "lease is UNKNOWN - not adding any new route...");
} else {
Dhcp6IaAddressOption aiAddressOption = clientDataOption.getOptions().stream().filter(opt -> opt instanceof Dhcp6IaAddressOption).map(pld -> (Dhcp6IaAddressOption) pld).findFirst().orElse(null);
Dhcp6ClientIdOption clientIdOption = clientDataOption.getOptions().stream().filter(opt -> opt instanceof Dhcp6ClientIdOption).map(pld -> (Dhcp6ClientIdOption) pld).findFirst().orElse(null);
if (aiAddressOption == null) {
log.warn("clientDataOption from DHCP server does not " + "contains Dhcp6IaAddressOption for the client - giving up...");
} else {
Ip6Address clientAddress = aiAddressOption.getIp6Address();
MacAddress clientMacAddress = MacAddress.valueOf(clientIdOption.getDuid().getLinkLayerAddress());
Ethernet packet = context.inPacket().parsed();
VlanId vlanId = VlanId.vlanId(packet.getVlanID());
MacAddress potentialNextHopMac = findNextHopMacForIp6FromRelayStore(clientAddress, clientMacAddress, vlanId);
if (potentialNextHopMac == null) {
log.warn("Can't find next hop host mac for client {} mac:{}/{}", clientAddress, clientMacAddress, vlanId);
return;
} else {
log.info("Next hop mac for {}/{}/{} is {}", clientAddress, clientMacAddress, vlanId, potentialNextHopMac.toString());
}
// search the next hop in the hosts store
HostId gwHostId = HostId.hostId(potentialNextHopMac, vlanId);
Host gwHost = hostService.getHost(gwHostId);
if (gwHost == null) {
log.warn("Can't find next hop host ID {}", gwHostId);
return;
}
Ip6Address nextHopIp = gwHost.ipAddresses().stream().filter(IpAddress::isIp6).filter(IpAddress::isLinkLocal).map(IpAddress::getIp6Address).findFirst().orElse(null);
if (nextHopIp == null) {
log.warn("Can't find IP6 address of next hop {}", gwHost);
return;
}
log.info("client " + clientAddress + " is known !");
Route routeForIP6 = new Route(Route.Source.DHCP, clientAddress.toIpPrefix(), nextHopIp);
log.debug("updating route of Client for indirectly connected.");
log.debug("client ip: " + clientAddress + ", next hop ip6: " + nextHopIp);
routeStore.updateRoute(routeForIP6);
}
}
}
use of org.onlab.packet.dhcp.Dhcp6IaAddressOption in project onos by opennetworkinglab.
the class DhcpRelayManagerTest method buildDhcp6Packet.
/**
* Generates DHCP6 REQUEST packet.
*/
private void buildDhcp6Packet(DHCP6 dhcp6, byte msgType, Ip6Address ip6Addr, IpPrefix prefix) {
// build address option
Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
iaAddressOption.setCode(DHCP6.OptionCode.IAADDR.value());
iaAddressOption.setIp6Address(ip6Addr);
iaAddressOption.setPreferredLifetime(3600);
iaAddressOption.setValidLifetime(1200);
iaAddressOption.setLength((short) Dhcp6IaAddressOption.DEFAULT_LEN);
Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
Dhcp6Duid dhcp6Duip = new Dhcp6Duid();
dhcp6Duip.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
// Ethernet
dhcp6Duip.setHardwareType((short) 0x01);
dhcp6Duip.setDuidTime(1234);
dhcp6Duip.setLinkLayerAddress(CLIENT_MAC.toBytes());
clientIdOption.setDuid(dhcp6Duip);
Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
iaNaOption.setCode(DHCP6.OptionCode.IA_NA.value());
iaNaOption.setIaId(0);
iaNaOption.setT1(302400);
iaNaOption.setT2(483840);
List<Dhcp6Option> iaNaSubOptions = new ArrayList<Dhcp6Option>();
iaNaSubOptions.add(iaAddressOption);
iaNaOption.setOptions(iaNaSubOptions);
iaNaOption.setLength((short) (Dhcp6IaNaOption.DEFAULT_LEN + iaAddressOption.getLength()));
// build prefix option
Dhcp6IaPrefixOption iaPrefixOption = new Dhcp6IaPrefixOption();
iaPrefixOption.setCode(DHCP6.OptionCode.IAPREFIX.value());
iaPrefixOption.setIp6Prefix(prefix.address().getIp6Address());
iaPrefixOption.setPrefixLength((byte) prefix.prefixLength());
iaPrefixOption.setPreferredLifetime(3601);
iaPrefixOption.setValidLifetime(1201);
iaPrefixOption.setLength((short) Dhcp6IaPrefixOption.DEFAULT_LEN);
Dhcp6IaPdOption iaPdOption = new Dhcp6IaPdOption();
iaPdOption.setCode(DHCP6.OptionCode.IA_PD.value());
iaPdOption.setIaId(0);
iaPdOption.setT1(302401);
iaPdOption.setT2(483841);
List<Dhcp6Option> iaPdSubOptions = new ArrayList<Dhcp6Option>();
iaPdSubOptions.add(iaPrefixOption);
iaPdOption.setOptions(iaPdSubOptions);
iaPdOption.setLength((short) (Dhcp6IaPdOption.DEFAULT_LEN + iaPrefixOption.getLength()));
dhcp6.setMsgType(msgType);
List<Dhcp6Option> dhcp6Options = new ArrayList<Dhcp6Option>();
dhcp6Options.add(iaNaOption);
dhcp6Options.add(clientIdOption);
dhcp6Options.add(iaPdOption);
dhcp6.setOptions(dhcp6Options);
}
Aggregations