From: Arvid Brodin <arvid.brodin@enea.com>
To: Stephen Hemminger <shemminger@vyatta.com>
Cc: <netdev@vger.kernel.org>
Subject: Re: bridge: HSR support
Date: Wed, 7 Dec 2011 19:30:21 +0100 [thread overview]
Message-ID: <4EDFB0BD.60701@enea.com> (raw)
In-Reply-To: <20111206152745.7dd6bc1c@nehalam.linuxnetplumber.net>
Stephen Hemminger wrote:
> On Wed, 7 Dec 2011 00:23:21 +0100
> Arvid Brodin <arvid.brodin@enea.com> wrote:
>
>> Stephen Hemminger wrote:
>>> On Fri, 28 Oct 2011 17:34:18 +0200
>>> Arvid Brodin <arvid.brodin@enea.com> wrote:
>>>
>>>> Ok, so after a lot of reading and looking through code I have this idea of a
>>>> standalone solution:
>>>>
>>>> 1) Add ioctls to create (and remove) "hsr" netdevs which encapsulates two
>>>> physical Ethernet interfaces each (somewhat like the bridge code does, but
>>>> with precisely 2 interfaces slaved).
>>> Please use the newer netlink interface and the master attribute for this
>>> rather than inventing yet another ioctl.
>>
>> Is the rtnl interface documented anywhere (the usage of the different IFLA_
>> flags etc.)? Specifically: how do I use the IFLA_MASTER flag (what's the
>> meaning of the 32-bit data it wants, and how is it used by the kernel)? I
>> haven't been very successful figuring this out by looking at the kernel code.
>
>
> Look at bridging or bonding.
Believe me, I have! :) Turns out IFLA_MASTER is actually handled in net/core/rtnetlink.c.
Although the message is sent to the slave device, the functions called are the
master device's ndo_{add,del}_slave(). Looking at the bridging and bonding
implementations br_add_slave() and bond_enslave() and the functions they call,
it all boils down mostly to
* netdev_set_master() which assigns slave_dev->master = master_dev.
* bonding also set IFF_SLAVE on the slave.
* netdev_rx_handler_register(slave_dev, ). "This handler will then be called
from __netif_receive_skb."
So far so good, but:
* I don't know the meaning of the IFF_SLAVE flag. It's referenced all over the place
(core, vlan, bonding, ipv6, eql). Do I need to/want to set this?
* I don't know the effects of setting dev->master. Do I need/want this?
* I don't want to forward all ingress frames on the slave devices to my master
device; I only want the ones with protocol 0x88FB to be forwarded (other
frames should be received by the slaves as normal). I think I already have this
covered by registering a protocol handler (using dev_add_pack(packet_type)).
So perhaps calling netdev_rx_handler_register() is not necessary in my case?
* As far as I can see, neither bridging nor bonding is handled by the ip program
(iproute2 suite)? I.e. no examples of binding more than one interface to a
virtual interface when it comes to which messages to send, etc. VLAN uses
IFLA_IFNAME (name of the vlan link), IFLA_LINK (physical link behind the vlan
link), and some IFLA_VLAN-specific messages.
What I want to do is to atomically (from a user space perspective) create the
HSR bonding, i.e.:
# ip link add name hsr0 type hsr slave1 slave2
I have written a hsr "plugin" to iproute2 that accepts these parameters, I'm
just not sure how to tell the kernel about them. Perhaps then I should define
my own IFLA_HSR_UNSPEC, IFLA_HSR_SLAVE1, IFLA_HSR_SLAVE2 messages?
>> Also, how do I best tell the kernel which my slave devices are when creating
>> the hsr device? Should I create my own IFLA_HSR_UNSPEC, etc, or can I use some
>> of the generic flags?
>
> Look at macvlan, vlan, or bridging. There this is done by processing a newlink
> message.
macvlan and vlan both use IFLA_LINK to tell the kernel about their single
underlying "real" device. None of these use more than one underlying device.
Bridging does not implement newlink at all (uses ioctls, I think).
>> Oh, and the kernel (struct rtnl_link_ops).newlink method has two (struct
>> nlattr *[]) params: tb and data. What are their roles?
>>
Heh, I just realised that the difference is that "tb" contains generic (IFLA_)
message data and "data" contains specific (e.g. IFLA_VLAN_) message data.
--
Arvid Brodin
Enea Services Stockholm AB
next prev parent reply other threads:[~2011-12-07 18:30 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <4E948A04.8060400@enea.com>
[not found] ` <20111011112821.28cd3e51@nehalam.linuxnetplumber.net>
2011-10-11 23:51 ` bridge: HSR support Arvid Brodin
2011-10-12 13:28 ` David Lamparter
2011-10-12 14:24 ` Arvid Brodin
2011-10-24 14:17 ` Arvid Brodin
2011-10-28 15:34 ` Arvid Brodin
2011-10-28 15:54 ` Stephen Hemminger
2011-10-28 16:36 ` Arvid Brodin
2011-12-06 23:23 ` Arvid Brodin
2011-12-06 23:27 ` Stephen Hemminger
2011-12-07 18:30 ` Arvid Brodin [this message]
2011-12-07 19:59 ` Jay Vosburgh
2011-12-08 14:45 ` Arvid Brodin
2011-11-21 16:52 ` Arvid Brodin
2012-01-06 18:11 ` Arvid Brodin
2012-01-12 18:02 ` bridge: HSR support - possible recursive locking? Arvid Brodin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EDFB0BD.60701@enea.com \
--to=arvid.brodin@enea.com \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.