use of org.pcap4j.packet.IcmpV6CommonPacket in project trex-stateless-gui by cisco-system-traffic-generator.
the class PortLayerConfiguration method runPingCmd.
private void runPingCmd(Event event) {
if (model.getPortStatus().equalsIgnoreCase("tx")) {
guiLogger.appendText(LogType.ERROR, "Port " + model.getIndex() + " is in TX mode. Please stop traffic first.");
return;
}
if (Strings.isNullOrEmpty(pingDestination.getText())) {
guiLogger.appendText(LogType.ERROR, "Empty ping destination address.");
return;
}
final String targetIP = pingDestination.getText();
if (!targetIP.contains(":") && !model.getL3LayerConfiguration().getState().equalsIgnoreCase("resolved")) {
guiLogger.appendText(LogType.ERROR, "ARP resolution required. Configure L3IPv4 mode properly.");
return;
}
pingCommandBtn.setDisable(true);
Task<Void> pingTask = new Task<Void>() {
@Override
public Void call() {
TRexClient trexClient = ConnectionManager.getInstance().getTrexClient();
trexClient.serviceMode(model.getIndex(), true);
guiLogger.appendText(LogType.PING, " Start ping " + targetIP);
AsyncResponseManager.getInstance().muteLogger();
AsyncResponseManager.getInstance().suppressIncomingEvents(true);
try {
int icmp_id = new Random().nextInt(100);
for (int icmp_sec = 1; icmp_sec < 6; icmp_sec++) {
EthernetPacket reply = null;
if (targetIP.contains(":")) {
// IPv6
reply = trexClient.sendIcmpV6Echo(model.getIndex(), targetIP, icmp_id, icmp_sec, 2);
if (reply != null) {
IcmpV6CommonPacket icmpV6CommonPacket = reply.get(IcmpV6CommonPacket.class);
IcmpV6Type icmpReplyType = icmpV6CommonPacket.getHeader().getType();
String msg = null;
if (IcmpV6Type.ECHO_REPLY.equals(icmpReplyType)) {
msg = " Reply from " + targetIP + " size=" + reply.getRawData().length + " icmp_sec=" + icmp_sec;
} else if (IcmpV6Type.DESTINATION_UNREACHABLE.equals(icmpReplyType)) {
msg = " Destination host unreachable";
}
guiLogger.appendText(LogType.PING, msg);
} else {
guiLogger.appendText(LogType.PING, "Request timeout.");
}
} else {
// IPv4
reply = trexClient.sendIcmpEcho(model.getIndex(), targetIP, icmp_id, icmp_sec, 1000);
if (reply != null) {
IpV4Packet ip = reply.get(IpV4Packet.class);
String ttl = String.valueOf(ip.getHeader().getTtlAsInt());
IcmpV4CommonPacket echoReplyPacket = reply.get(IcmpV4CommonPacket.class);
IcmpV4Type replyType = echoReplyPacket.getHeader().getType();
if (IcmpV4Type.ECHO_REPLY.equals(replyType)) {
guiLogger.appendText(LogType.PING, " Reply from " + targetIP + " size=" + reply.getRawData().length + " ttl=" + ttl + " icmp_sec=" + icmp_sec);
} else if (IcmpV4Type.DESTINATION_UNREACHABLE.equals(replyType)) {
guiLogger.appendText(LogType.PING, " Destination host unreachable");
}
} else {
guiLogger.appendText(LogType.PING, " Request timeout for icmp_seq " + icmp_sec);
}
}
}
guiLogger.appendText(LogType.PING, " Ping finished.");
} catch (UnknownHostException e) {
guiLogger.appendText(LogType.PING, " Unknown host");
} catch (ServiceModeRequiredException e) {
e.printStackTrace();
} finally {
pingCommandBtn.setDisable(false);
trexClient.serviceMode(model.getIndex(), false);
AsyncResponseManager.getInstance().unmuteLogger();
AsyncResponseManager.getInstance().suppressIncomingEvents(false);
}
return null;
}
};
pingTask.setOnSucceeded(e -> pingCommandBtn.setDisable(false));
new Thread(pingTask).start();
}
Aggregations