Skip to content

Commit 7be164e

Browse files
authored
Merge pull request #66 from sumboid/l3-src-ipv6
Add ability to set l3 IPv6 address
2 parents 472c5a3 + 200ba5b commit 7be164e

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
<dependency>
9797
<groupId>com.github.cisco-system-traffic-generator</groupId>
9898
<artifactId>trex-java-sdk</artifactId>
99-
<version>867eb67</version>
99+
<version>79ad329</version>
100100
</dependency>
101101
<dependency>
102102
<groupId>org.pcap4j</groupId>

src/main/java/com/exalttech/trex/ui/controllers/ports/tabs/PortLayerConfiguration.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.exalttech.trex.core.ConnectionManager;
1313
import com.exalttech.trex.core.RPCMethods;
1414
import com.exalttech.trex.ui.models.ConfigurationMode;
15+
import com.exalttech.trex.ui.models.PortLayerConfigurationModel;
1516
import com.exalttech.trex.ui.models.PortModel;
1617
import com.exalttech.trex.ui.views.logs.LogType;
1718
import com.exalttech.trex.ui.views.logs.LogsController;
@@ -249,7 +250,7 @@ private void handleStartIPv6Scan(ActionEvent actionEvent) {
249250
@Override
250251
public Optional<Map<String, Ipv6Node>> call() {
251252
try {
252-
return Optional.of(iPv6NDService.scan(model.getIndex(), 10, null));
253+
return Optional.of(iPv6NDService.scan(model.getIndex(), 10, null, null));
253254
} catch (ServiceModeRequiredException e) {
254255
AsyncResponseManager.getInstance().unmuteLogger();
255256
AsyncResponseManager.getInstance().suppressIncomingEvents(false);
@@ -357,7 +358,7 @@ public Optional<String> call() {
357358
try {
358359
serverRPCMethods.setSetL2(model.getIndex(), dstMac);
359360
guiLogger.appendText(LogType.INFO, "L2 mode configured for " + model.getIndex());
360-
361+
clearModelIPv6();
361362
} catch (Exception e1) {
362363
logger.error("Failed to set L2 mode: " + e1.getMessage());
363364
}
@@ -367,9 +368,14 @@ public Optional<String> call() {
367368
String portSrcIP = l3Source.getText();
368369
String portDstIP = l3Destination.getText();
369370
final boolean dstIsIPv6 = InetAddresses.forString(portDstIP).getAddress().length > 4;
371+
final boolean srcIsIPv6 = InetAddresses.forString(portSrcIP).getAddress().length > 4;
372+
373+
if (srcIsIPv6 != dstIsIPv6) {
374+
throw new Exception("src and dst addresses are different version");
375+
}
370376

371377
if (dstIsIPv6) {
372-
Map<String, Ipv6Node> result = getIPv6NDService().scan(model.getIndex(), 5, portDstIP);
378+
Map<String, Ipv6Node> result = getIPv6NDService().scan(model.getIndex(), 5, portDstIP, portSrcIP);
373379
AsyncResponseManager.getInstance().unmuteLogger();
374380

375381
String statusString;
@@ -386,6 +392,9 @@ public Optional<String> call() {
386392
serverRPCMethods.setSetL2(model.getIndex(), mac);
387393
guiLogger.appendText(LogType.INFO, "L2 mode configured for " + model.getIndex());
388394

395+
final PortLayerConfigurationModel l3Conf = model.getL3LayerConfiguration();
396+
l3Conf.setSrc6(portSrcIP);
397+
l3Conf.setDst6(portDstIP);
389398
} catch (Exception e1) {
390399
logger.error("Failed to set L2 mode: " + e1.getMessage());
391400
}
@@ -401,6 +410,7 @@ public Optional<String> call() {
401410
} else {
402411
trexClient.setL3Mode(model.getIndex(), null, portSrcIP, portDstIP);
403412

413+
clearModelIPv6();
404414
String nextHopMac = trexClient.resolveArp(model.getIndex(), portSrcIP, portDstIP);
405415
if (nextHopMac != null) {
406416
trexClient.setL3Mode(model.getIndex(), nextHopMac, portSrcIP, portDstIP);
@@ -419,7 +429,8 @@ public Optional<String> call() {
419429
LogsController.getInstance().appendText(LogType.ERROR, "Service mode is not enabled for port: " + model.getIndex() + ". Enable Service Mode in Control tab.");
420430
});
421431
} catch (Exception e) {
422-
logger.error("Failed to set L3IPv4 mode: " + e.getMessage());
432+
logger.error("Failed to set L3 mode: " + e.getMessage());
433+
guiLogger.appendText(LogType.ERROR, "Failed to set L3 mode: " + e.getMessage());
423434
} finally {
424435
trexClient.serviceMode(model.getIndex(), false);
425436
AsyncResponseManager.getInstance().suppressIncomingEvents(false);
@@ -433,8 +444,12 @@ public Optional<String> call() {
433444
saveConfigurationTask.setOnSucceeded(e -> {
434445
saveBtn.setText("Apply");
435446
saveBtn.setDisable(false);
447+
448+
final boolean dstIsIPv6 = InetAddresses.forString(l3Source.getText()).getAddress().length > 4;
449+
final boolean srcIsIPv6 = InetAddresses.forString(l3Destination.getText()).getAddress().length > 4;
450+
436451
Optional result = (Optional) (saveConfigurationTask.getValue());
437-
if (l3Mode.isSelected()) {
452+
if (l3Mode.isSelected() && !dstIsIPv6 && !srcIsIPv6) {
438453
String status = "unresolved";
439454
if (result.isPresent()) {
440455
status = "resolved";
@@ -583,8 +598,21 @@ public void bindModel(PortModel model) {
583598
l2Destination.textProperty().bindBidirectional(this.model.getL2LayerConfiguration().dstProperty());
584599
l2Source.textProperty().bindBidirectional(this.model.getL2LayerConfiguration().srcProperty());
585600

586-
l3Destination.textProperty().bindBidirectional(this.model.getL3LayerConfiguration().dstProperty());
587-
l3Source.textProperty().bindBidirectional(this.model.getL3LayerConfiguration().srcProperty());
601+
final PortLayerConfigurationModel l3Conf = this.model.getL3LayerConfiguration();
602+
603+
l3Destination.textProperty().bindBidirectional(l3Conf.dstProperty());
604+
l3Source.textProperty().bindBidirectional(l3Conf.srcProperty());
605+
606+
final String src6 = l3Conf.getSrc6();
607+
final String dst6 = l3Conf.getDst6();
608+
609+
if (src6 != null && !src6.equals("")) {
610+
l3Source.textProperty().setValue(src6);
611+
}
612+
613+
if (dst6 != null && !dst6.equals("")) {
614+
l3Destination.textProperty().setValue(dst6);
615+
}
588616

589617
vlan.textProperty().bindBidirectional(this.model.vlanProperty());
590618

@@ -608,4 +636,10 @@ private void unbindAll() {
608636
arpStatus.textProperty().unbindBidirectional(model.getL3LayerConfiguration().stateProperty());
609637
model.layerConfigurationTypeProperty().removeListener(configurationModeChangeListener);
610638
}
639+
640+
private void clearModelIPv6() {
641+
final PortLayerConfigurationModel l3Conf = this.model.getL3LayerConfiguration();
642+
l3Conf.setSrc6(null);
643+
l3Conf.setDst6(null);
644+
}
611645
}

src/main/java/com/exalttech/trex/ui/models/PortLayerConfigurationModel.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ public class PortLayerConfigurationModel {
88

99
private StringProperty src = new SimpleStringProperty();
1010
private StringProperty dst = new SimpleStringProperty();
11+
12+
private String src6 = "";
13+
private String dst6 = "";
14+
1115
private StringProperty state = new SimpleStringProperty();
1216

1317
public PortLayerConfigurationModel(ConfigurationMode type, String src, String dst, String state) {
@@ -44,4 +48,20 @@ public String getState() {
4448
public StringProperty stateProperty() {
4549
return state;
4650
}
51+
52+
public String getSrc6() {
53+
return src6;
54+
}
55+
56+
public void setSrc6(String src6) {
57+
this.src6 = src6;
58+
}
59+
60+
public String getDst6() {
61+
return dst6;
62+
}
63+
64+
public void setDst6(String dst6) {
65+
this.dst6 = dst6;
66+
}
4767
}

0 commit comments

Comments
 (0)