はじめに
本記事では、Topology(Device)とIPv4 Interfaceの役割を理解しながら、MACアドレスやIPアドレスを設定する方法を解説する。
前回記事はこちら
今回の着目するポイント
前回記事の手順の一部を再掲する。今回はこのうち手順4〜6を中心に、Deviceの作成からIPv4 Interfaceの設定までを確認する。
| 手順 | IxNetwork(GUI操作) | 何をしている作業か | ixia-c(Python(snappi SDK)によるAPI操作) |
|---|---|---|---|
| 4 | 試験ポートに関連付けるTopology(Device)を作成する | 試験ポートに関連付けるDeviceを作成する*2 | cfg.devices.add() |
| 5 | Interfaceを設定する(Ethernet、IPv4/IPv6などを追加する) | DeviceにL2/L3 Interfaceを構成する |
device.ethernets.add()eth.ipv4_addresses.add()
|
| 6 | MACアドレス、IPアドレス、デフォルトゲートウェイ、VLANなどのInterface情報を設定する | Interfaceにネットワーク情報を設定する |
eth.macip.addressip.gatewayvlan.id
|
| 8 | Start All Protocolsを実行し、設定したInterfaceおよびルーティングプロトコルを起動する | InterfaceやRouting Protocolを有効化する |
api.set_protocol_state()(Topology/Protocolを利用する場合) |
Topology(Device)とは
前回作成した試験パターンは、IxNetworkでPortをAssignした後に、Packet EditorでEthernetやIPv4、UDPヘッダを定義してTraffic Itemを作成する操作に相当する。
※詳しくは本記事の最後に記載した参考の公式URLを見ていただければと思う
PortのAssign
↓
L2-3 Quick Flow Group
↓
Packet Editor
Ethernet
IPv4
UDP
↓
Apply Traffic
↓
Start Traffic
Packet Editorの部分は以下のコードと同じようなものと考えて良いのではないかと思う。
flow1 = cfg.flows.add()
flow1.packet.ethernet()
flow1.packet.ipv4()
flow1.packet.udp()
ただし、このコードはEthernetヘッダ、IPv4ヘッダ、UDPヘッダを使用することを宣言しているだけであり、MACアドレスやIPアドレスなどのInterface情報は設定していない。
一方Topologyについては若干設定が異なり、以下のようになる。
Port Assign
↓
Topology(Device)
※手順4
↓
EthernetやIPv4(場合によってはルーティングプロトコル等)を選択し、設定。
※手順5、6(今回は実施しないが場合によっては7)
↓
設定したInterface等を起動する。
↓
Flow(Traffic Item)を作成する
↓
Apply Traffic
↓
Start Traffic
Topology(Device)で作成したEthernetやIPv4 Interfaceは、後続のFlow(Traffic Item)から参照して利用できる。
snappi APIでも考え方は同じである。まずDeviceを作成し、その配下にEthernetやIPv4 Interfaceを追加する。その後、FlowからこれらのInterfaceを参照することで、MACアドレスやIPアドレスを持った通信を生成できる。
今回は以下の条件での試験トラフィックを作ることとする。
| 項目 | Topology1 | Topology2 |
|---|---|---|
| Port | veth-a | veth-z |
| MACアドレス | 00:00:00:00:00:01 | 00:00:00:00:00:02 |
| IPv4アドレス | 10.1.0.1/24 | 10.1.0.2/24 |
| Gateway | 10.1.0.2 | 10.1.0.1 |
※snappiではIPv4 InterfaceにGatewayの設定が必須となっているため、本サンプルでは対向側のIPアドレスを設定している。このGateway設定がDevice Endpoint利用時のARP解決にどのように利用されるかについては、次回の記事で確認する。
Topology(Device)とIPv4 Interfaceを作成するサンプルコード
import snappi
def test_topology_ipv4_interface():
# ------------------------------------------------------------------
# Controllerへ接続
# ------------------------------------------------------------------
api = snappi.api(
location="https://localhost:8443",
verify=False
)
# ------------------------------------------------------------------
# Config作成
# ------------------------------------------------------------------
cfg = api.config()
# ------------------------------------------------------------------
# Port作成
# ------------------------------------------------------------------
p1 = cfg.ports.add(name="p1", location="veth-a")
p2 = cfg.ports.add(name="p2", location="veth-z")
# ------------------------------------------------------------------
# Topology(Device)作成【今回追加】
# ------------------------------------------------------------------
topo1 = cfg.devices.add(name="Topology1")
topo2 = cfg.devices.add(name="Topology2")
# ------------------------------------------------------------------
# Topology1にEthernet/IPv4 Interfaceを作成【今回追加】
# ------------------------------------------------------------------
eth1 = topo1.ethernets.add(name="Ethernet1")
eth1.connection.port_name = p1.name
eth1.mac = "00:00:00:00:00:01"
ip1 = eth1.ipv4_addresses.add(name="IPv4-1")
ip1.address = "10.1.0.1"
ip1.gateway = "10.1.0.2"
ip1.prefix = 24
# ------------------------------------------------------------------
# Topology2にEthernet/IPv4 Interfaceを作成【今回追加】
# ------------------------------------------------------------------
eth2 = topo2.ethernets.add(name="Ethernet2")
eth2.connection.port_name = p2.name
eth2.mac = "00:00:00:00:00:02"
ip2 = eth2.ipv4_addresses.add(name="IPv4-2")
ip2.address = "10.1.0.2"
ip2.gateway = "10.1.0.1"
ip2.prefix = 24
# ------------------------------------------------------------------
# Config確認
# ------------------------------------------------------------------
print("\nCONFIGURATION", cfg.serialize(encoding=cfg.JSON), sep="\n")
※IxNetworkではPort配下にTopologyを作成し、その配下にDevice、Ethernet、IPv4などを構成する。一方、ixia-c(snappi)ではTopologyというオブジェクトは存在せず、cfg.devices.add()でDeviceを作成する。
このsnappiのDeviceは、IxNetworkにおけるTopologyとその配下のDeviceを合わせたような役割を持つ。そのため、本記事ではIxNetworkとの対応関係が分かりやすいよう、snappiで作成するDeviceの名前を「Topology1」「Topology2」としている。
※cfg.serialize()を利用すると、Python(snappi)で作成したConfigをJSON形式で確認できる。ixia-cへ送信されるConfigの内容を確認したい場合や、設定内容のデバッグ時に非常に便利である。
gateway設定省略時に発生したメッセージ
snappiのDevice IPv4設定では gateway が必須項目となっているため、本サンプルではGatewayアドレスを設定している。以下はgatewayを省略した場合に発生するエラーメッセージ。
> raise ValueError(msg) E ValueError: gateway is a mandatory property of <class 'snappi.snappi.DeviceIpv4'> and should not be set to None .env/lib/python3.12/site-packages/snappi/snappi.py:931: ValueError
動作確認
cd ~/ixia-c/conformance
./do.sh pytest examples/topology_sample.py -s
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-7.1.1, pluggy-1.6.0 -- /home/test/ixia-c/conformance/.env/bin/python
cachedir: .pytest_cache
rootdir: /home/test/ixia-c/conformance, configfile: pytest.ini
plugins: html-4.2.0
collecting ... collected 1 item
examples/topology_sample.py::test_topology_ipv4_interface 2026-06-28 14:40:15.623 [snappi] [WARNING] Version check is disabled
-------------------------------- live log call ---------------------------------
WARNING snappi:snappi.py:106 Version check is disabled
2026-06-28 14:40:15.623 [snappi] [WARNING] Certificate verification is disabled
WARNING snappi:snappi.py:164 Certificate verification is disabled
CONFIGURATION
{
"devices": [
{
"ethernets": [
{
"connection": {
"choice": "port_name",
"port_name": "p1"
},
"ipv4_addresses": [
{
"address": "10.1.0.1",
"gateway": "10.1.0.2",
"name": "IPv4-1",
"prefix": 24
}
],
"mac": "00:00:00:00:00:01",
"mtu": 1500,
"name": "Ethernet1"
}
],
"name": "Topology1"
},
{
"ethernets": [
{
"connection": {
"choice": "port_name",
"port_name": "p2"
},
"ipv4_addresses": [
{
"address": "10.1.0.2",
"gateway": "10.1.0.1",
"name": "IPv4-2",
"prefix": 24
}
],
"mac": "00:00:00:00:00:02",
"mtu": 1500,
"name": "Ethernet2"
}
],
"name": "Topology2"
}
],
"ports": [
{
"location": "veth-a",
"name": "p1"
},
{
"location": "veth-z",
"name": "p2"
}
]
}
PASSED
============================== 1 passed in 0.18s ===============================
Device Endpointを使ったFlow生成について
今回はTopology(Device)およびIPv4 Interfaceを作成するところまで確認した。
続いてTopology(Device)をFlowのEndpointとして指定したところ、
MAC address resolution failed for IP: 10.1.0.2
というエラーが発生した。
Topology(Device)をFlowのEndpointとして利用した場合は、ARPによるMACアドレス解決が行われるように見える。現時点では詳細な動作は確認中であり、次回はこのARP解決の仕組みとDevice Endpointを利用したTraffic生成について確認していく。
まとめ
今回確認したサンプルコードでは、Topology(Device)、Ethernet、IPv4 Interfaceの設定を作成し、snappiが内部で生成するConfigをJSON形式で確認できることを確認した。
一方、このTopology(Device)をFlowのEndpointとしてTrafficを印可すると、ARPによるMACアドレス解決が必要となり、現時点では設定方法について調査中である。
参考資料
How to use the packet editor to construct packets with detail protocols template
https://www.youtube.com/watch?v=L9kuBpDjJcY
Introduction to IxNetwork NextGen Protocol Framework (NGPF)
https://www.youtube.com/watch?v=A0mbZuP94jo&list=PLtRQdxmT_4727o1aFcuQzl37lWNJk4Ybj