Skip to content

Commit

Permalink
Merge "IPv6 DHCP for baremetal."
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Jun 22, 2015
2 parents 4652fa4 + 28460cb commit 79ffe5e
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 7 deletions.
5 changes: 3 additions & 2 deletions src/vnsw/agent/services/dhcp_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,9 @@ bool DhcpHandler::HandleVmRequest() {
}

// options length = pkt length - size of headers
int16_t options_len = pkt_info_->len - sizeof(struct ether_header) -
sizeof(struct ip) - sizeof(udphdr) - DHCP_FIXED_LEN;
int16_t options_len = pkt_info_->len -
(pkt_info_->data - (uint8_t *)pkt_info_->pkt)
- DHCP_FIXED_LEN;
if (!ReadOptions(options_len))
return true;

Expand Down
6 changes: 5 additions & 1 deletion src/vnsw/agent/services/dhcpv6_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ bool Dhcpv6Handler::Run() {
memcpy(xid_, dhcp_->xid, 3);
// options length = pkt length - size of headers
int16_t options_len = pkt_info_->len -
(pkt_info_->data - (uint8_t *)pkt_info_->eth)
(pkt_info_->data - (uint8_t *)pkt_info_->pkt)
- DHCPV6_FIXED_LEN;
ReadOptions(options_len);

Expand Down Expand Up @@ -360,6 +360,10 @@ void Dhcpv6Handler::ReadOptions(int16_t opt_rem_len) {
while (opt_rem_len > 0) {
uint16_t option_code = ntohs(opt->code);
uint16_t option_len = ntohs(opt->len);
if (option_len > opt_rem_len) {
DHCPV6_TRACE(Error, "DHCP option parsing error");
break;
}
switch (option_code) {
case DHCPV6_OPTION_CLIENTID:
client_duid_len_ = option_len;
Expand Down
18 changes: 14 additions & 4 deletions src/vnsw/agent/services/icmpv6_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,10 @@ bool Icmpv6Handler::Run() {
vm_itf->vn()->GetPrefix(vm_itf->ip6_addr(), &prefix, &plen)) {
boost::system::error_code ec;
Ip6Address src_addr = Ip6Address::from_string(PKT0_LINKLOCAL_ADDRESS, ec);
SendRAResponse(pkt_info_->GetAgentHdr().ifindex,
uint32_t interface =
(pkt_info_->agent_hdr.cmd == AgentHdr::TRAP_TOR_CONTROL_PKT) ?
pkt_info_->agent_hdr.cmd_param : GetInterfaceIndex();
SendRAResponse(interface,
pkt_info_->vrf,
src_addr.to_bytes().data(),
pkt_info_->ip_saddr.to_v6().to_bytes().data(),
Expand Down Expand Up @@ -193,7 +196,10 @@ void Icmpv6Handler::SendPingResponse() {
Icmpv6Csum(pkt_info_->ip_daddr.to_v6().to_bytes().data(),
pkt_info_->ip_saddr.to_v6().to_bytes().data(),
icmp_, ntohs(pkt_info_->ip6->ip6_plen));
SendIcmpv6Response(pkt_info_->GetAgentHdr().ifindex, pkt_info_->vrf,
uint32_t interface =
(pkt_info_->agent_hdr.cmd == AgentHdr::TRAP_TOR_CONTROL_PKT) ?
pkt_info_->agent_hdr.cmd_param : GetInterfaceIndex();
SendIcmpv6Response(interface, pkt_info_->vrf,
pkt_info_->ip_daddr.to_v6().to_bytes().data(),
pkt_info_->ip_saddr.to_v6().to_bytes().data(),
MacAddress(pkt_info_->eth->ether_shost),
Expand All @@ -205,14 +211,18 @@ void Icmpv6Handler::SendIcmpv6Response(uint32_t ifindex, uint32_t vrfindex,
const MacAddress &dest_mac,
uint16_t len) {

char *buff = (char *)pkt_info_->eth;
char *buff = (char *)pkt_info_->pkt;
uint16_t buff_len = pkt_info_->packet_buffer()->data_len();

uint16_t eth_len = EthHdr(buff, buff_len, ifindex, agent()->vrrp_mac(),
dest_mac, ETHERTYPE_IPV6);

pkt_info_->ip6 = (struct ip6_hdr *)(buff + eth_len);
Ip6Hdr(pkt_info_->ip6, len, IPV6_ICMP_NEXT_HEADER, 255, src_ip, dest_ip);
memcpy(buff + sizeof(ip6_hdr) + eth_len, icmp_, len);
pkt_info_->set_len(len + sizeof(ip6_hdr) + eth_len);
Send(ifindex, vrfindex, AgentHdr::TX_SWITCH, PktHandler::ICMPV6);
uint16_t command =
(pkt_info_->agent_hdr.cmd == AgentHdr::TRAP_TOR_CONTROL_PKT) ?
(uint16_t)AgentHdr::TX_ROUTE : AgentHdr::TX_SWITCH;
Send(ifindex, vrfindex, command, PktHandler::ICMPV6);
}

0 comments on commit 79ffe5e

Please sign in to comment.