All of lore.kernel.org
 help / color / mirror / Atom feed
* bonding xmit_policy
@ 2011-11-13  2:55 Simon Chen
  2011-11-13 20:26 ` Nicolas de Pesloüan
  0 siblings, 1 reply; 4+ messages in thread
From: Simon Chen @ 2011-11-13  2:55 UTC (permalink / raw)
  To: netdev

Hi folks,

It looks like that there are three entries in xmit_policy (hashing for
deciding egress phy int) for bonded interfaces:

const struct bond_parm_tbl xmit_hashtype_tbl[] = {
{       "layer2",               BOND_XMIT_POLICY_LAYER2},
{       "layer3+4",             BOND_XMIT_POLICY_LAYER34},
{       "layer2+3",             BOND_XMIT_POLICY_LAYER23},
{       NULL,                   -1},
};


We can set the xmit_policy either at module initiation, or later via
/sys. However, this xmit_policy isn't really read anywhere. Are
different policies really implemented?

Thanks.
-Simon

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: bonding xmit_policy
  2011-11-13  2:55 bonding xmit_policy Simon Chen
@ 2011-11-13 20:26 ` Nicolas de Pesloüan
  2011-11-15  6:20   ` Simon Chen
  0 siblings, 1 reply; 4+ messages in thread
From: Nicolas de Pesloüan @ 2011-11-13 20:26 UTC (permalink / raw)
  To: Simon Chen; +Cc: netdev

Le 13/11/2011 03:55, Simon Chen a écrit :
> Hi folks,
>
> It looks like that there are three entries in xmit_policy (hashing for
> deciding egress phy int) for bonded interfaces:
>
> const struct bond_parm_tbl xmit_hashtype_tbl[] = {
> {       "layer2",               BOND_XMIT_POLICY_LAYER2},
> {       "layer3+4",             BOND_XMIT_POLICY_LAYER34},
> {       "layer2+3",             BOND_XMIT_POLICY_LAYER23},
> {       NULL,                   -1},
> };
>
>
> We can set the xmit_policy either at module initiation, or later via
> /sys. However, this xmit_policy isn't really read anywhere. Are
> different policies really implemented?

The table is used in two different locations:

In drivers/net/bonding/bond_main.c:

	xmit_hashtype = bond_parse_parm(xmit_hash_policy, xmit_hashtype_tbl);
	[...]
	params->xmit_policy = xmit_hashtype;

In drivers/net/bonding/bond_sysfs.c:

	new_value = bond_parse_parm(buf, xmit_hashtype_tbl);
	[...]
	bonds->params.xmit_policy = new_value;

Then, in drivers/net/bonding/bond_main.c, the value in bonds->params.xmit_policy is used to setup a 
callback into bond->xmit_hash_policy.

	static void bond_set_xmit_hash_policy(struct bonding *bond)
	{
	        switch (bond->params.xmit_policy) {
	        case BOND_XMIT_POLICY_LAYER23:
	                bond->xmit_hash_policy = bond_xmit_hash_policy_l23;
	                break;
	        case BOND_XMIT_POLICY_LAYER34:
	                bond->xmit_hash_policy = bond_xmit_hash_policy_l34;
	                break;
	        case BOND_XMIT_POLICY_LAYER2:
         	default:
	                bond->xmit_hash_policy = bond_xmit_hash_policy_l2;
	                break;
	        }
	}

Then, in drivers/net/bonding/bond_3ad.c and in drivers/net/bonding/bond_main.c, the callback is used 
to select a slave for xmit, for the two modes where xmit_hash_policy have a meaning:

         slave_agg_no = bond->xmit_hash_policy(skb, slaves_in_agg);

         slave_no = bond->xmit_hash_policy(skb, bond->slave_cnt);


So, yes, those policies are really implemented.

	Nicolas.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: bonding xmit_policy
  2011-11-13 20:26 ` Nicolas de Pesloüan
@ 2011-11-15  6:20   ` Simon Chen
  2011-11-15  7:12     ` Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Simon Chen @ 2011-11-15  6:20 UTC (permalink / raw)
  To: Nicolas de Pesloüan; +Cc: netdev

Thanks, my bad.

It is pretty strange that when I use 802.3ad mode, all my packets
(from different TCP flows) egress the same NIC even though I choose
xmit_policy to be layer3+4. That's why I wasn't quite sure whether the
policy is indeed in place.

When I switch to balance-xor mode, the packets are roughly evenly
distributed across two NICs.

-Simon

On Sun, Nov 13, 2011 at 3:26 PM, Nicolas de Pesloüan
<nicolas.2p.debian@gmail.com> wrote:
> Le 13/11/2011 03:55, Simon Chen a écrit :
>>
>> Hi folks,
>>
>> It looks like that there are three entries in xmit_policy (hashing for
>> deciding egress phy int) for bonded interfaces:
>>
>> const struct bond_parm_tbl xmit_hashtype_tbl[] = {
>> {       "layer2",               BOND_XMIT_POLICY_LAYER2},
>> {       "layer3+4",             BOND_XMIT_POLICY_LAYER34},
>> {       "layer2+3",             BOND_XMIT_POLICY_LAYER23},
>> {       NULL,                   -1},
>> };
>>
>>
>> We can set the xmit_policy either at module initiation, or later via
>> /sys. However, this xmit_policy isn't really read anywhere. Are
>> different policies really implemented?
>
> The table is used in two different locations:
>
> In drivers/net/bonding/bond_main.c:
>
>        xmit_hashtype = bond_parse_parm(xmit_hash_policy, xmit_hashtype_tbl);
>        [...]
>        params->xmit_policy = xmit_hashtype;
>
> In drivers/net/bonding/bond_sysfs.c:
>
>        new_value = bond_parse_parm(buf, xmit_hashtype_tbl);
>        [...]
>        bonds->params.xmit_policy = new_value;
>
> Then, in drivers/net/bonding/bond_main.c, the value in
> bonds->params.xmit_policy is used to setup a callback into
> bond->xmit_hash_policy.
>
>        static void bond_set_xmit_hash_policy(struct bonding *bond)
>        {
>                switch (bond->params.xmit_policy) {
>                case BOND_XMIT_POLICY_LAYER23:
>                        bond->xmit_hash_policy = bond_xmit_hash_policy_l23;
>                        break;
>                case BOND_XMIT_POLICY_LAYER34:
>                        bond->xmit_hash_policy = bond_xmit_hash_policy_l34;
>                        break;
>                case BOND_XMIT_POLICY_LAYER2:
>                default:
>                        bond->xmit_hash_policy = bond_xmit_hash_policy_l2;
>                        break;
>                }
>        }
>
> Then, in drivers/net/bonding/bond_3ad.c and in
> drivers/net/bonding/bond_main.c, the callback is used to select a slave for
> xmit, for the two modes where xmit_hash_policy have a meaning:
>
>        slave_agg_no = bond->xmit_hash_policy(skb, slaves_in_agg);
>
>        slave_no = bond->xmit_hash_policy(skb, bond->slave_cnt);
>
>
> So, yes, those policies are really implemented.
>
>        Nicolas.
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: bonding xmit_policy
  2011-11-15  6:20   ` Simon Chen
@ 2011-11-15  7:12     ` Eric Dumazet
  0 siblings, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2011-11-15  7:12 UTC (permalink / raw)
  To: Simon Chen; +Cc: Nicolas de Pesloüan, netdev

Le mardi 15 novembre 2011 à 01:20 -0500, Simon Chen a écrit :
> Thanks, my bad.
> 
> It is pretty strange that when I use 802.3ad mode, all my packets
> (from different TCP flows) egress the same NIC even though I choose
> xmit_policy to be layer3+4. That's why I wasn't quite sure whether the
> policy is indeed in place.
> 
> When I switch to balance-xor mode, the packets are roughly evenly
> distributed across two NICs.

AFAIK, layer4 information (soure/dst ports) is limited to ipv4 TCP/UDP
trafic.

Moreover, if your bond has 2 ports, only low order bit of source and dst
port is used.

layer4_xor = ntohs((*layer4hdr ^ *(layer4hdr + 1)));

So if your trafic is RTP, it probably use only even ports, (RTCP using
odd ports), and uses a single slave.

 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-11-15  7:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-13  2:55 bonding xmit_policy Simon Chen
2011-11-13 20:26 ` Nicolas de Pesloüan
2011-11-15  6:20   ` Simon Chen
2011-11-15  7:12     ` Eric Dumazet

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.