Ethernet
This chapter describes common information and instructions of Ethernet on IoT Yocto, such as command to configure DHCP or static IP and so on.
But Ethernet on different platforms may have some platform-specific instructions or test results. For example, you will get different throughputs on different platforms.
Important
In releases v21.3 to v23.0, IoT Yocto uses systemd-networkd
to manage network settings in the Yocto Linux, including MAC addresses.
However, starting from version v23.1 and in subsequent versions, IoT Yocto will disable systemd-networkd
by default.
Instead, it will set NetworkManager
as the default networking management tool, aligning with modern management methods used in
Linux distributions such as Ubuntu.
Change the MAC Address
Note
Current IoT Yocto does not support changing permanent MAC address with ethtool
.
Change MAC Address in u-boot and Pass It to Linux
Starting from version v23.1 and in subsequent versions, IoT Yocto supports storing the MAC address in the u-boot environment variable ethaddr
and passing it to Linux.
The aliases
node for assigning ethernet0 = ð
will help to acquire the value stored in u-boot environment variable ethaddr
.
There are three methods to modify the MAC address of the onboard eth0
.
These methods may also deal with MAC address issues for mass production.
Developer can use
genio-flash
to flash the MAC address ofeth0
to u-boot environment partition.Note
To use this feature,
genio-tools
version greater than1.3
is necessary. To upgradegenio-tools
to the latest version, you can use the commandpip install --upgrade genio-tools
.You can do so by modifying the plain text file
u-boot-initial-env
, adding a line to set theethaddr
variable. Take Genio 700-EVK as example:boot_conf=#conf-mediatek_genio-700-evk.dtb#conf-gpu-mali.dtbo#conf-video.dtbo list_dtbo= gpu-mali.dtbo video.dtbo storage=mmc storage_dev=0 boot_scripts=fitImage boot_targets=embedded ethaddr=00:11:22:33:44:55
Save the file and run
genio-flash
. The flash tool converts theu-boot-initial-env
file into binary representations and update themmc0boot1
partition.In the example above we use the MAC address
00:11:22:33:44:55
, this should be updated to reflect the allocated MAC addresses for each board before launching thegenio-flash
program. Developer could also use a single line command to set MAC address with-e ethaddr=XX:XX:XX:XX:XX:XX
parameter.genio-flash -e ethaddr=00:11:22:33:44:55 bootloaders mmc0boot1
Developer can use
fw_setenv
to modify MAC address under Linux shell in IoT Yocto.fw_setenv ethaddr 00:11:22:33:44:55
If a developer attempts to modify the ethaddr in the u-boot prompt, it might fail because ethaddr is a vendor-specific environment variable. However, if you still wish to modify it in the u-boot prompt, you can enable the CONFIG_ENV_OVERWRITE setting in the defconfig file for your project. After making this change, you will need to rebuild and replace the
fip.bin
file. This process allows the environment variables to be overwritten, thus enabling the modification of ethaddr. However, please don’t enable this setting in mass production for better security approaches.setenv ethaddr 00:11:22:33:44:55 saveenv
Some platforms do not support Ethernet driver in U-Boot yet. Instead, they use a USB RNDIS gadget as the Ethernet device. If
ethaddr
is not pre-configured, the MAC address will default tode:ad:be:ef:00:01
. Consequently, this MAC address will be passed to Linux. To use a different MAC address, setethaddr
in U-Boot or use thegenio-flash
tool with the command.Platforms do not support Ethernet driver in U-Boot yet:
Genio 350-EVK
Genio 700-EVK
Genio 510-EVK
Some platforms support the Ethernet driver in U-Boot. However, it will not function without a configured MAC address by default. To use Ethernet in U-Boot, set
ethaddr
by the developer is required. Ifethaddr
is not set, Linux will not be able to retrieve it from U-Boot and will use a default MAC address.Platforms support Ethernet driver in U-Boot:
Genio 1200-EVK
Note
It is recommended to always configure the -e ethaddr
parameter during flashing.
Using CONFIG_NET_RANDOM_ETHADDR
may consume the available DHCP IP addresses on the network.
Using Random MAC Address
If you wish to use a random MAC address, you can configure CONFIG_NET_RANDOM_ETHADDR=y
in the U-Boot defconfig for the Genio 1200-EVK platform.
This will ensure that U-Boot assigns a random MAC address at each boot if ethaddr
is not configured.
Note
The USB RNDIS gadget does not support CONFIG_NET_RANDOM_ETHADDR
. Random MAC address cannot work on these platforms using USB RNDIS gadget in U-boot.
Summary of the Ethernet driver for Genio boards
Genio 350-EVK
Genio 1200-EVK
Genio 700-EVK
Genio 510-EVK
u-boot
USB RNDIS Gadget Ethernet
MEDIATEK DWMAC Ethernet
USB RNDIS Gadget Ethernet
USB RNDIS Gadget Ethernet
Linux
MEDIATEK STAR Ethernet
MEDIATEK DWMAC Ethernet
MEDIATEK DWMAC Ethernet
MEDIATEK DWMAC Ethernet
Change MAC Address in Linux with systemd-networkd
Note
This approach is considered legacy for IoT Yocto releases v21.3 to v23.0.
Starting from version v23.1, this method will no longer work because IoT Yocto has set NetworkManager
as the default networking management tool.
IoT Yocto v21.3 and later release uses systemd
to manage network settings in Linux OS, including MAC addresses.
By default, systemd
generates a temporary MAC address for the ethernet interface with following steps:
First,
systemd
generates a unique machine-id and store it in/etc/machine-id
during boot up after whole image has been flashed.Then,
systemd
uses this machine-id to calculate a unique MAC address.After that, the unique MAC address will be applied to Ethernet driver. This is a kind of temporary MAC address which is calculated each time during system boot up.
To change the temporary MAC address and store it in the file system, please follow these steps:
Create a file
/etc/systemd/network/20-eth0.network
. Systemd will use the setting in this file to override the generated address.Edit the configuration file and insert the following configurations:
[Match] Name=eth0 [Link] MACAddress=16:55:61:43:11:22
Please replace the example MAC address 16:55:61:43:11:22
to the MAC address that you needed.
systemd-networkd vs NetworkManager
A Linux system with both systemd-networkd and NetworkManager installed would have two different network management services. NetworkManager is a more widely used and user-friendly service for managing network connections. On the other hand, systemd-networkd is a system daemon that manages network connections in the background and is typically used in headless servers or devices without a graphical user interface.
However, it is recommended to only use one service at a time to avoid conflicts and ensure proper network configuration.
The “rity-bringup-image” meta layer only has systemd-networkd.
The “rity-demo-image” meta layer has both systemd-networkd and NetworkManager installed.
systemd-networkd
Enable or Disable systemd-networkd
If you want to use another network management service, it’s good to know how to enable and disable the systemd-networkd
service.
You need to stop systemd-networkd
prior to disable it.
systemctl stop systemd-networkd systemctl disable systemd-networkd
If you want to switch back systemd-networkd
, simply enable and then start the service.
systemctl enable systemd-networkd systemctl start systemd-networkd
Configure Static IP with systemd-networkd
DHCP is enabled by default with systemd-networkd
.
If static IP is required, use /etc/systemd/network/20-eth0.network
to modify connection setting.
For example, set IP 192.168.0.1
and netmask 255.255.255.0
with default gateway 192.168.0.254
to iface eth0
.
After that, reload systemd-networkd
via systemctl
.
[Match] Name=eth0 [Network] Address=192.168.0.1/24 Gateway=192.168.0.254 DNS=8.8.8.8
NetworkManager
Enable or Disable NetworkManager
If you want to use another network management service, it’s good to know how to enable and disable the NetworkManager
service.
You need to stop NetworkManager
prior to disable it.
systemctl stop NetworkManager systemctl disable NetworkManager
If you want to switch back NetworkManager
, simply enable and then start the service.
systemctl enable NetworkManager systemctl start NetworkManager
Check the Status of NetworkManager
Use systemctl
to check if the NetworkManager
is still running.
systemctl status NetworkManager
Check the output line which contains Active:
for the status of NetworkManager
.
For example, the output shows NetworkManager
is running.
active (running)
The other output show the service has been stopped.
inactive (dead)
The configuration of NetworkManager
service is stored in file /etc/systemd/system/multi-user.target.wants/NetworkManager.service
.
You can check this file if any customization is required for this service.
Control Network Settings via NetworkManager
Note
We will usually suggest customer to disable systemd-networkd
before configuring NetworkManager
. Other service like avahi-daemon
or dhcpcd
will also affect network configurations.
NetworkManager is enable by default. This service is registered as NetworkManager.service
(also known as NetworkManager
) to systemd
. nmcli
is the interactive tool for controlling the NetworkManager
.
User could use nmcli
to check connections managed by NetworkManager
.
nmcli -p connection show
You should see the following output if you’ve never touched network setting.
====================================== NetworkManager connection profiles ====================================== NAME UUID TYPE DEVICE -------------------------------------------------------------------------------> Wired connection 1 4080d986-b3c7-3601-a837-3ca6ee6b2ab2 ethernet eth0
Control Network Settings via Tool NMCLI
nmcli
is the tool for configuring and controlling each network interface managed by NetworkManager
.
nmcli
can enable or disable the network while keeps NetworkManager
alive.
You can set the following commands to enable or disable networking controlled by NetworkManager
. All interfaces managed by NetworkManager
are deactivated when networking is disabled.
For more detail, you can check the online manual of nmcli
: https://developer-old.gnome.org/NetworkManager/stable/nmcli.html
nmcli networking off nmcli networking on
Configure Static IP with NetworkManager
DHCP is enabled by default with NetworkManager
. If static IP is required, use nmcli
to modify connection setting.
For example, set IP 192.168.0.1
and netmask 255.255.255.0
with default gateway 192.168.0.254
to "Wired connection 1"
(eth0).
After that, reload NetworkManager
via systemctl
.
nmcli con mod "Wired connection 1" ip4 "192.168.0.1/24" gw4 192.168.0.254 systemctl reload NetworkManager
Use ip a
to check if the static IP has been applied.
ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 92:b2:7c:21:08:2d brd ff:ff:ff:ff:ff:ff inet 192.168.0.1/24 brd 192.168.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::3154:c53:c5e5:6d6f/64 scope link noprefixroute valid_lft forever preferred_lft forever
Check the new configuration has been stored in file /etc/NetworkManager/system-connections/Wired connection 1.nmconnection
cat /etc/NetworkManager/system-connections/Wired\ connection\ 1.nmconnection
It should show the new IP value is assigned to variable address1
.
[ipv4] address1=192.168.0.1/24,192.168.0.1
Avoiding wrong network settings affected by other modules
Note
If dhcpcd
is activate on the system, for example, the board is configured as an wireless router, configure static IP of eth0 in /etc/dhcpcd.conf
.
Please run systemctl restart dhcpcd
after new configuration has been applied.
interface eth0 static ip_address = 192.168.0.1/24 static router = 192.168.0.254 static domain_name_server = 8.8.8.8
Note
If avahi-daemon
is activate on the system, disable eth0 from avahi-daemon.
Add the following line in /etc/avahi/avahi-daemon.conf
deny-interfaces=eth0
Please run systemctl reload avahi-daemon
after new configuration has been applied.
Time-Sensitive Networking (TSN)
Time-Sensitive Networking (TSN) is a set of standards developed by the Time-Sensitive Networking task group of the IEEE 802.1 working group. The goal of these standards is to provide deterministic real-time communication over Ethernet. TSN achieves this by using time synchronization to schedule traffic and eliminate collisions on the network. This ensures that all devices on a TSN network can communicate with each other in a timely and reliable manner.
To use TSN, your devices must support the TSN standards and be configured to use them. This typically involves setting up your devices to synchronize their clocks with a network-wide time source, configuring the network’s schedule, and setting up the network’s Quality of Service (QoS) settings to prioritize time-sensitive traffic.
IoT Yocto supports TSN on the Genio 510, Genio 700 and Genio 1200 series. This means that devices built with these platforms can be part of a TSN network and take advantage of the benefits that TSN provides. To use TSN on a device built with the MediaTek Genio platform, you would typically need to use the platform’s software tools to configure the device’s network settings and enable TSN.
Meta layer meta-mediatek-tsn
in IoT Yocto supports most of the TSN software components you need. Kernel configurations are eanbled in file
src/meta-mediatek-bsp/recipes-kernel/linux/linux-mtk/tsn.cfg
in IoT Yocto source code. These features are enabled by default with
rity-demo-image
and are ready to use since v22.1 for Genio 1200 platform, v23.0 for Genio 700 platforms and v23.2 for Genio 510 platforms
Note
For the testing procedures and user guide for the TSN feature, please refer to
Genio 700/1200 TSN Evaluation Guide
for details.
Wake on LAN (WoL)
Important
Wake-on-LAN will affect the precision of Time-Sensitive Networking (TSN) feature. If you want to use the TSN feature, you should not use WoL.
Wake-on-LAN (WoL) is a networking standard that allows a computer to be turned on or awakened from a low-power state by a network message. This feature is particularly useful for remote management and control of devices, allowing administrators to power on devices without physical access.
IoT Yocto supports Wake-on-LAN on the Genio 510, Genio 700 and Genio 1200 series.
This means that devices built with these platforms can be awakened from a low-power state by a network message.
To use Wake-on-LAN on a device built with the MediaTek Genio platform, you would typically need to use ethtool
to configure the device’s network settings
and enable Wake-on-LAN. The platforms currently support two methods for awakening: via a “magic packet” or a “unicast packet”.
Magic Packet
In this mode, a specially designed packet, known as a “magic packet”, is sent over the network. The magic packet can be sent over the entire network and any computer that receives it and has WoL enabled will wake up, provided the packet contains its MAC address. This mode is useful when you want to wake up a specific computer on the network.
On Genio EVK, to use Magic Packet mode with ethtool, you can use the following command:
ethtool -s eth0 wol g echo mem > /sys/power/state
In this command, eth0
is the name of your network interface, and g
enables Wake-on-LAN using magic packet.
The second command suspends the system.
On remote PC, for Windows users, you can use tools like WakeMeOnLan and WakeOnLanX to send a magic packet to wake up a device.
For Linux users, you can use the wakeonlan
or etherwake
tool, which can be installed with the following command:
sudo apt-get install wakeonlan wakeonlan 00:11:22:33:44:55sudo apt-get install etherwake etherwake -i eth0 00:11:22:33:44:55
Unicast Packet
In this mode, a unicast packet is sent directly to a specific computer on the network. Unlike the magic packet, which can be broadcast to all computers on the network, a unicast packet is sent to a single specific destination. This mode is useful when you want to wake up a specific computer without broadcasting a packet to the entire network.
To enable Wake-on-LAN in unicast mode, you can use the following command:
ethtool -s eth0 wol u echo mem > /sys/power/state
In the first command, eth0
is the name of your network interface, and u
enables Wake-on-LAN using magic packet.
The second command suspends the system.
The following commands are an example to wake up EVK from a remote Linux PC via ping
as the unicast packet:
First refresh arp records on remote PC.
sudo arp -i enp0s31f6 -s 192.168.1.2 00:11:22:33:44:55 arp -a
ARP has been refreshed.
? (192.168.1.2) at 00:11:22:33:44:55 [ether] PERM on enp0s31f6 ...
Now send the unicast packet via ping
.
ping 192.168.1.2
You’ll see the EVK will resume.
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=8 ttl=64 time=0.707 msNote
Remember, the Address Resolution Protocol (ARP) has a limited lifetime. When using
ping
as an unicast packet to wake up EVK, if a device can’t be awakened after a long time, it’s normal. You might need to refresh arp records on the remote PC. User may send unicast packets using a packet sending instrument, instead of using the ping method, or use other tools that can send unicast packets. When constructing a unicast packet, the destination MAC address needs to be the MAC address of the platform to be awakened.
Reference Boards
Ethernet on different platforms may have some platform-specific instructions or test results. For example, you will get different benchmark results on different platforms. Please find more details about difference of Ethernet on each platform: