Re: carp: send only IPv4 carp packets on dual stack interface

2020-05-23 Thread Christopher Zimmermann

On Sat, May 23, 2020 at 01:55:54PM +1000, David Gwynne wrote:




On 23 May 2020, at 8:44 am, Christopher Zimmermann  wrote:

On Sun, Jan 19, 2020 at 01:32:17PM +, Stuart Henderson wrote:

On 2020/01/19 00:11, Sebastian Benoit wrote:

chr...@openbsd.org(chr...@openbsd.org) on 2020.01.18 06:18:21 +0100:
> On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:
> >Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:
> >>Hi,
> >>
> >>as far as I can see a dual stack carp interface does not care whether it
> >>receives advertisements addressed to IPv4 or IPv6. Any one will do.
> >>So I propose to send IPv6 advertisements only when IPv4 is not possible.
> >>
> >>Why?
> >>
> >>- Noise can be reduced by using unicast advertisements.
> >>  This is only possible for IPv4 by ``ifconfig carppeer``.
> >>  I don't like flooding the whole network with carp advertisements when
> >>  I may also unicast them.
> >
> >Maybe i'm getting confused, but in the problem description you were talking
> >about v6 vs v4, and here you argue about unicast (vs multicast?) being
> >better. Thats orthogonal, isnt it?
>
> Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for
> IPv6.
>
> >>- breaking IPv6 connectivity (for example by running iked without -6)
> >>  will start a preempt-war, because failing ip6_output will cause the
> >>  demote counter to be increased. That's what hit me.
> >
> >But the whole point of carp is to notice broken connectivity. If you run v6
> >on an interface, you want to know if its working, no?
>
> I grant you that much. But what kind of failures do you hope to detect
> on the _sending_ carp master, that would not also affect the backup?

sure: misconfigured pf. Missing routes. Buggy switch.


misconfigured mac address filter on switch.


I'm afraid you guys haven't yet got the point I'm trying to make.

Current behaviour is that in a dual-stack carp setup failover only happens when 
advertisements on _both_ AFs fail to reach the backup.
A node in backup state will stay in backup state as long as it receives _any_ 
advertisements.
In my mind this is the only sensible way for a backup node to react.

If a backup node that fails to receive advertisements of only one AF would 
transition to master it would in most cases start a preempt war.
So why do we even send dual-stack advertisements?
The only effect those dual-stack ipv6 advertisements currently have is that 
they prevent failover when ipv4 connectivity breaks.

I would propose to choose one "sentinel" AF (in this case ipv4) and failover 
whenever advertisements of this AF fail to reach the backup.

Monitoring multiple AFs is not helpful, because there is no good way in which 
to react to a failure that affects only one AF.


I don't know if this helps, but at work we use separate carp interfaces for v4 
and v6. It ends up looking a bit like this:

# cat /etc/hostname.vlan871:
parent aggr0 vnetid 871
inet alias 192.0.2.2/24
inet6 alias 2001:db8:871::2/64
up

# cat /etc/hostname.carp40871
carpdev vlan871 vhid 47
-inet6
-group carp
group ipv4g
inet alias 192.0.2.1/24
up

# cat /etc/hostname.carp60871
carpdev vlan871 vhid 61
-group carp
group ipv6g
inet6 alias 2001:db8:871::1/64
up

This let's us run a pair of firewalls one active for v4 and the other for v6. 
We don't do any af-to in PF, so it works pretty well. But yeah, it means v4 and 
v6 fail separately.


Yes that is a sensible and coherent setup where ipv4 and ipv6 are kept 
completely separate.
But what I'm proposing to change is the dual stack mode of carp where 
there is only one interface. There is no use for advertisements on two 
address families, because in case of failure of only one address family 
there is no sensible way to respond to that failure.


> >At the very least, this needs some more thought and testing in 
> >all > >the ways

> >carp can be configured.
>
> Anyway, my main concern indeed is the broadcast noise generated by carp
> and I would be equally happy if we had a ``carppeer6`` option. Would
> that be considered?

of course carppeer should work with v6, and as claudio says without an extra
keyword in ifconfig, but thats a trivial detail.



Currently carp only handles one address per af, setting carppeer twice
changes the current peer address rather than adding another. A trivial
implementation that sets the v4 peer address if a v4 address is passed
in, and sets the v6 peer address if a v6 address is passed in, that
would mean things work differently with

ifconfig carp1 carppeer $foo
ifconfig carp1 carppeer $bar

depending on whether foo/bar are v4 or v6. Also removing a configured
carppeer address to reset to multicast is just done with -carppeer
with no way to indicate the af.

It would work pretty nicely if you could set multiple carppeer addresses
(of whatever af) and remove them individually. That's a more complex
change (carp would need to keep a list of peers per af rather than a
single address) but without something 

Re: carp: send only IPv4 carp packets on dual stack interface

2020-05-22 Thread David Gwynne



> On 23 May 2020, at 8:44 am, Christopher Zimmermann  wrote:
> 
> On Sun, Jan 19, 2020 at 01:32:17PM +, Stuart Henderson wrote:
>> On 2020/01/19 00:11, Sebastian Benoit wrote:
>>> chr...@openbsd.org(chr...@openbsd.org) on 2020.01.18 06:18:21 +0100:
>>> > On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:
>>> > >Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:
>>> > >>Hi,
>>> > >>
>>> > >>as far as I can see a dual stack carp interface does not care whether it
>>> > >>receives advertisements addressed to IPv4 or IPv6. Any one will do.
>>> > >>So I propose to send IPv6 advertisements only when IPv4 is not possible.
>>> > >>
>>> > >>Why?
>>> > >>
>>> > >>- Noise can be reduced by using unicast advertisements.
>>> > >>  This is only possible for IPv4 by ``ifconfig carppeer``.
>>> > >>  I don't like flooding the whole network with carp advertisements when
>>> > >>  I may also unicast them.
>>> > >
>>> > >Maybe i'm getting confused, but in the problem description you were 
>>> > >talking
>>> > >about v6 vs v4, and here you argue about unicast (vs multicast?) being
>>> > >better. Thats orthogonal, isnt it?
>>> >
>>> > Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for
>>> > IPv6.
>>> >
>>> > >>- breaking IPv6 connectivity (for example by running iked without -6)
>>> > >>  will start a preempt-war, because failing ip6_output will cause the
>>> > >>  demote counter to be increased. That's what hit me.
>>> > >
>>> > >But the whole point of carp is to notice broken connectivity. If you run 
>>> > >v6
>>> > >on an interface, you want to know if its working, no?
>>> >
>>> > I grant you that much. But what kind of failures do you hope to detect
>>> > on the _sending_ carp master, that would not also affect the backup?
>>> 
>>> sure: misconfigured pf. Missing routes. Buggy switch.
>> 
>> misconfigured mac address filter on switch.
> 
> I'm afraid you guys haven't yet got the point I'm trying to make.
> 
> Current behaviour is that in a dual-stack carp setup failover only happens 
> when advertisements on _both_ AFs fail to reach the backup.
> A node in backup state will stay in backup state as long as it receives _any_ 
> advertisements.
> In my mind this is the only sensible way for a backup node to react.
> 
> If a backup node that fails to receive advertisements of only one AF would 
> transition to master it would in most cases start a preempt war. 
> So why do we even send dual-stack advertisements?
> The only effect those dual-stack ipv6 advertisements currently have is that 
> they prevent failover when ipv4 connectivity breaks.
> 
> I would propose to choose one "sentinel" AF (in this case ipv4) and failover 
> whenever advertisements of this AF fail to reach the backup.
> 
> Monitoring multiple AFs is not helpful, because there is no good way in which 
> to react to a failure that affects only one AF.

I don't know if this helps, but at work we use separate carp interfaces for v4 
and v6. It ends up looking a bit like this:

# cat /etc/hostname.vlan871:
parent aggr0 vnetid 871
inet alias 192.0.2.2/24
inet6 alias 2001:db8:871::2/64
up

# cat /etc/hostname.carp40871
carpdev vlan871 vhid 47
-inet6
-group carp
group ipv4g
inet alias 192.0.2.1/24
up

# cat /etc/hostname.carp60871
carpdev vlan871 vhid 61
-group carp
group ipv6g
inet6 alias 2001:db8:871::1/64
up

This let's us run a pair of firewalls one active for v4 and the other for v6. 
We don't do any af-to in PF, so it works pretty well. But yeah, it means v4 and 
v6 fail separately.

> 
>>> > >At the very least, this needs some more thought and testing in all > 
>>> > >>the ways
>>> > >carp can be configured.
>>> >
>>> > Anyway, my main concern indeed is the broadcast noise generated by carp
>>> > and I would be equally happy if we had a ``carppeer6`` option. Would
>>> > that be considered?
>>> 
>>> of course carppeer should work with v6, and as claudio says without an extra
>>> keyword in ifconfig, but thats a trivial detail.
>>> 
>> 
>> Currently carp only handles one address per af, setting carppeer twice
>> changes the current peer address rather than adding another. A trivial
>> implementation that sets the v4 peer address if a v4 address is passed
>> in, and sets the v6 peer address if a v6 address is passed in, that
>> would mean things work differently with
>> 
>> ifconfig carp1 carppeer $foo
>> ifconfig carp1 carppeer $bar
>> 
>> depending on whether foo/bar are v4 or v6. Also removing a configured
>> carppeer address to reset to multicast is just done with -carppeer
>> with no way to indicate the af.
>> 
>> It would work pretty nicely if you could set multiple carppeer addresses
>> (of whatever af) and remove them individually. That's a more complex
>> change (carp would need to keep a list of peers per af rather than a
>> single address) but without something like that they can't really be
>> equals and it feels like shoehorning both afs into the same keyword
>> will just be 

Re: carp: send only IPv4 carp packets on dual stack interface

2020-05-22 Thread Christopher Zimmermann

On Sun, Jan 19, 2020 at 01:32:17PM +, Stuart Henderson wrote:

On 2020/01/19 00:11, Sebastian Benoit wrote:

chr...@openbsd.org(chr...@openbsd.org) on 2020.01.18 06:18:21 +0100:
> On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:
> >Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:
> >>Hi,
> >>
> >>as far as I can see a dual stack carp interface does not care whether it
> >>receives advertisements addressed to IPv4 or IPv6. Any one will do.
> >>So I propose to send IPv6 advertisements only when IPv4 is not possible.
> >>
> >>Why?
> >>
> >>- Noise can be reduced by using unicast advertisements.
> >>  This is only possible for IPv4 by ``ifconfig carppeer``.
> >>  I don't like flooding the whole network with carp advertisements when
> >>  I may also unicast them.
> >
> >Maybe i'm getting confused, but in the problem description you were talking
> >about v6 vs v4, and here you argue about unicast (vs multicast?) being
> >better. Thats orthogonal, isnt it?
>
> Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for
> IPv6.
>
> >>- breaking IPv6 connectivity (for example by running iked without -6)
> >>  will start a preempt-war, because failing ip6_output will cause the
> >>  demote counter to be increased. That's what hit me.
> >
> >But the whole point of carp is to notice broken connectivity. If you run v6
> >on an interface, you want to know if its working, no?
>
> I grant you that much. But what kind of failures do you hope to detect
> on the _sending_ carp master, that would not also affect the backup?

sure: misconfigured pf. Missing routes. Buggy switch.


misconfigured mac address filter on switch.


I'm afraid you guys haven't yet got the point I'm trying to make.

Current behaviour is that in a dual-stack carp setup failover only 
happens when advertisements on _both_ AFs fail to reach the backup.
A node in backup state will stay in backup state as long as it receives 
_any_ advertisements.

In my mind this is the only sensible way for a backup node to react.

If a backup node that fails to receive advertisements of only one AF 
would transition to master it would in most cases start a preempt war. 


So why do we even send dual-stack advertisements?
The only effect those dual-stack ipv6 advertisements currently have is 
that they prevent failover when ipv4 connectivity breaks.


I would propose to choose one "sentinel" AF (in this case ipv4) and 
failover whenever advertisements of this AF fail to reach the backup.


Monitoring multiple AFs is not helpful, because there is no good way in 
which to react to a failure that affects only one AF.


> >At the very least, this needs some more thought and testing in all 
> >the ways

> >carp can be configured.
>
> Anyway, my main concern indeed is the broadcast noise generated by carp
> and I would be equally happy if we had a ``carppeer6`` option. Would
> that be considered?

of course carppeer should work with v6, and as claudio says without an extra
keyword in ifconfig, but thats a trivial detail.



Currently carp only handles one address per af, setting carppeer twice
changes the current peer address rather than adding another. A trivial
implementation that sets the v4 peer address if a v4 address is passed
in, and sets the v6 peer address if a v6 address is passed in, that
would mean things work differently with

ifconfig carp1 carppeer $foo
ifconfig carp1 carppeer $bar

depending on whether foo/bar are v4 or v6. Also removing a configured
carppeer address to reset to multicast is just done with -carppeer
with no way to indicate the af.

It would work pretty nicely if you could set multiple carppeer addresses
(of whatever af) and remove them individually. That's a more complex
change (carp would need to keep a list of peers per af rather than a
single address) but without something like that they can't really be
equals and it feels like shoehorning both afs into the same keyword
will just be confusing.



--
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2  0DEF 87E2 92A7 13E5 DEE1



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-19 Thread Stuart Henderson
On 2020/01/19 00:11, Sebastian Benoit wrote:
> chr...@openbsd.org(chr...@openbsd.org) on 2020.01.18 06:18:21 +0100:
> > On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:
> > >Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:
> > >>Hi,
> > >>
> > >>as far as I can see a dual stack carp interface does not care whether it
> > >>receives advertisements addressed to IPv4 or IPv6. Any one will do.
> > >>So I propose to send IPv6 advertisements only when IPv4 is not possible.
> > >>
> > >>Why?
> > >>
> > >>- Noise can be reduced by using unicast advertisements.
> > >>  This is only possible for IPv4 by ``ifconfig carppeer``.
> > >>  I don't like flooding the whole network with carp advertisements when
> > >>  I may also unicast them.
> > >
> > >Maybe i'm getting confused, but in the problem description you were talking
> > >about v6 vs v4, and here you argue about unicast (vs multicast?) being
> > >better. Thats orthogonal, isnt it?
> > 
> > Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for 
> > IPv6.
> > 
> > >>- breaking IPv6 connectivity (for example by running iked without -6)
> > >>  will start a preempt-war, because failing ip6_output will cause the
> > >>  demote counter to be increased. That's what hit me.
> > >
> > >But the whole point of carp is to notice broken connectivity. If you run v6
> > >on an interface, you want to know if its working, no?
> > 
> > I grant you that much. But what kind of failures do you hope to detect 
> > on the _sending_ carp master, that would not also affect the backup?
> 
> sure: misconfigured pf. Missing routes. Buggy switch. 

misconfigured mac address filter on switch.

> > >At the very least, this needs some more thought and testing in all the ways
> > >carp can be configured.
> > 
> > Anyway, my main concern indeed is the broadcast noise generated by carp 
> > and I would be equally happy if we had a ``carppeer6`` option. Would 
> > that be considered?
> 
> of course carppeer should work with v6, and as claudio says without an extra
> keyword in ifconfig, but thats a trivial detail.
> 

Currently carp only handles one address per af, setting carppeer twice
changes the current peer address rather than adding another. A trivial
implementation that sets the v4 peer address if a v4 address is passed
in, and sets the v6 peer address if a v6 address is passed in, that
would mean things work differently with

ifconfig carp1 carppeer $foo
ifconfig carp1 carppeer $bar

depending on whether foo/bar are v4 or v6. Also removing a configured
carppeer address to reset to multicast is just done with -carppeer
with no way to indicate the af.

It would work pretty nicely if you could set multiple carppeer addresses
(of whatever af) and remove them individually. That's a more complex
change (carp would need to keep a list of peers per af rather than a
single address) but without something like that they can't really be
equals and it feels like shoehorning both afs into the same keyword
will just be confusing.



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-18 Thread Sebastian Benoit
chr...@openbsd.org(chr...@openbsd.org) on 2020.01.18 06:18:21 +0100:
> On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:
> >Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:
> >>Hi,
> >>
> >>as far as I can see a dual stack carp interface does not care whether it
> >>receives advertisements addressed to IPv4 or IPv6. Any one will do.
> >>So I propose to send IPv6 advertisements only when IPv4 is not possible.
> >>
> >>Why?
> >>
> >>- Noise can be reduced by using unicast advertisements.
> >>  This is only possible for IPv4 by ``ifconfig carppeer``.
> >>  I don't like flooding the whole network with carp advertisements when
> >>  I may also unicast them.
> >
> >Maybe i'm getting confused, but in the problem description you were talking
> >about v6 vs v4, and here you argue about unicast (vs multicast?) being
> >better. Thats orthogonal, isnt it?
> 
> Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for 
> IPv6.
> 
> >>- breaking IPv6 connectivity (for example by running iked without -6)
> >>  will start a preempt-war, because failing ip6_output will cause the
> >>  demote counter to be increased. That's what hit me.
> >
> >But the whole point of carp is to notice broken connectivity. If you run v6
> >on an interface, you want to know if its working, no?
> 
> I grant you that much. But what kind of failures do you hope to detect 
> on the _sending_ carp master, that would not also affect the backup?

sure: misconfigured pf. Missing routes. Buggy switch. 
 
> >At the very least, this needs some more thought and testing in all the ways
> >carp can be configured.
> 
> Anyway, my main concern indeed is the broadcast noise generated by carp 
> and I would be equally happy if we had a ``carppeer6`` option. Would 
> that be considered?

of course carppeer should work with v6, and as claudio says without an extra
keyword in ifconfig, but thats a trivial detail.



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-18 Thread Claudio Jeker
On Sat, Jan 18, 2020 at 01:45:18PM +, Stuart Henderson wrote:
> On 2020/01/18 06:18, chr...@openbsd.org wrote:
> > Anyway, my main concern indeed is the broadcast noise generated by carp and
> > I would be equally happy if we had a ``carppeer6`` option. Would that be
> > considered?
> 
> Adding carppeer6 seems a better/safer approach.
> 

Is there a need to add a new command for this or could carppeer be exended
to support AF_INET6? In general it is better if there are less IPv6
specific commands.

-- 
:wq Claudio



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-18 Thread Stuart Henderson
On 2020/01/18 06:18, chr...@openbsd.org wrote:
> Anyway, my main concern indeed is the broadcast noise generated by carp and
> I would be equally happy if we had a ``carppeer6`` option. Would that be
> considered?

Adding carppeer6 seems a better/safer approach.



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-18 Thread Stefan Sperling
On Sat, Jan 18, 2020 at 06:18:21AM +0100, chr...@openbsd.org wrote:
> Anyway, my main concern indeed is the broadcast noise generated by carp and
> I would be equally happy if we had a ``carppeer6`` option. Would that be
> considered?

I could make use of carppeer6, too.



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-17 Thread chrisz

On Wed, Jan 15, 2020 at 12:47:28PM +0100, Sebastian Benoit wrote:

Christopher Zimmermann(chr...@openbsd.org) on 2020.01.15 11:55:43 +0100:

Hi,

as far as I can see a dual stack carp interface does not care whether it
receives advertisements addressed to IPv4 or IPv6. Any one will do.
So I propose to send IPv6 advertisements only when IPv4 is not possible.

Why?

- Noise can be reduced by using unicast advertisements.
  This is only possible for IPv4 by ``ifconfig carppeer``.
  I don't like flooding the whole network with carp advertisements when
  I may also unicast them.


Maybe i'm getting confused, but in the problem description you were talking
about v6 vs v4, and here you argue about unicast (vs multicast?) being
better. Thats orthogonal, isnt it?


Yes, kind of. The point is we support ``carppeer`` for IPv4, but not for 
IPv6.



- breaking IPv6 connectivity (for example by running iked without -6)
  will start a preempt-war, because failing ip6_output will cause the
  demote counter to be increased. That's what hit me.


But the whole point of carp is to notice broken connectivity. If you run v6
on an interface, you want to know if its working, no?


I grant you that much. But what kind of failures do you hope to detect 
on the _sending_ carp master, that would not also affect the backup?



At the very least, this needs some more thought and testing in all the ways
carp can be configured.


Anyway, my main concern indeed is the broadcast noise generated by carp 
and I would be equally happy if we had a ``carppeer6`` option. Would 
that be considered?



I would suggest a change like this:

Index: ip_carp.c
===
RCS file: /cvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.342
diff -u -p -r1.342 ip_carp.c
--- ip_carp.c   8 Nov 2019 07:51:41 -   1.342
+++ ip_carp.c   15 Jan 2020 10:45:56 -
@@ -1175,7 +1175,7 @@ carp_send_ad(struct carp_vhost_entry *vh
}
}
 #ifdef INET6
-   if (sc->sc_naddrs6) {
+   else if (sc->sc_naddrs6) {
struct ip6_hdr *ip6;

MGETHDR(m, M_DONTWAIT, MT_HEADER);


one could also use a slightly smaller hammer and only avoid sending IPv6
if the user requested an IPv4 unicast address:

-   if (sc->sc_naddrs6) {
+   if (sc->sc_naddrs6 &&
+   (! sc->sc_naddrs ||
+   sc->sc_peer.s_addr == INADDR_CARP_GROUP) ) {


Christopher


--
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2  0DEF 87E2 92A7 13E5 DEE1



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-15 Thread Stuart Henderson
On 2020/01/15 12:04, Janne Johansson wrote:
> Den ons 15 jan. 2020 kl 11:57 skrev Christopher Zimmermann <
> chr...@openbsd.org>:
> 
> > So I propose to send IPv6 advertisements only when IPv4 is not possible.
> >
> > Why?
> >
> > - Noise can be reduced by using unicast advertisements.
> >This is only possible for IPv4 by ``ifconfig carppeer``.
> >I don't like flooding the whole network with carp advertisements when
> >I may also unicast them.
> >
> 
> This sentence seems to assume people would only ever use two members in a
> carp group, whereas having more than that is not impossible.
> In those cases full meshed unicast would cause more packets than
> multicasting one packet every second (+advskew).
> 
> -- 
> May the most significant bit of your life be positive.

I just filter the MACs on my switches..



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-15 Thread Christopher Zimmermann



On January 15, 2020 12:04:56 PM GMT+01:00, Janne Johansson 
 wrote:
>Den ons 15 jan. 2020 kl 11:57 skrev Christopher Zimmermann <
>chr...@openbsd.org>:
>
>> So I propose to send IPv6 advertisements only when IPv4 is not
>possible.
>>
>> Why?
>>
>> - Noise can be reduced by using unicast advertisements.
>>This is only possible for IPv4 by ``ifconfig carppeer``.
>>I don't like flooding the whole network with carp advertisements
>when
>>I may also unicast them.
>>
>
>This sentence seems to assume people would only ever use two members in
>a
>carp group

Well, even though it may have seemed like it, I did not assume this.

My concern is more about sending out through two network stacks, one of which 
(IPv6) may fail and produce unwanted effects in carp's demote logic.
Is there something to gain by sending out though both stacks?
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2  0DEF 87E2 92A7 13E5 DEE1



Re: carp: send only IPv4 carp packets on dual stack interface

2020-01-15 Thread Janne Johansson
Den ons 15 jan. 2020 kl 11:57 skrev Christopher Zimmermann <
chr...@openbsd.org>:

> So I propose to send IPv6 advertisements only when IPv4 is not possible.
>
> Why?
>
> - Noise can be reduced by using unicast advertisements.
>This is only possible for IPv4 by ``ifconfig carppeer``.
>I don't like flooding the whole network with carp advertisements when
>I may also unicast them.
>

This sentence seems to assume people would only ever use two members in a
carp group, whereas having more than that is not impossible.
In those cases full meshed unicast would cause more packets than
multicasting one packet every second (+advskew).

-- 
May the most significant bit of your life be positive.


carp: send only IPv4 carp packets on dual stack interface

2020-01-15 Thread Christopher Zimmermann

Hi,

as far as I can see a dual stack carp interface does not care whether it 
receives advertisements addressed to IPv4 or IPv6. Any one will do.

So I propose to send IPv6 advertisements only when IPv4 is not possible.

Why?

- Noise can be reduced by using unicast advertisements.
  This is only possible for IPv4 by ``ifconfig carppeer``.
  I don't like flooding the whole network with carp advertisements when 
  I may also unicast them.
- breaking IPv6 connectivity (for example by running iked without -6) 
  will start a preempt-war, because failing ip6_output will cause the 
  demote counter to be increased. That's what hit me.


I would suggest a change like this:

Index: ip_carp.c
===
RCS file: /cvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.342
diff -u -p -r1.342 ip_carp.c
--- ip_carp.c   8 Nov 2019 07:51:41 -   1.342
+++ ip_carp.c   15 Jan 2020 10:45:56 -
@@ -1175,7 +1175,7 @@ carp_send_ad(struct carp_vhost_entry *vh
}
}
 #ifdef INET6
-   if (sc->sc_naddrs6) {
+   else if (sc->sc_naddrs6) {
struct ip6_hdr *ip6;
 
 		MGETHDR(m, M_DONTWAIT, MT_HEADER);



one could also use a slightly smaller hammer and only avoid sending IPv6 
if the user requested an IPv4 unicast address:


-   if (sc->sc_naddrs6) {
+   if (sc->sc_naddrs6 &&
+   (! sc->sc_naddrs ||
+   sc->sc_peer.s_addr == INADDR_CARP_GROUP) ) {


Christopher


--
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2  0DEF 87E2 92A7 13E5 DEE1