On Fri, Feb 5, 2016 at 3:40 PM, sven falempin <[email protected]>
wrote:

> Dear Allmighty Tech Readers,
>
> I recently found out that you cannot dhclient a carp iface.
> People jumped over that saying , blahblah must have ip .
> Lies ! CARP require the two interface to have the same ip,
> the mac will be the same so using dhcp to configure them is
> working by design.
>
> I have now a working solution , it s ugly, please consider
> helping cleaning
> this for future openbsd, it s really an improvement.
>
> I will follow demands to clean it.
>
> Problems :
> 1/ an invalid carp iface that is up, is considered down (not fixed),
> also send_msg is not possible on up carp without ip. Tested with ugly
> second chunk of dhclient.c patch
> 2/ dhclient is only accepting 'hardware' mac address
> 3/ when configuring interface , routehandler is having a similar problem
> than 1. First chunk in the diff
>
> CARP is obvisouly smart to cut communication of a backup interface, but i
> think
> invalid state is not backup state. So to fix 1 i would somehow consider
> active an invalid and up carp  interface: make sense to me. This would fix
> 1.
> For now i just put a stupid ip with /32 subnet....
>
> 2/ Is solved with the part of diff i think should be already integrated,
> see dispatch.c
> I am not sure if getifaddrs is badly coded though, and the  sdl_type is
> somehow not set.
> carp GOT a mac address .
>
> 3/ Well i just cheated for this one , i am not good enough to play fair.
>
>
> Index: dhclient.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dhclient.c,v
> retrieving revision 1.361
> diff -u -p -r1.361 dhclient.c
> --- dhclient.c  18 May 2015 14:59:42 -0000      1.361
> +++ dhclient.c  5 Feb 2016 20:22:16 -0000
> @@ -323,6 +323,10 @@ routehandler(void)
>                 ifm = (struct if_msghdr *)rtm;
>                 if (ifm->ifm_index != ifi->index)
>                         break;
> +                if (0 == strncmp("carp", ifi->name, 4)) {
> +                       note("rtm->rtm_flags(%08X) :%08X", rtm->rtm_flags,
> RTF_UP);
> +                        rtm->rtm_flags = rtm->rtm_flags | RTF_UP; // Can
> i be more ugly ? i wonder
> +               }
>                 if ((rtm->rtm_flags & RTF_UP) == 0) {
>                         rslt = asprintf(&errmsg, "%s down", ifi->name);
>                         goto die;
> @@ -634,6 +638,11 @@ state_preboot(void)
>
>         ifi->linkstat = interface_status(ifi->name);
>
> +        if (0 == strncmp("carp", ifi->name, 4)) {
> +               note("carp is not down it is invalid :s");
> +                ifi->linkstat = 1;
> +        }
> +
>         if (log_perror && interval > 3) {
>                 if (!preamble && !ifi->linkstat) {
>                         fprintf(stderr, "%s: no link ....", ifi->name);
> @@ -858,6 +867,8 @@ dhcpack(struct in_addr client_addr, stru
>
>         /* Stop resending DHCPREQUEST. */
>         cancel_timeout();
> +
> +       note("Hello , we just get the data right");
>
>         bind_lease();
>  }
> Index: dispatch.c
> ===================================================================
> RCS file: /cvs/src/sbin/dhclient/dispatch.c,v
> retrieving revision 1.102
> diff -u -p -r1.102 dispatch.c
> --- dispatch.c  18 May 2015 14:59:42 -0000      1.102
> +++ dispatch.c  5 Feb 2016 20:22:16 -0000
> @@ -78,7 +78,7 @@ get_hw_address(void)
>                         continue;
>
>                 sdl = (struct sockaddr_dl *)ifa->ifa_addr;
> -               if (sdl->sdl_type != IFT_ETHER ||
> +               if ( !( sdl->sdl_type == IFT_ETHER || sdl->sdl_type ==
> IFT_CARP ) ||
>                     sdl->sdl_alen != ETHER_ADDR_LEN)
>                         continue;
>
>
> Test:
>
> # ifconfig em5 down; ifconfig em5 down #was having a address here to cvs
> # ifconfig carp1 vhid 55 carpdev em5 169.0.0.1 netmask 32
> # CFLAGS=-g make && ./dhclient -d carp1
> cc -g -Wall -Werror-implicit-function-declaration  -c dhclient.c
> cc  -static -pie -o dhclient dhclient.o clparse.o dispatch.o bpf.o
> options.o conflex.o errwarn.o packet.o tables.o parse.o privsep.o kroute.
> o -lutil
> DHCPDISCOVER on carp1 - interval 3
> DHCPOFFER from 192.168.10.1 (fe:e1:ba:d0:1e:0d)
> DHCPREQUEST on carp1 to 255.255.255.255
> DHCPACK from 192.168.10.1 (fe:e1:ba:d0:1e:0d)
> Hello , we just get the data right
> rtm->rtm_flags(FFFF8802) :00000001
> bound to 192.168.10.151 -- renewal in 60 seconds.
> # # can now cvs diff like normal
>
>
PS: after first lease, the rtm flasg is up of course
bound to 192.168.10.151 -- renewal in 60 seconds.
rtm->rtm_flags(FFFF8843) :00000001
rtm->rtm_flags(FFFF8843) :00000001
DHCPREQUEST on carp1 to 192.168.10.1


-- 
---------------------------------------------------------------------------------------------------------------------
() ascii ribbon campaign - against html e-mail
/\

Reply via email to