simplify valid carp interface check in carp_proto_input_if

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

simplify valid carp interface check in carp_proto_input_if

David Gwynne-5
this copies the "valid interface" check from carp6_proto_input_if
to carp_proto_input_if. the current check looks to see if the current
interface is carp, or if the current interface has any carps attached
to it. the carp6_proto_input_if check just checks if the current
interface is IFT_CARP or not.

right now i think we only really support carp(4) on top of ethernet
interfaces, and the ethernet stack goes to some lengths to make
packets for a carp interface appear to have been received on the
carp interface. either a packet is sent to the carp interfaces mac
address, or it is a multicast packet which gets duplicated for
reception by the carp interface.

i guess a bigger question is do we support carp on non-ethernet
interaces? if so, the check from carp_proto_input_if should be
copied to carp6_proto_input_if. if not, there's a bunch of other
cleanup that could be done.

ok?

Index: ip_carp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.321
diff -u -p -r1.321 ip_carp.c
--- ip_carp.c 9 Jan 2018 15:24:24 -0000 1.321
+++ ip_carp.c 10 Jan 2018 03:57:43 -0000
@@ -454,8 +454,7 @@ carp_proto_input_if(struct ifnet *ifp, s
  ismulti = IN_MULTICAST(ip->ip_dst.s_addr);
 
  /* check if received on a valid carp interface */
- if (!(ifp->if_type == IFT_CARP ||
-    (ifp->if_type != IFT_CARP && !ismulti && ifp->if_carp != NULL))) {
+ if (ifp->if_type != IFT_CARP) {
  carpstat_inc(carps_badif);
  CARP_LOG(LOG_INFO, sc,
     ("packet received on non-carp interface: %s",

Reply | Threaded
Open this post in threaded view
|

Re: simplify valid carp interface check in carp_proto_input_if

David Gwynne-5
so carp_output calls ether_output, which makes it pretty obvious that carp is for ethernet only. ie, this diff is safe.

> On 10 Jan 2018, at 14:05, David Gwynne <[hidden email]> wrote:
>
> this copies the "valid interface" check from carp6_proto_input_if
> to carp_proto_input_if. the current check looks to see if the current
> interface is carp, or if the current interface has any carps attached
> to it. the carp6_proto_input_if check just checks if the current
> interface is IFT_CARP or not.
>
> right now i think we only really support carp(4) on top of ethernet
> interfaces, and the ethernet stack goes to some lengths to make
> packets for a carp interface appear to have been received on the
> carp interface. either a packet is sent to the carp interfaces mac
> address, or it is a multicast packet which gets duplicated for
> reception by the carp interface.
>
> i guess a bigger question is do we support carp on non-ethernet
> interaces? if so, the check from carp_proto_input_if should be
> copied to carp6_proto_input_if. if not, there's a bunch of other
> cleanup that could be done.
>
> ok?
>
> Index: ip_carp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> retrieving revision 1.321
> diff -u -p -r1.321 ip_carp.c
> --- ip_carp.c 9 Jan 2018 15:24:24 -0000 1.321
> +++ ip_carp.c 10 Jan 2018 03:57:43 -0000
> @@ -454,8 +454,7 @@ carp_proto_input_if(struct ifnet *ifp, s
> ismulti = IN_MULTICAST(ip->ip_dst.s_addr);
>
> /* check if received on a valid carp interface */
> - if (!(ifp->if_type == IFT_CARP ||
> -    (ifp->if_type != IFT_CARP && !ismulti && ifp->if_carp != NULL))) {
> + if (ifp->if_type != IFT_CARP) {
> carpstat_inc(carps_badif);
> CARP_LOG(LOG_INFO, sc,
>    ("packet received on non-carp interface: %s",
>