Here is a proposed patch to provide support for IPv4LL (IPv4 link local addressing in the 169.254.*.* range per RFC3927). Combined with the previously integrated Avahi patch, this makes a complete Zeroconf stack.

The patch implements IPv4LL via the avahi-autoipd daemon. I did do some experimentation with the zcip applet in busybox as a lighter-weight alternative, but found the zcip applet was unable to understand aliased interfaces, which are a recommended practice.

When Avahi and avahi-autoipd are enabled, an additional "link local" option becomes available in config for each network interface. This may be used instead of or in addition to the dhcp option.

This one touches a lot of configuration parts -- review, comments, suggestions welcome!

    thanks,
      --FritzM.


Index: ltib
===================================================================
RCS file: /sources/ltib/ltib/ltib,v
retrieving revision 1.82
diff -u -a -r1.82 ltib
--- ltib	4 Mar 2012 18:59:39 -0000	1.82
+++ ltib	7 Mar 2012 08:34:53 -0000
@@ -258,7 +258,8 @@
                           SYSCFG_START_DHCPD SYSCFG_DHCPC_CMD SYSCFG_DHCP_ARG
                           SYSCFG_START_WATCHDOG SYSCFG_START_SSHD
                           SYSCFG_START_SAMBA SYSCFG_SMBD_ARGS SYSCFG_NMBD_ARGS
-                          SYSCFG_BOA_ARGS SYSCFG_DROPBEAR_ARGS/ ],
+                          SYSCFG_BOA_ARGS SYSCFG_DROPBEAR_ARGS
+                          SYSCFG_IPV4LL_CMD / ],
            PKG_NCURSES  => [ qw/PKG_NCURSES_WANT_REDUCED_SET/ ],
            PKG_BASH     => [ qw/PKG_BASH_WANT_NO_SH_SYMLINK/  ],
            PKG_DHCP     => [ qw/PKG_DHCP_WANT_SERVER PKG_DHCP_WANT_CLIENT/ ],
@@ -272,7 +273,8 @@
                                 PKG_CAIRO_WANT_SVG
                                 PKG_CAIRO_WANT_XLIB/ ],
            PKG_BOOST    => [ qw/PKG_BOOST_WANT_HEADER_ONLY/ ],
-           PKG_BZIP2    => [ qw/PKG_BZIP2_WANT_SHARED/ ]
+           PKG_BZIP2    => [ qw/PKG_BZIP2_WANT_SHARED/ ],
+           PKG_AVAHI    => [ qw/PKG_AVAHI_WANT_AUTOIPD/ ]
                };
 
 # package build dependencies
Index: config/userspace/network.lkc
===================================================================
RCS file: /sources/ltib/ltib/config/userspace/network.lkc,v
retrieving revision 1.1.1.4
diff -u -a -r1.1.1.4 network.lkc
--- config/userspace/network.lkc	27 Nov 2006 11:19:21 -0000	1.1.1.4
+++ config/userspace/network.lkc	7 Mar 2012 08:34:54 -0000
@@ -22,8 +22,11 @@
        from the boot loader.  When your lease expires (4 days) your
        system will lose it's connection with the NFS server
 
+config SYSCFG_IPV4LL0
+    bool "get network parameters using ipv4ll"
+    depends PKG_AVAHI_WANT_AUTOIPD
 
-if ! SYSCFG_DHCPC0
+if !SYSCFG_DHCPC0 && !SYSCFG_IPV4LL0
 
 config SYSCFG_IPADDR0
     default "192.168.0.254"
@@ -64,7 +67,11 @@
     help
        Do not use this if you are booting using nfsroot
 
-if ! SYSCFG_DHCPC1
+config SYSCFG_IPV4LL1
+    bool "get network parameters using ipv4ll"
+    depends PKG_AVAHI_WANT_AUTOIPD
+
+if !SYSCFG_DHCPC1 && !SYSCFG_IPV4LL1
 
 config SYSCFG_IPADDR1
     default "192.168.1.254"
@@ -105,7 +112,11 @@
     help
        Do not use this if you are booting using nfsroot
 
-if ! SYSCFG_DHCPC2
+config SYSCFG_IPV4LL2
+    bool "get network parameters using ipv4ll"
+    depends PKG_AVAHI_WANT_AUTOIPD
+
+if !SYSCFG_DHCPC2 && !SYSCFG_IPV4LL2
 
 config SYSCFG_IPADDR2
     default "192.168.2.254"
@@ -141,7 +152,11 @@
     help
        Do not use this if you are booting using nfsroot
 
-if ! SYSCFG_DHCPC3
+config SYSCFG_IPV4LL3
+    bool "get network parameters using ipv4ll"
+    depends PKG_AVAHI_WANT_AUTOIPD
+
+if !SYSCFG_DHCPC3 && !SYSCFG_IPV4LL3
 
 config SYSCFG_IPADDR3
     default "192.168.3.254"
@@ -178,7 +193,11 @@
     help
        Do not use this if you are booting using nfsroot
 
-if ! SYSCFG_DHCPC4
+config SYSCFG_IPV4LL4
+    bool "get network parameters using ipv4ll"
+    depends PKG_AVAHI_WANT_AUTOIPD
+
+if !SYSCFG_DHCPC4 && !SYSCFG_IPV4LL4
 
 config SYSCFG_IPADDR4
     default "192.168.4.254"
@@ -198,6 +217,8 @@
 endif
 endif
 
+comment ""
+
 if SYSCFG_DHCPC0 || SYSCFG_DHCPC1 || SYSCFG_DHCPC2 || SYSCFG_DHCPC3 || SYSCFG_DHCPC4
 
 config SYSCFG_DHCPC_CMD
@@ -209,5 +230,15 @@
 
 endif
 
+if SYSCFG_IPV4LL0 || SYSCFG_IPV4LL1 || SYSCFG_IPV4LL2 || SYSCFG_IPV4LL3 || SYSCFG_IPV4LL4
+
+config SYSCFG_IPV4LL_CMD
+   string "IPv4LL client startup"
+   default "avahi-autoipd --daemonize "
+   help
+       This entry specifies how to start the IPv4LL client
+
+endif
+
 endmenu
 
Index: config/userspace/packages.lkc
===================================================================
RCS file: /sources/ltib/ltib/config/userspace/packages.lkc,v
retrieving revision 1.49
diff -u -a -r1.49 packages.lkc
--- config/userspace/packages.lkc	4 Mar 2012 18:24:30 -0000	1.49
+++ config/userspace/packages.lkc	7 Mar 2012 08:34:57 -0000
@@ -118,6 +118,16 @@
        (branded Bonjour and sometimes Zeroconf).
        Note: this package requires the host package: intltool
 
+config PKG_AVAHI_WANT_AUTOIPD
+    depends PKG_AVAHI
+    bool "include avahi-autoipd"
+    help
+       avahi-autoipd implements IPv4LL, "Dynamic Configuration of IPv4
+       Link-Local Addresses" (IETF RFC3927), a proto‐ col for automatic IP
+       address configuration from the link-local 169.254.0.0/16 range
+       without the need for a central server. It is primarily intended to be
+       used in ad-hoc networks which lack a DHCP server.
+
 config PKG_BASH
     depends CAP_HAS_MMU
     select PKG_LIBTERMCAP
Index: dist/lfs-5.1/avahi/avahi.spec
===================================================================
RCS file: /sources/ltib/ltib/dist/lfs-5.1/avahi/avahi.spec,v
retrieving revision 1.1
diff -u -a -r1.1 avahi.spec
--- dist/lfs-5.1/avahi/avahi.spec	4 Mar 2012 17:41:54 -0000	1.1
+++ dist/lfs-5.1/avahi/avahi.spec	7 Mar 2012 08:34:57 -0000
@@ -3,13 +3,14 @@
 Summary         : Avahi mDNS/DNS-SD service discovery suite
 Name            : avahi
 Version         : 0.6.30
-Release         : 1
+Release         : 2
 License         : LGPL
 Vendor          : Avid Technology
 Packager        : Fritz Mueller
 Group           : xxxx
 URL             : http://avahi.org
 Source          : %{name}-%{version}.tar.gz
+Patch1          : avahi-0.6.30-ipv4ll.patch
 BuildRoot       : %{_tmppath}/%{name}
 Prefix          : %{pfx}
 
@@ -17,10 +18,21 @@
 %{summary}
 
 %Prep
-%setup 
+%setup
+%patch1 -p1 
 
 %Build
-./configure --prefix=%{_prefix} --host=$CFGHOST --build=%{_build} --with-distro=debian --disable-nls --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-gtk3 --disable-gdbm --disable-mono --disable-monodoc --disable-autoipd --disable-python --disable-doxygen-doc --disable-manpages --enable-compat-libdns_sd
+
+XTRA_OPTS=""
+
+if [ "$PKG_AVAHI_WANT_AUTOIPD" = "y" ]
+then
+    XTRA_OPTS="$XTRA_OPTS --enable-autoipd --with-autoipd-user=avahi --with-autoipd-group=avahi"
+else
+    XTRA_OPTS="$XTRA_OPTS --disable-autoipd"
+fi
+
+./configure --prefix=%{_prefix} --host=$CFGHOST --build=%{_build} --with-distro=debian --disable-nls --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-gtk3 --disable-gdbm --disable-mono --disable-monodoc --disable-python --disable-doxygen-doc --disable-manpages --enable-compat-libdns_sd --localstatedir=/var $XTRA_OPTS
 make
 
 %Install
Index: dist/lfs-5.1/skell/skell.spec
===================================================================
RCS file: /sources/ltib/ltib/dist/lfs-5.1/skell/skell.spec,v
retrieving revision 1.5
diff -u -a -r1.5 skell.spec
--- dist/lfs-5.1/skell/skell.spec	4 Mar 2012 17:41:54 -0000	1.5
+++ dist/lfs-5.1/skell/skell.spec	7 Mar 2012 08:34:57 -0000
@@ -3,7 +3,7 @@
 Summary         : Skelleton files for an embedded root filesystem
 Name            : skell
 Version         : 1.19
-Release         : 2
+Release         : 3
 License         : GPL
 Vendor          : Freescale
 Packager        : Steve Papacharalambous/Stuart Hughes
@@ -11,6 +11,7 @@
 Source          : %{name}-%{version}.tar.gz
 Patch1          : skell-1.19-ipautoconf.patch
 Patch2          : skell-1.19-avahi-dbus.patch
+Patch3          : skell-1.19-ipv4ll.patch
 BuildRoot       : %{_tmppath}/%{name}
 Prefix          : %{pfx}
 
@@ -21,6 +22,7 @@
 %setup
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
 
 %Build
 
Index: dist/lfs-5.1/sysconfig/sysconfig.spec
===================================================================
RCS file: /sources/ltib/ltib/dist/lfs-5.1/sysconfig/sysconfig.spec,v
retrieving revision 1.8
diff -u -a -r1.8 sysconfig.spec
--- dist/lfs-5.1/sysconfig/sysconfig.spec	4 Mar 2012 17:41:54 -0000	1.8
+++ dist/lfs-5.1/sysconfig/sysconfig.spec	7 Mar 2012 08:34:57 -0000
@@ -123,32 +123,43 @@
 export DEPLOYMENT_STYLE="${SYSCFG_DEPLOYMENT_STYLE:-NFS}"
 export SYSCFG_DHCPC_CMD="${SYSCFG_DHCPC_CMD:-udhcpc -b -i }"
 export DROPBEAR_ARGS="${SYSCFG_DROPBEAR_ARGS}"
+export SYSCFG_IPV4LL_CMD="${SYSCFG_IPV4LL_CMD:-avahi-autoipd --daemonize }"
 EOF
 
 # network interfaces
 for i in 0 1 2 3 4 5
 do
-    if [  "$(eval echo \$$(echo SYSCFG_IFACE$i))" = "y" ]
+    if [ "$(eval echo \$$(echo SYSCFG_IFACE$i))" = "y" ]
     then
-	if [ "$(eval echo \$$(echo SYSCFG_DHCPC$i))" = "y" ]
-	then
-	    cat <<EOF >> $RPM_BUILD_ROOT/%{pfx}/etc/rc.d/rc.conf
+        IPSTATIC="y"
+	cat <<EOF >> $RPM_BUILD_ROOT/%{pfx}/etc/rc.d/rc.conf
 # net interface $i
 export $(echo SYSCFG_IFACE$i)=y
 export $(echo INTERFACE$i)="$(eval echo \$$(echo SYSCFG_NET_INTERFACE$i))"
-export $(echo IPADDR$i)="dhcp"
 EOF
-	else
+	if [ "$(eval echo \$$(echo SYSCFG_DHCPC$i))" = "y" ]
+	then
+            IPSTATIC="n"
+            IPMETHOD="dhcp"
+        fi
+	if [ "$(eval echo \$$(echo SYSCFG_IPV4LL$i))" = "y" ]
+	then
+            IPSTATIC="n"
+            IPMETHOD="$IPMETHOD${IPMETHOD:+,}ipv4ll"
+        fi
+	if [ "$IPSTATIC" = "y" ]
+        then
 	    cat <<EOF >> $RPM_BUILD_ROOT/%{pfx}/etc/rc.d/rc.conf
-# net interface $i
-export $(echo SYSCFG_IFACE$i)=y
-export $(echo INTERFACE$i)="$(eval echo \$$(echo SYSCFG_NET_INTERFACE$i))"
 export $(echo IPADDR$i)="$(eval echo \$$(echo SYSCFG_IPADDR$i))"
 export $(echo NETMASK$i)="$(eval echo \$$(echo SYSCFG_NET_MASK$i))"
 export $(echo BROADCAST$i)="$(eval echo \$$(echo SYSCFG_NET_BROADCAST$i))"
 export $(echo GATEWAY$i)="$(eval echo \$$(echo SYSCFG_NET_GATEWAY$i))"
 export $(echo NAMESERVER$i)="$(eval echo \$$(echo SYSCFG_NAMESERVER$i))"
 EOF
+        else
+	    cat <<EOF >> $RPM_BUILD_ROOT/%{pfx}/etc/rc.d/rc.conf
+export $(echo IPADDR$i)="$IPMETHOD"
+EOF
 	fi
     fi
 done

diff --exclude CVS --exclude .git -uNr avahi-0.6.30/avahi-autoipd/avahi-autoipd.action.linux avahi-0.6.30.modified/avahi-autoipd/avahi-autoipd.action.linux
--- avahi-0.6.30/avahi-autoipd/avahi-autoipd.action.linux	2010-06-28 20:30:33.000000000 -0700
+++ avahi-0.6.30.modified/avahi-autoipd/avahi-autoipd.action.linux	2012-03-06 19:48:00.651375062 -0800
@@ -35,7 +35,10 @@
 
 METRIC=$((1000 + `cat "/sys/class/net/$2/ifindex" 2>/dev/null || echo 0`))
 
-if [ -x /bin/ip -o -x /sbin/ip ] ; then
+IP_EXISTS=`[ -e /bin/ip -o -e /sbin/ip ] && echo y`
+IP_IS_BUSYBOX=`busybox ip route >/dev/null 2>&1 && echo y`
+
+if [ "$IP_EXISTS" = "y" -a "$IP_IS_BUSYBOX" != "y" ] ; then
 
     # We have the Linux ip tool from the iproute package
 

3b19200ca33be35dbd55273f2c7cd334  avahi-0.6.30-ipv4ll.patch

diff --exclude CVS --exclude .git -uNr skell-1.19/etc/rc.d/init.d/network skell-1.19.modified/etc/rc.d/init.d/network
--- skell-1.19/etc/rc.d/init.d/network	2012-03-07 00:04:36.747854485 -0800
+++ skell-1.19.modified/etc/rc.d/init.d/network	2012-03-06 08:23:49.413600567 -0800
@@ -41,12 +41,13 @@
         DEPLOYMENT_STYLE=NFS;
     fi
 
-
     if [ "$SYSCFG_IFACE0" = "y" ]
     then
         echo "Setting up networking on $INTERFACE0: "
-        if [ "$IPADDR0" = "dhcp" ]
+        IPSTATIC="y"
+        if [ `expr match "$IPADDR0" ".*dhcp"` -ne 0 ]
         then
+            IPSTATIC="n"
             if [ "$DEPLOYMENT_STYLE" = "NFS" ]
             then
                 if [ -f /proc/net/pnp ]
@@ -58,8 +59,15 @@
             else
                 $SYSCFG_DHCPC_CMD $INTERFACE0
             fi
-        else  
-            # non-dhcp network startup
+        fi
+        if [ `expr match "$IPADDR0" ".*ipv4ll"` -ne 0 ]
+        then
+            IPSTATIC="n"
+            $SYSCFG_IPV4LL_CMD $INTERFACE0
+        fi
+        if [ "$IPSTATIC" = "y" ]
+        then  
+            # static network startup
             ifconfig $INTERFACE0 $IPADDR0 netmask $NETMASK0
             sed -e 's,.*hostname,'$IPADDR0'     '`hostname`',' /etc/hosts >/tmp/hosts
             mv /tmp/hosts /etc/hosts
@@ -81,11 +89,20 @@
     if [ "$SYSCFG_IFACE1" = "y" ]
     then
         echo "Setting up networking on $INTERFACE1: "
-        if [ "$IPADDR1" = "dhcp" ]
+        IPSTATIC="y"
+        if [ `expr match "$IPADDR1" ".*dhcp"` -ne 0 ]
         then
+            IPSTATIC="n"
             $SYSCFG_DHCPC_CMD $INTERFACE1
-        else  
-            # non-dhcp network startup
+        fi
+        if [ `expr match "$IPADDR1" ".*ipv4ll"` -ne 0 ]
+        then 
+            IPSTATIC="n"
+            $SYSCFG_IPV4LL_CMD $INTERFACE1
+        fi
+        if [ "$IPSTATIC" = "y" ]
+        then
+            # static network startup
             ifconfig $INTERFACE1 $IPADDR1 netmask $NETMASK1
 
             if [ -n "$GATEWAY1" ]
@@ -105,11 +122,20 @@
     if [ "$SYSCFG_IFACE2" = "y" ]
     then
         echo "Setting up networking on $INTERFACE2: "
-        if [ "$IPADDR2" = "dhcp" ]
+        IPSTATIC="y"
+        if [ `expr match "$IPADDR2" ".*dhcp"` -ne 0 ]
         then
+            IPSTATIC="n"
             $SYSCFG_DHCPC_CMD $INTERFACE2
-        else  
-            # non-dhcp network startup
+        fi
+        if [ `expr match "$IPADDR2" ".*ipv4ll"` -ne 0 ]
+        then 
+            IPSTATIC="n"
+            $SYSCFG_IPV4LL_CMD $INTERFACE2
+        fi
+        if [ "$IPSTATIC" = "y" ]
+        then
+            # static network startup
             ifconfig $INTERFACE2 $IPADDR2 netmask $NETMASK2
 
             if [ -n "$GATEWAY2" ]
@@ -124,11 +150,20 @@
     if [ "$SYSCFG_IFACE3" = "y" ]
     then
         echo "Setting up networking on $INTERFACE3: "
-        if [ "$IPADDR3" = "dhcp" ]
+        IPSTATIC="y"
+        if [ `expr match "$IPADDR3" ".*dhcp"` -ne 0 ]
         then
+            IPSTATIC="n"
             $SYSCFG_DHCPC_CMD $INTERFACE3
-        else  
-            # non-dhcp network startup
+        fi
+        if [ `expr match "$IPADDR3" ".*ipv4ll"` -ne 0 ]
+        then 
+            IPSTATIC="n"
+            $SYSCFG_IPV4LL_CMD $INTERFACE3
+        fi
+        if [ "$IPSTATIC" = "y" ]
+        then
+            # static network startup
             ifconfig $INTERFACE3 $IPADDR3 netmask $NETMASK3
 
             if [ -n "$GATEWAY3" ]
@@ -143,11 +178,20 @@
     if [ "$SYSCFG_IFACE4" = "y" ]
     then
         echo "Setting up networking on $INTERFACE4: "
-        if [ "$IPADDR4" = "dhcp" ]
+        IPSTATIC="y"
+        if [ `expr match "$IPADDR4" ".*dhcp"` -ne 0 ]
         then
+            IPSTATIC="n"
             $SYSCFG_DHCPC_CMD $INTERFACE4
-        else  
-            # non-dhcp network startup
+        fi
+        if [ `expr match "$IPADDR4" ".*ipv4ll"` -ne 0 ]
+        then 
+            IPSTATIC="n"
+            $SYSCFG_IPV4LL_CMD $INTERFACE4
+        fi
+        if [ "$IPSTATIC" = "y" ]
+        then
+            # static network startup
             ifconfig $INTERFACE4 $IPADDR4 netmask $NETMASK4
 
             if [ -n "$GATEWAY4" ]

261c2e10fe7dbf55701992dc08c3432f  skell-1.19-ipv4ll.patch

_______________________________________________
LTIB home page: http://ltib.org

Ltib mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/ltib

Reply via email to