Charles Chan
Committed by Gerrit Code Review

Add IPv6 support to Ethernet.toString()

Change-Id: I392b63cee0742ebdd469a6782899184f3086a817
...@@ -18,6 +18,12 @@ ...@@ -18,6 +18,12 @@
18 18
19 package org.onlab.packet; 19 package org.onlab.packet;
20 20
21 +import org.onlab.packet.ndp.NeighborAdvertisement;
22 +import org.onlab.packet.ndp.NeighborSolicitation;
23 +import org.onlab.packet.ndp.Redirect;
24 +import org.onlab.packet.ndp.RouterAdvertisement;
25 +import org.onlab.packet.ndp.RouterSolicitation;
26 +
21 import java.nio.ByteBuffer; 27 import java.nio.ByteBuffer;
22 import java.util.Arrays; 28 import java.util.Arrays;
23 import java.util.HashMap; 29 import java.util.HashMap;
...@@ -531,27 +537,114 @@ public class Ethernet extends BasePacket { ...@@ -531,27 +537,114 @@ public class Ethernet extends BasePacket {
531 sb.append("\nnw_proto: "); 537 sb.append("\nnw_proto: ");
532 sb.append(p.getProtocol()); 538 sb.append(p.getProtocol());
533 539
534 - if (pkt instanceof TCP) { 540 + IPacket payload = pkt.getPayload();
535 - sb.append("\ntp_src: "); 541 + if (payload != null) {
536 - sb.append(((TCP) pkt).getSourcePort()); 542 + if (payload instanceof TCP) {
537 - sb.append("\ntp_dst: "); 543 + sb.append("\ntp_src: ");
538 - sb.append(((TCP) pkt).getDestinationPort()); 544 + sb.append(((TCP) payload).getSourcePort());
539 - 545 + sb.append("\ntp_dst: ");
540 - } else if (pkt instanceof UDP) { 546 + sb.append(((TCP) payload).getDestinationPort());
541 - sb.append("\ntp_src: "); 547 +
542 - sb.append(((UDP) pkt).getSourcePort()); 548 + } else if (payload instanceof UDP) {
543 - sb.append("\ntp_dst: "); 549 + sb.append("\ntp_src: ");
544 - sb.append(((UDP) pkt).getDestinationPort()); 550 + sb.append(((UDP) payload).getSourcePort());
551 + sb.append("\ntp_dst: ");
552 + sb.append(((UDP) payload).getDestinationPort());
553 + } else if (payload instanceof ICMP) {
554 + final ICMP icmp = (ICMP) payload;
555 + sb.append("\nicmp_type: ");
556 + sb.append(icmp.getIcmpType());
557 + sb.append("\nicmp_code: ");
558 + sb.append(icmp.getIcmpCode());
559 + }
545 } 560 }
546 - 561 + } else if (pkt instanceof IPv6) {
547 - if (pkt instanceof ICMP) { 562 + final IPv6 ipv6 = (IPv6) pkt;
548 - final ICMP icmp = (ICMP) pkt; 563 + sb.append("\nipv6_src: ");
549 - sb.append("\nicmp_type: "); 564 + sb.append(Ip6Address.valueOf(ipv6.getSourceAddress()).toString());
550 - sb.append(icmp.getIcmpType()); 565 + sb.append("\nipv6_dst: ");
551 - sb.append("\nicmp_code: "); 566 + sb.append(Ip6Address.valueOf(ipv6.getDestinationAddress()).toString());
552 - sb.append(icmp.getIcmpCode()); 567 + sb.append("\nipv6_proto: ");
568 + sb.append(ipv6.getNextHeader());
569 +
570 + IPacket payload = pkt.getPayload();
571 + if (payload != null && payload instanceof ICMP6) {
572 + final ICMP6 icmp6 = (ICMP6) payload;
573 + sb.append("\nicmp6_type: ");
574 + sb.append(icmp6.getIcmpType());
575 + sb.append("\nicmp6_code: ");
576 + sb.append(icmp6.getIcmpCode());
577 +
578 + payload = payload.getPayload();
579 + if (payload != null) {
580 + if (payload instanceof NeighborSolicitation) {
581 + final NeighborSolicitation ns = (NeighborSolicitation) payload;
582 + sb.append("\nns_target_addr: ");
583 + sb.append(Ip6Address.valueOf(ns.getTargetAddress()).toString());
584 + ns.getOptions().forEach(option -> {
585 + sb.append("\noption_type: ");
586 + sb.append(option.type());
587 + sb.append("\noption_data: ");
588 + sb.append(bytesToHex(option.data()));
589 + });
590 + } else if (payload instanceof NeighborAdvertisement) {
591 + final NeighborAdvertisement na = (NeighborAdvertisement) payload;
592 + sb.append("\nna_target_addr: ");
593 + sb.append(Ip6Address.valueOf(na.getTargetAddress()).toString());
594 + sb.append("\nna_solicited_flag: ");
595 + sb.append(na.getSolicitedFlag());
596 + sb.append("\nna_router_flag: ");
597 + sb.append(na.getRouterFlag());
598 + sb.append("\nna_override_flag: ");
599 + sb.append(na.getOverrideFlag());
600 + na.getOptions().forEach(option -> {
601 + sb.append("\noption_type: ");
602 + sb.append(option.type());
603 + sb.append("\noption_data: ");
604 + sb.append(bytesToHex(option.data()));
605 + });
606 + } else if (payload instanceof RouterSolicitation) {
607 + final RouterSolicitation rs = (RouterSolicitation) payload;
608 + sb.append("\nrs");
609 + rs.getOptions().forEach(option -> {
610 + sb.append("\noption_type: ");
611 + sb.append(option.type());
612 + sb.append("\noption_data: ");
613 + sb.append(bytesToHex(option.data()));
614 + });
615 + } else if (payload instanceof RouterAdvertisement) {
616 + final RouterAdvertisement ra = (RouterAdvertisement) payload;
617 + sb.append("\nra_hop_limit: ");
618 + sb.append(ra.getCurrentHopLimit());
619 + sb.append("\nra_mflag: ");
620 + sb.append(ra.getMFlag());
621 + sb.append("\nra_oflag: ");
622 + sb.append(ra.getOFlag());
623 + sb.append("\nra_reachable_time: ");
624 + sb.append(ra.getReachableTime());
625 + sb.append("\nra_retransmit_time: ");
626 + sb.append(ra.getRetransmitTimer());
627 + sb.append("\nra_router_lifetime: ");
628 + sb.append(ra.getRouterLifetime());
629 + ra.getOptions().forEach(option -> {
630 + sb.append("\noption_type: ");
631 + sb.append(option.type());
632 + sb.append("\noption_data: ");
633 + sb.append(bytesToHex(option.data()));
634 + });
635 + } else if (payload instanceof Redirect) {
636 + final Redirect rd = (Redirect) payload;
637 + sb.append("\nrd_target_addr: ");
638 + sb.append(Ip6Address.valueOf(rd.getTargetAddress()).toString());
639 + rd.getOptions().forEach(option -> {
640 + sb.append("\noption_type: ");
641 + sb.append(option.type());
642 + sb.append("\noption_data: ");
643 + sb.append(bytesToHex(option.data()));
644 + });
645 + }
646 + }
553 } 647 }
554 -
555 } else if (pkt instanceof DHCP) { 648 } else if (pkt instanceof DHCP) {
556 sb.append("\ndhcp packet"); 649 sb.append("\ndhcp packet");
557 } else if (pkt instanceof Data) { 650 } else if (pkt instanceof Data) {
......