Unslung: netconsole debugging support
authorMike Westerhof <mwester@dls.net>
Tue, 11 Jul 2006 03:37:51 +0000 (03:37 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Tue, 11 Jul 2006 03:37:51 +0000 (03:37 +0000)
packages/linux/unslung-kernel/netconsole.patch
packages/linux/unslung-kernel_2.4.22.l2.3r63.bb
packages/meta/unslung-image.bb
packages/nslu2-binary-only/unslung-rootfs/NOTES
packages/nslu2-binary-only/unslung-rootfs/linuxrc
packages/nslu2-binary-only/unslung-rootfs/rc.1-timestamp.patch [new file with mode: 0644]
packages/nslu2-binary-only/unslung-rootfs_2.3r63.bb

index c54f4d1..2a50f6d 100644 (file)
@@ -23,9 +23,9 @@ diff -Naur linux-2.4.22/drivers/net/Makefile.orig linux-2.4.22/drivers/net/Makef
  # HIPPI adapters
  #
 diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/netconsole.c
---- linux-2.4.22/drivers/net/netconsole.c.orig 1969-12-31 18:00:00.000000000 -0600
-+++ linux-2.4.22/drivers/net/netconsole.c      2006-02-26 16:16:23.000000000 -0600
-@@ -0,0 +1,342 @@
+--- linux-2.4.22/drivers/net/netconsole.c.orig 2006-07-02 23:40:44.597695500 -0500
++++ linux-2.4.22/drivers/net/netconsole.c      2006-07-10 15:58:44.000000000 -0500
+@@ -0,0 +1,347 @@
 +/*  linux/drivers/net/netconsole.c
 + *
 + *  Copyright (C) 2001  Ingo Molnar <mingo@redhat.com>
@@ -38,6 +38,7 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 + *
 + * 2001-09-17    started by Ingo Molnar.
 + * 2006-02-26    very minor modifications to suit the NSLU2 w/Unslung -- Mike Westerhof.
++ * 2006-07-10    usability mods for Unslung (text only, and IP addrs) -- Mike Westerhof.
 + */
 +
 +/****************************************************************
@@ -72,11 +73,12 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +
 +static struct net_device *netconsole_dev;
 +static u16 source_port, target_port;
-+static u32 source_ip, target_ip;
++static u32 source_ipaddr, target_ip, target_ipaddr;
 +static unsigned char daddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ;
 +
 +#define NETCONSOLE_VERSION 0x01
-+#define HEADER_LEN 5
++/* HEADER_LEN was "5" -- it's zero for Unslung; makes it work better with netcat */
++#define HEADER_LEN 0
 +
 +#define MAX_UDP_CHUNK 1460
 +#define MAX_PRINT_CHUNK (MAX_UDP_CHUNK-HEADER_LEN)
@@ -86,7 +88,9 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 + * to make sure the message gets out even in
 + * extreme OOM situations.
 + */
-+#define MAX_NETCONSOLE_SKBS 32
++/* Was 32, lowered to 16 for Unslung (to save memory) */
++#define MAX_NETCONSOLE_SKBS 16
++
 +
 +static spinlock_t netconsole_lock = SPIN_LOCK_UNLOCKED;
 +static int nr_netconsole_skbs;
@@ -162,13 +166,14 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +
 +      atomic_set(&skb->users, 1);
 +      skb_reserve(skb, total_len - msg_len - HEADER_LEN);
-+      skb->data[0] = NETCONSOLE_VERSION;
-+
-+      spin_lock_irqsave(&sequence_lock, flags);
-+      put_unaligned(htonl(offset), (u32 *) (skb->data + 1));
-+      offset += msg_len;
-+      spin_unlock_irqrestore(&sequence_lock, flags);
-+
++/* Header data removed for Unslung -- its presence makes netcat less useful
++ *    skb->data[0] = NETCONSOLE_VERSION;
++ *
++ *    spin_lock_irqsave(&sequence_lock, flags);
++ *    put_unaligned(htonl(offset), (u32 *) (skb->data + 1));
++ *    offset += msg_len;
++ *    spin_unlock_irqrestore(&sequence_lock, flags);
++ */
 +      memcpy(skb->data + HEADER_LEN, msg, msg_len);
 +      skb->len += msg_len + HEADER_LEN;
 +
@@ -189,8 +194,8 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +      iph->ttl      = 64;
 +        iph->protocol = IPPROTO_UDP;
 +      iph->check    = 0;
-+        iph->saddr    = source_ip;
-+        iph->daddr    = target_ip;
++        iph->saddr    = source_ipaddr;
++        iph->daddr    = target_ipaddr;
 +      iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
 +
 +      eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
@@ -257,7 +262,7 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +MODULE_AUTHOR("Ingo Molnar <mingo@redhat.com>");
 +MODULE_DESCRIPTION("kernel network console implementation");
 +MODULE_LICENSE("GPL");
-+MODULE_PARM(target_ip, "i");
++MODULE_PARM(target_ip, "s");
 +MODULE_PARM(target_eth_byte0, "i");
 +MODULE_PARM(target_eth_byte1, "i");
 +MODULE_PARM(target_eth_byte2, "i");
@@ -280,7 +285,7 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +      if (!target_port)
 +              target_port = 6666;
 +      if (!source_port)
-+              source_port = 6666;
++              source_port = 6665;
 +      if (!dev)
 +              dev = "ixp0";
 +
@@ -301,13 +306,13 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +              printk(KERN_ERR "netconsole: network device %s is not an IP protocol device, aborting.\n", dev);
 +              return -1;
 +      }
-+      source_ip = ntohl(in_dev->ifa_list->ifa_local);
-+      if (!source_ip) {
++      source_ipaddr = ntohl(in_dev->ifa_list->ifa_local);
++      if (!source_ipaddr) {
 +              printk(KERN_ERR "netconsole: network device %s has no local address, aborting.\n", dev);
 +              return -1;
 +      }
-+      source_ip = htonl(source_ip);
-+#define IP(x) ((char *)&source_ip)[x]
++      source_ipaddr = htonl(source_ipaddr);
++#define IP(x) ((char *)&source_ipaddr)[x]
 +      printk(KERN_INFO "netconsole: using source IP %i.%i.%i.%i\n",
 +              IP(0), IP(1), IP(2), IP(3));
 +#undef IP
@@ -315,8 +320,8 @@ diff -Naur linux-2.4.22/drivers/net/netconsole.c.orig linux-2.4.22/drivers/net/n
 +              printk(KERN_ERR "netconsole: target_ip parameter not specified, aborting.\n");
 +              return -1;
 +      }
-+      target_ip = htonl(target_ip);
-+#define IP(x) ((char *)&target_ip)[x]
++      target_ipaddr = in_aton(target_ip);
++#define IP(x) ((char *)&target_ipaddr)[x]
 +      printk(KERN_INFO "netconsole: using target IP %i.%i.%i.%i\n",
 +              IP(0), IP(1), IP(2), IP(3));
 +#undef IP
index 64868d2..6ecfd7d 100644 (file)
@@ -4,7 +4,7 @@ include nslu2-linksys-kernel_2.4.22.bb
 
 DESCRIPTION = "Unslung kernel for the Linksys NSLU2 device"
 MAINTAINER = "NSLU2 Linux <www.nlsu2-linux.org>"
-PR = "r13"
+PR = "r14"
 
 KERNEL_SUFFIX = "unslung"
 
index de27c92..e57960e 100644 (file)
@@ -1,5 +1,5 @@
 LICENSE = MIT
-PR = "r16"
+PR = "r17"
 
 IMAGE_BASENAME = "unslung"
 
@@ -19,6 +19,7 @@ IPKG_INSTALL = "kernel update-modules unslung-rootfs \
        libc6-unslung slingbox ipkg \
        cpio \
        findutils \
+       kernel-module-netconsole \
        ${UNSLUNG_EXTRA_INSTALL}"
 
 IMAGE_PREPROCESS_COMMAND += "unslung_clean_image; "
index 3ff7d79..d6d789a 100644 (file)
@@ -535,3 +535,7 @@ Flash filesystem cleanup (regained space):
 
 Upgraded slingbox to v1.1.3 busybox base; enabled 'more' command
 (note: upgrade added 3KB in size, 'more' added 4KB in size)
+
+Added network console debugging support:
+ - patched netconsole driver,  added netconsole kernel module to image
+ - updated /linuxrc (& misc files) for basic support of same
index d8a0e5d..c12984b 100755 (executable)
@@ -1,5 +1,25 @@
 #!/bin/sh
 
+NC_SLUGIP="192.168.1.77"
+NC_TARGIP="192.168.1.100"
+
+if ( [ -f "/.nc" ] ) ; then
+  if ( [ -z "$RERUN" ] ) ; then
+    /bin/echo " DEBUG: Starting network console from flash ..."
+    . /.nc
+    /bin/echo "Insmod ixp400"
+    /sbin/insmod ixp400.o
+    /bin/echo "Insmod ixp425"
+    /sbin/insmod ixp425_eth.o
+    /sbin/ifconfig ixp0 $NC_SLUGIP
+    /bin/echo "Insmod netconsole"
+    /sbin/insmod netconsole.o target_ip=$NC_TARGIP
+    /bin/echo "Redirecting output via nc and restarting /linuxrc ..."
+    export RERUN=1
+    exec /linuxrc 2>&1 | tee /dev/console | /usr/bin/nc $NC_TARGIP 6666
+  fi
+fi
+
 # ****  DO NOT EVEN THINK OF EDITING OR REMOVING THIS FILE  ****
 # **** UNLESS YOU REALLY KNOW *EXACTLY* WHAT YOU ARE DOING. ****
 
 
 /bin/mount -t proc proc /proc
 
-echo "1" > /proc/sys/kernel/panic
-
-/bin/echo "Sleeping while waiting for disk..."
-cnt=20
-while [ $cnt -gt 0 ] ; do
-  echo -ne "\r$cnt "
-  sleep 1
-  [ -e /.sda1root -a -f /proc/hdd_sda ] && cnt=0
-  [ -e /.sdb1root -a -f /proc/hdd_sdb ] && cnt=0
-  cnt=`expr $cnt - 1`
-done
-echo
-
-sleep 5
-
-mounted=
-
-for prefroot in sda1 sdb1 ; do
-  if [ -z "$mounted" -a -e /.${prefroot}root ] ; then
-    if /bin/mount -rt ext3 /dev/$prefroot /mnt ; then
-      if [ -e /mnt/.${prefroot}root -a -x /mnt/bin/init ] ; then
-        /bin/echo "Root filesystem will be mounted from /dev/$prefroot ..."
-        mounted=/mnt
-      else
-        /bin/umount /mnt
-        /bin/echo "Can't find valid rootfs on /dev/$prefroot ..."
+/bin/echo "1" > /proc/sys/kernel/panic
+
+if ( ! [ -f /.nodisk ] ) ; then
+
+  /bin/echo "Sleeping while waiting for disk..."
+  cnt=20
+  while [ $cnt -gt 0 ] ; do
+    /bin/echo -ne "\r$cnt "
+    /bin/sleep 1
+    [ -e /.sda1root -a -f /proc/hdd_sda ] && cnt=0
+    [ -e /.sdb1root -a -f /proc/hdd_sdb ] && cnt=0
+    cnt=`expr $cnt - 1`
+  done
+  echo
+
+  /bin/sleep 5
+
+  mounted=
+
+  for prefroot in sda1 sdb1 ; do
+    if [ -z "$mounted" -a -e /.${prefroot}root ] ; then
+      if /bin/mount -rt ext3 /dev/$prefroot /mnt ; then
+        if [ -e /mnt/.${prefroot}root -a -x /mnt/bin/init ] ; then
+          /bin/echo "Root filesystem will be mounted from /dev/$prefroot ..."
+          mounted=/mnt
+        else
+          /bin/umount /mnt
+          /bin/echo "Can't find valid rootfs on /dev/$prefroot ..."
+        fi
       fi
     fi
+  done
+
+  if [ -z "$mounted" ] ; then
+    /bin/echo "Can't find valid rootfs, using ramdisk ..."
+    mounted=
   fi
-done
 
-if [ -z "$mounted" ] ; then
-  /bin/echo "Can't find valid rootfs, using ramdisk ..."
-  mounted=
-fi
+  /bin/umount /proc
 
-/bin/umount /proc
+  # Pivot to the desired rootfs and run the initial executable.
 
-# Pivot to the desired rootfs and run the initial executable.
+  if [ -n "$mounted" ] ; then
 
-if [ -n "$mounted" ] ; then
+      cd $mounted
 
-    cd $mounted
+      /bin/echo "Pivoting to external rootfs ..."
+      /sbin/pivot_root . initrd
 
-    /bin/echo "Pivoting to external rootfs ..."
-    /sbin/pivot_root . initrd
+      if ( [ -z "$RERUN" ] ) ; then
+        exec /usr/sbin/chroot . /bin/init < /dev/console 1> /dev/console 2> /dev/console
+      else
+        exec /usr/sbin/chroot . /bin/init
+      fi
+  else
 
-    exec /usr/sbin/chroot . /bin/init < /dev/console 1> /dev/console 2> /dev/console
+      exec /bin/init
 
-else
+  fi
 
-    exec /bin/init
+  /bin/echo "Can't pivot to external rootfs, using ramdisk ..."
 
+else
+  /bin/echo "Forced boot to internal flash ..."
+  /bin/echo "(One-time only, clearing forced boot flag file.)"
+  /bin/rm -f /.nodisk
 fi
 
-/bin/echo "Can't pivot to external rootfs, using ramdisk ..."
 exec /bin/init
 
 # Last-resort fall-back - this should never be reached.
diff --git a/packages/nslu2-binary-only/unslung-rootfs/rc.1-timestamp.patch b/packages/nslu2-binary-only/unslung-rootfs/rc.1-timestamp.patch
new file mode 100644 (file)
index 0000000..c0034b2
--- /dev/null
@@ -0,0 +1,8 @@
+--- nslu2-linksys-ramdisk-2.3r63/etc/rc.d/rc.1~        2006-07-10 19:48:11.000000000 -0500
++++ nslu2-linksys-ramdisk-2.3r63/etc/rc.d/rc.1 2006-07-10 19:48:24.000000000 -0500
+@@ -45,3 +45,5 @@
+ /usr/bin/Set_Led ready
+ /usr/bin/Set_Led beep1
+ /bin/echo  "Checking disk status :"; /usr/sbin/CheckDiskFull 2 >/dev/null
++/bin/sleep 5
++/bin/date
index ff0172d..c9ec1fb 100644 (file)
@@ -1,6 +1,6 @@
 SECTION = "base"
 
-PR = "r13"
+PR = "r14"
 
 DEPENDS = "nslu2-linksys-libs nslu2-linksys-sambacodepages"
 
@@ -20,6 +20,7 @@ SRC_URI = "http://nslu.sf.net/downloads/nslu2-linksys-ramdisk-2.3r63-2.tar.bz2 \
           file://rc.optware-stop \
           file://rc-diversion.patch;patch=1 \
           file://rc.1-diversion.patch;patch=1 \
+          file://rc.1-timestamp.patch;patch=1 \
           file://rc.crond-diversion.patch;patch=1 \
           file://rc.halt-diversion.patch;patch=1 \
           file://rc.local-diversion.patch;patch=1 \