В пакете iproute2 совершенно никуда не годящееся отображение интерфейсов, которые включены в бридж.
Например:
$ bridge link
10: dm1: <BROADCAST,NOARP> mtu 1500 master br1 state disabled priority 32 cost 100
11: dm2: <BROADCAST,NOARP> mtu 1500 master br1 state disabled priority 32 cost 100
12: dm3: <BROADCAST,NOARP> mtu 1500 master br2 state disabled priority 32 cost 100
13: dm4: <BROADCAST,NOARP> mtu 1500 master br2 state disabled priority 32 cost 100
14: dm5: <BROADCAST,NOARP> mtu 1500 master br3 state disabled priority 32 cost 100
Я знаю, что люди пользуются brctl:
$ brctl show
bridge name bridge id STP enabled interfaces
br1 8000.224de67b2d58 no dm1
dm2
br2 8000.9eee27635e9a no dm3
dm4
br3 8000.860666b048d8 no dm5
Я хочу написать свою утилиту, которая будет:
- использовать протокол Netlink
- отображать минимум информации в краткой и понятной форме.
В целом, идея достаточно простая: сделать дамп всех интерфейсов, из которого выделить:
- бриджи
- интерфейсы, которые в него включены
В коде я хочу видеть нечто такое:
[bridge 1] -- [bridge 2] -- ... -- [bridge N]
[slave] [slave] [slave]
[slave] [slave] [slave]
[slave] [slave] [slave]
Это массив структур, внутри каждой из которых будет список:
struct iface {
char * name;
list * slaves
}Переменная slaves будет хранить в себе имена включенных в бридж интерфейсов.
Получаем такой алгоритм:
- Делаем дамп всех интерфейсов
- Если интерфейс включен в какой-то бридж:
- ищем этот бридж
- Если находим, то сохраняем интерфейс в список
slavesэтого бриджа. - Если нет, то создаем новую ячейку бриджа и делаем то же, что в предыдущем пункте.
- Если находим, то сохраняем интерфейс в список
- ищем этот бридж
- Если этот интерфейс - бридж:
- ищем его в массиве.
- Если не находим, то создаем новую ячейку
- ищем его в массиве.