On Linux, using C, how can I find the find the name of the bridge device my ethernet interface is attached to? Is there a sequence of ioctl()
calls I need to make to find the master bridge device?
My C program knows the device name of my TAP adapter from a configuration file (in this case, tap0
). Ultimately, I need the IP address that my TAP adapter responds to. Because it is bridged, the TAP adapter does not have an IP address; it is the bridge
device that has the IP address.
I have a TAP device and VETH device bridged together. ip a
shows the following:
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 500 link/ether 22:d4:fa:a4:89:81 brd ff:ff:ff:ff:ff:ff 3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff inet 10.20.30.40/24 scope global br0 valid_lft forever preferred_lft forever 45: veth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000 link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff
Note the tap0
and veth0
entries: each of their bridge master is br0
(i.e., they have bridge master br0
).
When I call ioctl(SIOCGIFFLAGS)
, and subsequently ioctl(SIOCGIFPFLAGS)
when ifr_name
is tap0
, the only flags that are set are IFF_UP
and IFF_BROADCAST
. I’m at a loss of where to go from here.
Advertisement
Answer
iputils and friends use rtnetlink API between kernel and userspace (the POSIX socket API is just too narrow to perform all the needed tasks, and no clean way to add notifications). If your project is small, it is probably easier and faster to parse the output from the ip utility. This is from experience from writing a network configuration daemon for an embedded linux project. rtnetlink API is initially a bit tricky to use, but if you really want to (many pointers and size-references that needs to be correct), do a little research on it and use iputils source as a starting point.