ПРАВИЛЬНЫЙ ОТВЕТ
Это ошибка в самой libnl-3.4.0. Обратите внимание на эту тему: http://lists.infradead.org/pipermail/libnl/2017-November/thread.html#2384
Уже исправлено https://github.com/thom311/libnl/commit/3c427d0f4fcca91a661d85d21cdea89d41271c6c
СТАРЫЙ ОТВЕТ, ЭТО НЕПРАВИЛЬНЫЙ ОТВЕТ
После дня поиска в Google (я разместил этот вопрос как акт отчаяния), я думаю, что нашел ответ.
Создать мост в Linux:
$ sudo ip link add brr type bridge
Теперь посмотрите, что iproute2 отправляет ядру, когда вы пытаетесь его записать:
sudo strace -s 100 -f -o out -x ip link set brr down
...
1644 sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base={{len=32, type=RTM_NEWLINK, flags=NLM_F_REQUEST|NLM_F_ACK, seq=1560223693, pid=0}, {ifi_family=AF_UNSPEC, ifi_type=ARPHRD_NETROM, ifi_index=if_nametoindex("brr"), ifi_flags=0, ifi_change=0x1}}, iov_len=32}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 32
...
Теперь попробуйте отключить интерфейс, используя приведенный выше код. Strace даст нам:
...
1563 sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base={{len=32, type=RTM_SETLINK, flags=NLM_F_REQUEST|NLM_F_ACK, seq=0, pid=0}, {ifi_family=AF_BRIDGE, ifi_type=ARPHRD_NETROM, ifi_index=if_nametoindex("brr"), ifi_flags=IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST|IFF_LOWER_UP, ifi_change=0x1}}, iov_len=32}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 32
...
Эти две строки почти одинаковы с одним исключением:
iproute2:
ifi_family=AF_UNSPEC
mycode:
ifi_family=AF_BRIDGE
и запрос обрабатывается двумя разными функциями в ядре:
rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, 0);
...
rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, 0);
Эти строки из net/core/rtnetlink.c
Итак, установка семейства AF_UNSPEC для исходной ссылки решает проблему. Это не совсем очевидно, хотя.
UPDATE:
Вы не можете изменить специфичные для моста флаги таким образом.