http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.4.tar.gz
authorMichael Brown <mcb30@dolphin.home>
Mon, 10 Mar 2008 23:54:55 +0000 (23:54 +0000)
committerMichael Brown <mcb30@dolphin.home>
Mon, 10 Mar 2008 23:54:55 +0000 (23:54 +0000)
36 files changed:
Makefile
ana.c
client.c
client.h
config.c
doc/rpld.1 [deleted file]
doc/rpld.8
doc/rpld.conf.5
linux-ps.c
linux-ps.h
llc.c
llc.h
nics/Makefile
nics/dm9102/Makefile
nics/dm9102/README
nics/dm9102/dmfix [new file with mode: 0755]
nics/dm9102/dmfix.S
nics/dm9102/dmfix.o [new file with mode: 0644]
nics/dm9102/dmfix.s [new file with mode: 0644]
nics/dm9102/soup [deleted file]
project.h
protocol.c
protocol.c.orig [new file with mode: 0644]
prototypes.h
rpl.c
rpl.h
rpld.1 [deleted file]
rpld.c
rpld.c.orig [new file with mode: 0644]
rpld.conf.man
rpld.man
rpld_conf.lex
rpld_conf.tab.c
rpld_conf.y
rpld_conf.yy.c
util.c

index 1043ada..8b995de 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,9 +3,9 @@
 # *     rpld - an IBM style RIPL server            *
 # *************************************************/
 # 
-# /* Copyright (c) 1999, James McKenzie.
+# /* Copyright (c) 1999,2000, James McKenzie.
 #  *                      All rights reserved
-#  * Copyright (c) 1998, Christopher Lightfoot.
+#  * Copyright (c) 1998,2000, Christopher Lightfoot.
 #  *                      All rights reserved
 #  *
 #  * By using this file, you agree to the terms and conditions set
 #  */
 
 #
-# $Id: Makefile,v 1.16 1999/09/26 10:46:57 root Exp root $
+# $Id: Makefile,v 1.17 2000/07/17 11:59:46 root Exp root $
 #
 # $Log: Makefile,v $
-# Revision 1.16  1999/09/26 10:46:57  root
+# Revision 1.17  2000/07/17 11:59:46  root
 # #
 #
-# Revision 1.15  1999/09/21 11:39:32  root
+# Revision 1.16  2000/07/17 10:43:34  root
+# #
+#
+# Revision 1.15  2000/07/16 14:22:07  root
+# #
+#
+# Revision 1.14  2000/07/16 14:05:30  root
+# #
+#
+# Revision 1.13  2000/07/16 13:18:12  root
+# #
+#
+# Revision 1.1  2000/07/16 13:16:42  root
 # #
 #
 # Revision 1.14  1999/09/15 13:46:58  root
 #
 #
 
-# EDITME: this is the delay between transmitted packets in us 
-# you may need to edit this if your clients are slow 
-# if a client drops a packet it will typically wait 1s and then 
-# issue a retransmit request causing a delay. 
-# do make clean after changing this
+#
 
-DEFINES=-DPACKET_DELAY=0
+DEFINES=
 
 # where do you want all this stuff
 
@@ -85,7 +93,7 @@ DESTDIR=/usr
 # Stuff
 CC      = gcc
 INCLUDES = 
-CFLAGS   = -O ${INCLUDES} ${DEFINES}
+CFLAGS   = -O  ${INCLUDES} ${DEFINES}
 LIBS     =
 LDFLAGS  =
 
@@ -98,7 +106,7 @@ INSTALL=install
 
 ################# NO USER SERVICABLE PARTS BELOW HERE
 
-VERSION=1.3
+VERSION=1.4
 
 COFLAGS = -l
 
@@ -109,9 +117,10 @@ include .depend
 do-it-all: all
        @echo " " Now type make install to install rpld
        @echo " " or make nics to assemble the adapter utilities
-       @echo " " or make capture to capture RPL traffic
-       @echo " " or make replay to analyse captured RPL traffic
-       @echo " " or make realtime to capture and analyse RPL traffic
+#      @echo " " or make capture to capture RPL traffic
+#      @echo " " or make replay to analyse captured RPL traffic
+#      @echo " " or make realtime to capture and analyse RPL traffic
+
 else
 do-it-all: depend
        @echo " " Now type make again to build rpld
@@ -194,16 +203,16 @@ install-docs: doc
        ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} rpld.${MAN8EXT} ${MAN8}/rpld.${MAN8EXT}
        ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} rpld.conf.${MAN5EXT} ${MAN5}/rpld.conf.${MAN5EXT}
 
-ana:ana.c
+#ana:ana.c
 
-realtime: ana
-       tcpdump -l -x -s 2048 ether[14]=0xfc and ether[15]=0xfc | ana
+#realtime: ana
+#      tcpdump -l -x -s 2048 ether[14]=0xfc and ether[15]=0xfc | ana
 
 capture: 
        tcpdump -x -s 2048 ether[14]=0xfc and ether[15]=0xfc -w capture.dat
 
-replay: ana capture.dat
-       tcpdump -x -r capture.dat | ana
+#replay: ana capture.dat
+#      tcpdump -x -r capture.dat | ana
 
 
 nics: nics.doesntexist
@@ -225,7 +234,7 @@ clean: nodep
 
 proto: ${PROTOSRCS} ${HSRCS} ${LSRCS:%.lex=%.tab.h}
        echo -n > ${PROTOH}
-       for i in ${PROTOSRC}; do cproto $$i | grep -v inline >> ${PROTOH}  ; done
+       for i in ${PROTOSRC}; do cproto -e -v $$i | grep -v inline >> ${PROTOH}  ; done
 
 
 
@@ -258,6 +267,7 @@ distrib:
        ${MAKE} clean
        ${MAKE} yguff
        ${MAKE} ${TXTMEN}
+       ${MAKE} -C nics
        cd ..; tar cvfzX ${MYDIR}/DISTRIB/${MYDIR}.tar.gz ${MYDIR}/.xclude ${MYDIR}
 
 yguff:${YGUFF}
diff --git a/ana.c b/ana.c
index 6d64ccf..f23a2ca 100644 (file)
--- a/ana.c
+++ b/ana.c
@@ -1,10 +1,16 @@
 #include <stdio.h>
 #include <strings.h>
 
-static char *rcsid = "$Id: ana.c,v 1.2 1999/09/13 12:37:06 root Exp $";
+static char *rcsid = "$Id: ana.c,v 1.3 2000/07/16 13:18:10 root Exp $";
 
 /* 
  * $Log: ana.c,v $
+ * Revision 1.3  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.2  1999/09/13 12:37:06  root
  * #
  *
index 57e093f..adf1df4 100644 (file)
--- a/client.c
+++ b/client.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: client.c,v 1.11 1999/09/26 10:46:56 root Exp root $";
+static char rcsid[] = "$Id: client.c,v 1.17 2000/07/17 10:49:20 root Exp $";
 
 /*
  * $Log: client.c,v $
- * Revision 1.11  1999/09/26 10:46:56  root
+ * Revision 1.17  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.16  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.15  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.14  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.13  2000/07/16 14:22:06  root
+ * #
+ *
+ * Revision 1.12  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
  * #
  *
  * Revision 1.10  1999/09/14 17:12:38  root
@@ -318,11 +339,16 @@ clients_check_status ()
   struct client *c = clients;
 
   downloading = 0;
+  pacing = 0;
 
   while (c)
     {
-      if (c->state == ST_FILEDATA)
-        downloading++;
+      if ((c->state == ST_FILEDATA) && (!c->nospew))
+        {
+          downloading++;
+          if (pacing < c->pacing)
+            pacing = c->pacing;
+        }
       c = c->next;
     }
 
@@ -334,7 +360,7 @@ client_dispatch (struct nit *n)
 
   while (c)
     {
-      if (c->state == ST_FILEDATA)
+      if ((c->state == ST_FILEDATA) && (!c->nospew))
         {
           file_data_frame (n, c);
         }
index 7322234..4229997 100644 (file)
--- a/client.h
+++ b/client.h
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
 
 
 /*
- * $Id: client.h,v 1.6 1999/09/22 13:17:49 root Exp $
+ * $Id: client.h,v 1.8 2000/07/17 10:43:34 root Exp $
  *
  * $Log: client.h,v $
- * Revision 1.6  1999/09/22 13:17:49  root
- * Added partial_mac_len field for wildcarded mac addresses in
- * struct client.
+ * Revision 1.8  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.7  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.6  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
  *
  * Revision 1.5  1999/09/13 11:17:35  root
  * \#
 #define ST_DONE                5
 
 struct clfile
-  {
-    char *path;
-    unsigned char *data;
+{
+  char *path;
+  unsigned char *data;
 
-    int offset;
-    int length;
+  int offset;
+  int length;
 
-    u32 load_addr;
+  u32 load_addr;
 
-    int sblock, eblock;
-    struct clfile *next;
+  int sblock, eblock;
+  struct clfile *next;
 
-    FILE *f;
-  };
+  FILE *f;
+};
 
 struct client
-  {
-    int state;
+{
+  int state;
 
-    u8 mac[ETH_ALEN];
-    int partial_mac_len;
-    int framelen;
-    int blocknum;
-    int blocklen;
+  u8 mac[ETH_ALEN];
+  int partial_mac_len;
+  int framelen;
+  int blocknum;
+  int blocklen;
 
+  int pacing;
+  int nospew;
 
-    u32 run_addr;
+  u32 run_addr;
 
-    struct clfile *files;
-    struct clfile *file;
+  struct clfile *files;
+  struct clfile *file;
 
-    struct client *next;
-  };
+  struct client *next;
+};
index 3a4a3eb..7210d7f 100644 (file)
--- a/config.c
+++ b/config.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: config.c,v 1.4 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] = "$Id: config.c,v 1.10 2000/07/17 10:49:20 root Exp $";
 
 /*
  * $Log: config.c,v $
+ * Revision 1.10  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.9  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.8  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.7  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.6  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.5  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.4  1999/09/13 11:17:35  root
  * \#
  *
@@ -70,7 +91,8 @@ do_linux_kernel (struct client *c, struct clfile *f)
     }
   if (bootsect->length < 0x200)
     {
-      fprintf (stderr, "Only read %d bytes from %s\n", bootsect->length, f->path);
+      fprintf (stderr, "Only read %d bytes from %s\n", bootsect->length,
+               f->path);
       exit (1);
     }
 
diff --git a/doc/rpld.1 b/doc/rpld.1
deleted file mode 100644 (file)
index bbf0015..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<beginning of page>
-RPLD.CONF ( 5 ) UNIX Programmer's Manual RPLD.CONF ( 5 )
-NAME                 
- rpld <-> an RPL/RIPL remote boot server
-SYNOPSIS                 
- rpld
-WARRANTY                 
- rpld DOES NOT come with ANY WARRANTY, NOT even an IMPLIED WARRANTY.
-DESCRIPTION                 
- rpld will net-boot IBM style RPL boot ROMs. Communication between the
- client and the server is done in LLC-1 ui/C frames with the source and
- destination SAP both being 0xfc. On booting the client transmits a FIND
- frame containing the client's MAC address, adapter type and frame length.
- The server replies with a FOUND frame containing the server's MAC address
- and a possibly smaller frame length. The client issues a SEND.FILE.RE<hy>
- QUEST frame requesting the first block of the boot file. The server then
- issues a sequence of FILE.DATA.RESPONSE frames with increasing block num<hy>
- bers. The FILE.DATA.RESPONSE frames contain a load address and an execute
- address and a flag. If the client fails to receive a FILE.DATA.RESPONSE
- frame within a certain period it sends another SEND.FILE.REQUEST frame
- requesting the block which follows the last block that was successfully
- received. On the last FILE.DATA.RESPONSE frame the server sets a special
- value of the flags which cause the client to transfer execution to the
- execute address specified in the frame.
- The server starts by reading the configuration file in /etc/rpld.conf,
- see rpld.conf(5), After the configuration file has been read, it opens
- the system's default network interface and listens for RPL frames. The
- server recalculates the length of all the files to be downloaded every
- time it receives a SEND.FILE.REQUEST frame.
-BUGS                 
-  Solenopsis invicta Buren
-  rpld (probably) doesn't support the new bzImage format correctly.
-  rpld doesn't reload the first 512 bytes of Linux kernels automatically.
-  There is no way to make rpld re-read its configuration file.
-  rpld needs to meet more network cards.
-NOTES                 
- IBM is a trademark of IBM Corp.
-FILES                 
- /usr/sbin/rpld 
- /etc/rpld.conf 
- /rplboot 
-SEE  ALSO               
- rpld.conf(5),
- bootpd(1),
- dhcpd(1),
- http://bullard.esc.cam.ac.uk/~james/rpld;
-AUTHORS  AND  COPYRIGHT             
- (c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
- Linux  Sep 14, 1999 1
index 5c52e7b..4daeb14 100644 (file)
@@ -1,5 +1,5 @@
 
-RPLD(8)                  UNIX System Manager's Manual                  RPLD(8)
+RPLD(8)                     System Manager's Manual                    RPLD(8)
 
 NAME
      rpld - an RPL/RIPL remote boot server
@@ -34,11 +34,14 @@ DESCRIPTION
      time it receives a SEND.FILE.REQUEST frame.
 
 BUGS
-       Solenopsis invicta Buren
+       Solenopsis invicta Burens
        rpld (probably) doesn't support the new bzImage format correctly.
        rpld doesn't reload the first 512 octets of Linux kernels automatical-
        ly.
        There is no way to make rpld re-read its configuration file.
+       When concurrently serving multiple clients rpld will choose the pacing
+       value of the slowest one.
+       Partial ethernet addresses should be specified in bits not bytes.
        rpld needs to meet more network adapters.
 
 NOTES
@@ -53,9 +56,10 @@ SEE ALSO
      rpld.conf(5),
      bootpd(1),
      dhcpd(1),
-     http://bullard.esc.cam.ac.uk/~james/rpld;
+     http://gimel.esc.cam.ac.uk/james/rpld;
 
 AUTHORS AND COPYRIGHT
-     (c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
+     (c) 1999,2000 James McKenzie, and Christopher Lightfoot. All rights re-
+     served.
 
- Linux                           Sep 14, 1999                                1
+ Linux                           Jun 16, 2000                                1
index 646a8f2..63bb732 100644 (file)
@@ -1,5 +1,5 @@
 
-RPLD.CONF(5)               UNIX Programmer's Manual               RPLD.CONF(5)
+RPLD.CONF(5)              System Programmer's Manual              RPLD.CONF(5)
 
 NAME
      rpld.conf - rpld configuration file
@@ -12,8 +12,9 @@ DESCRIPTION
           ...
      };
 
-     Within the HOST blocks there can be ethernet, execute, framesize  and
-     blocksize directives and FILE blocks.  FILE blocks are of the form:
+     Within the HOST blocks there can be ethernet, execute, framesize, block-
+     size, nospew, and pacing  directives and FILE blocks.  FILE blocks are of
+     the form:
 
              FILE {
                   ...
@@ -63,14 +64,22 @@ DIRECTIVES
 
                blocksize = 528;
 
-
      ethernet
        This directive sets the MAC address of the client referenced in this
-       HOST block. It should be formatted as six octets separated by colons.
-       e.g..
+       HOST block. It should either be formatted as six octets separated by
+       colons. e.g..
 
                ethernet = 00:60:6e:33:4f:2c;
 
+       or it can be specified as a range of mac addresses as six octets sepa-
+       rated by colons followed by a solidus and the number of bytes to match.
+       So:
+
+               ethernet = 00:50:32:33:00:00/4;
+
+       Will match anything of the form 00:50:32:33:xx:xx. It is expected that
+       this support will be changed from bytes to bits in a future release.
+
      execute
        This directive sets the execute address that control is transferred to
        when downloading has finished. It should be a number in either decimal
@@ -129,8 +138,16 @@ DIRECTIVES
 
        would load 4096 octets from the file /rplboot/fish starting 512 octets
        into the file into the client's memory starting at address 0x90200. (so
-
        the 513th byte of the file will load to address 0x90200)
+     nospew
+       This directive causes rpld to emit only one FILE.DATA.RESPONSE frame
+       for SEND.FILE.REQUEST frame received. The usual behaviour is the client
+       sends one FILE.DATA.RESPONSE frame which causes the server to transmit
+       all the FILE.DATA.RESPONSE frames in order (see pacing ) Some RPL boot
+       proms have made this sensible modification to the protocol.  NB if you
+       specify this directive when it is not required, most roms will send an-
+       other SEND.FILE.REQUEST frame after a timeout of about one second. Some
+       roms will only make twenty or so retransmits before aborting the boot.
      offset
        This directive sets the offset for this FILE block. Data is read from
        offset octets into the file at copied to the client starting at the ad-
@@ -138,6 +155,11 @@ DIRECTIVES
 
                offset = 512;
 
+     pacing
+       This directive sets the minimum time gap in us between sequential
+       frames when the nospew option is NOT set. 1000 (or 1 ms) is a reason-
+       able choice and the default.  Increase this if the client has to issue
+       retransmits.
      path
        This directive sets the path to the file that is to be downloaded. The
        file must exist, and is examined at startup and on reception of
@@ -185,6 +207,7 @@ Example
                      load=0x92000;
              };
              execute=0x92000;
+             pacing=2000;
      };
 
 
@@ -192,10 +215,10 @@ FILES
      /etc/rpld.conf  The rpld(1) configuration file.
 
 SEE ALSO
-     rpld(1),  bootpd(1),  dhcpd(1),
-     http://bullard.esc.cam.ac.uk/~james/rpld;
+     rpld(1),  bootpd(1),  dhcpd(1),  http://gimel.esc.cam.ac.uk/james/rpld;
 
 AUTHORS AND COPYRIGHT
-     (c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
+     (c) 1999,2000 James McKenzie, and Christopher Lightfoot. All rights re-
+     served.
 
- Linux                           Sep 14, 1999                                4
+ Linux                           Jun 16, 2000                                4
index 98af912..d4a202c 100644 (file)
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: linux-ps.c,v 1.6 1999/09/21 11:38:51 root Exp $";
+static char rcsid[] = "$Id: linux-ps.c,v 1.8 2000/07/16 14:24:16 root Exp $";
 
 /* 
  * $Log: linux-ps.c,v $
- * Revision 1.6  1999/09/21 11:38:51  root
+ * Revision 1.8  2000/07/16 14:24:16  root
+ * #
+ *
+ * Revision 1.7  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.6  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
  * #
  *
  * Revision 1.5  1999/09/13 11:17:35  root
index 2df5cd5..1df2010 100644 (file)
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
 
 
 /*
- * $Id: linux-ps.h,v 1.2 1999/09/13 12:36:18 root Exp $
+ * $Id: linux-ps.h,v 1.5 2000/07/17 10:43:34 root Exp $
  *
  * $Log: linux-ps.h,v $
+ * Revision 1.5  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.4  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.3  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.2  1999/09/13 12:36:18  root
  * #
  *
 #define MAX_NAME_LEN 1024
 
 struct nit
-  {
-    int fd;
-    char *name;
-    unsigned char mac[6];
-  };
+{
+  int fd;
+  char *name;
+  unsigned char mac[6];
+};
 
 #define nit_mac(n)     ((n)->mac)
diff --git a/llc.c b/llc.c
index 9329daa..e591169 100644 (file)
--- a/llc.c
+++ b/llc.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: llc.c,v 1.6 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] = "$Id: llc.c,v 1.10 2000/07/17 11:59:45 root Exp root $";
 
 /*
  * $Log: llc.c,v $
+ * Revision 1.10  2000/07/17 11:59:45  root
+ * #
+ *
+ * Revision 1.9  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.8  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.7  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.6  1999/09/13 11:17:35  root
  * \#
  *
@@ -36,7 +51,8 @@ static char rcsid[] = "$Id: llc.c,v 1.6 1999/09/13 11:17:35 root Exp $";
 #include "project.h"
 
 void
-send_llc_frame (struct nit *n, unsigned char dsap, unsigned char ssap, unsigned char *dmac, unsigned char *ibuf, int len)
+send_llc_frame (struct nit *n, unsigned char dsap, unsigned char ssap,
+                unsigned char *dmac, unsigned char *ibuf, int len)
 {
   unsigned char buf[MAX_FRAME_LEN];
   struct llchdr *h = (struct llchdr *) buf;
@@ -65,12 +81,14 @@ llc_recv_packet (struct nit *n, unsigned char *buf, int len)
   if ((h->h_dsap == RPL_SAP) && (h->h_ssap == RPL_SAP))
     {
 
+      llclen = ntohs (h->h_len);
+
 #ifdef DEBUG
       printf ("dest: %s ", ethtoa (&h->h_dest));
       printf ("source: %s ", ethtoa (&h->h_source));
-      llclen = ntohs (h->h_len);
       printf ("len: 0x%04x ", llclen);
-      printf ("dsap:%02x ssap:%02x flags:%02x \n", h->h_dsap, h->h_ssap, h->h_flags);
+      printf ("dsap:%02x ssap:%02x flags:%02x \n", h->h_dsap, h->h_ssap,
+              h->h_flags);
 #endif
 
       rpl_packet_recvd (n, buf + LLC_HDR_LEN, llclen - LLC_SAP_LEN);
diff --git a/llc.h b/llc.h
index babdd1f..72da388 100644 (file)
--- a/llc.h
+++ b/llc.h
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
 
 
 /*
- * $Id: llc.h,v 1.5 1999/09/13 11:17:35 root Exp $
+ * $Id: llc.h,v 1.8 2000/07/17 10:43:34 root Exp $
  *
  * $Log: llc.h,v $
+ * Revision 1.8  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.7  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.6  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.5  1999/09/13 11:17:35  root
  * \#
  *
 
 /* The LLC-1 headers as it comes off the wire */
 struct llchdr
-  {
-    unsigned char h_dest[ETH_ALEN];
-    unsigned char h_source[ETH_ALEN];
-    unsigned short h_len;
-    unsigned char h_dsap;
-    unsigned char h_ssap;
-    unsigned char h_flags;
-  };
+{
+  unsigned char h_dest[ETH_ALEN];
+  unsigned char h_source[ETH_ALEN];
+  unsigned short h_len;
+  unsigned char h_dsap;
+  unsigned char h_ssap;
+  unsigned char h_flags;
+};
index 14ac73d..ef04157 100644 (file)
@@ -3,9 +3,9 @@
 # *     rpld - an IBM style RIPL server            *
 # *************************************************/
 # 
-# /* Copyright (c) 1999, James McKenzie.
+# /* Copyright (c) 1999,2000, James McKenzie.
 #  *                      All rights reserved
-#  * Copyright (c) 1999, Christopher Lightfoot.
+#  * Copyright (c) 1999,2000, Christopher Lightfoot.
 #  *                      All rights reserved
 #  *
 #  * By using this file, you agree to the terms and conditions set
index ea31900..62e42e1 100644 (file)
@@ -3,9 +3,9 @@
 # *     rpld - an IBM style RIPL server            *
 # *************************************************/
 # 
-# /* Copyright (c) 1999, James McKenzie.
+# /* Copyright (c) 1999,2000, James McKenzie.
 #  *                      All rights reserved
-#  * Copyright (c) 1999, Christopher Lightfoot.
+#  * Copyright (c) 1999,2000, Christopher Lightfoot.
 #  *                      All rights reserved
 #  *
 #  * By using this file, you agree to the terms and conditions set
 #  */
 
 #
-# $Id: Makefile,v 1.3 1999/09/14 17:18:27 root Exp $
+# $Id: Makefile,v 1.5 2000/07/16 21:09:58 root Exp $
 #
 # $Log: Makefile,v $
+# Revision 1.5  2000/07/16 21:09:58  root
+# #
+#
+# Revision 1.4  2000/07/16 14:05:30  root
+# #
+#
 # Revision 1.3  1999/09/14 17:18:27  root
 # #
 #
@@ -34,7 +40,7 @@
 #
 #
 
-AS86=/software/src/bin86/as/as86 -0 -a 
+AS86=as86 -0 -a 
 LD86=ld86 -s -d
 
 dmfix:dmfix.o
index 083300c..8ada7b4 100644 (file)
@@ -1,8 +1,8 @@
 dmfix - DAVICOM Fast Ethernet killer
 
-Copyright (c) 1999, James McKenzie.
+Copyright (c) 1999,2000, James McKenzie.
                      All rights reserved
-Copyright (c) 1999, Christopher Lightfoot.
+Copyright (c) 1999,2000, Christopher Lightfoot.
                       All rights reserved
 
 By using this file, you agree to the terms and conditions set
diff --git a/nics/dm9102/dmfix b/nics/dm9102/dmfix
new file mode 100755 (executable)
index 0000000..4fd936e
Binary files /dev/null and b/nics/dm9102/dmfix differ
index f0f84fe..56aa728 100644 (file)
@@ -3,15 +3,15 @@
 ! doesn't scribble all over it while it relocates
 !
 ! This image needs 2k of memory, and can be loaded anywhere, after
-! it does its stuff it does jmp 0x9020:0x0
+! it does its stuff it does jmp 0x9020:0x0000
 !
 ! 
 !
-! $Id: dmfix.S,v 1.4 1999/09/14 17:18:27 root Exp $ll rights reserved
+! $Id: dmfix.S,v 1.5 2000/07/16 14:05:30 root Exp $ll rights reserved
 !
-!  Copyright (c) 1999, James McKenzie.
+!  Copyright (c) 1999,2000, James McKenzie.
 !                       All rights reserved
-!  Copyright (c) 1999, Christopher Lightfoot.
+!  Copyright (c) 1999,2000, Christopher Lightfoot.
 !                       All rights reserved
 ! 
 !  By using this file, you agree to the terms and conditions set
@@ -23,6 +23,9 @@
 !
 !
 ! $Log: dmfix.S,v $
+! Revision 1.5  2000/07/16 14:05:30  root
+! #
+!
 ! Revision 1.4  1999/09/14 17:18:27  root
 ! #
 !
@@ -310,7 +313,7 @@ did:
 dad:   
        .word 0
 
-hello:    .ascii  "DAVICOM killer (c) 1999 James McKenzie <james@fishsoup.dhs.org>"
+hello:    .ascii  "DAVICOM killer (c) 1999,2000 James McKenzie <james@fishsoup.dhs.org>"
                 db      0x00
 
 top:   .ascii "Bs Sl Fn VID  DID  Window 0 base"
diff --git a/nics/dm9102/dmfix.o b/nics/dm9102/dmfix.o
new file mode 100644 (file)
index 0000000..970c735
Binary files /dev/null and b/nics/dm9102/dmfix.o differ
diff --git a/nics/dm9102/dmfix.s b/nics/dm9102/dmfix.s
new file mode 100644 (file)
index 0000000..da1f3ca
--- /dev/null
@@ -0,0 +1,334 @@
+# 1 "dmfix.S"
+! Davicom Bootloader fixup, switches off the DAVICOM fast ethernet chip
+! before transfering control to the RPL'd image, so that the chip
+! doesn't scribble all over it while it relocates
+!
+! This image needs 2k of memory, and can be loaded anywhere, after
+! it does its stuff it does jmp 0x9020:0x0000
+!
+! 
+!
+! $Id: dmfix.S,v 1.5 2000/07/16 14:05:30 root Exp $ll rights reserved
+!
+!  Copyright (c) 1999,2000, James McKenzie.
+!                       All rights reserved
+!  Copyright (c) 1999,2000, Christopher Lightfoot.
+!                       All rights reserved
+! 
+!  By using this file, you agree to the terms and conditions set
+!  forth in the LICENCE file which can be found at the top level of
+!  the rpld distribution.
+! 
+!  DAVICOM is a trademark of DAVICOM semiconductor inc.
+! 
+!
+!
+! $Log: dmfix.S,v $
+! Revision 1.5  2000/07/16 14:05:30  root
+! #
+!
+! Revision 1.4  1999/09/14 17:18:27  root
+! #
+!
+! Revision 1.3  1999/09/13 12:32:26  root
+! #
+!
+! Revision 1.2  1999/09/12 05:07:29  root
+! *** empty log message ***
+!
+!
+
+! Offsets into the PCI config space
+
+
+
+
+
+!PCI constants
+
+
+
+
+
+.globl begtext, begdata, begbss, endtext, enddata, endbss
+.text
+begtext:
+.data
+begdata:
+.bss
+begbss:
+.text
+
+entry start
+start:
+       mov ax,cs
+       mov es,ax
+       mov ds,ax
+       mov ss,ax
+
+! Put the stack at us+2k
+       mov di,#0x800-12
+       mov sp,di
+
+! Say hello
+       lea si,hello
+       call prtstr
+       call print_nl
+
+       lea si,top
+       call prtstr
+       call print_nl
+
+! Scan the pci bus
+       mov byte (devfn),#0
+
+dev_loop:
+               mov bh, byte (devfn)            !Device number
+               mov bl,#0x00            !Offset into config space
+               mov cl, byte (bus)              !Bus number
+               call pci_read_config_word
+
+               cmp ax,#0xffff
+               beq dull
+               cmp ax,#0x0000
+               beq dull
+
+                       mov (vid),ax
+
+                       xor dh,dh       
+                       mov dl,byte (bus)
+       
+                       call print_2hex
+                       call print_sp   
+       
+                       mov dl, byte (devfn)
+                       sar dl,#3
+                       and dx,#0x1f
+       
+                       call print_2hex
+                       call print_sp
+       
+                       mov dl, byte (devfn)
+                       and dl,#7
+       
+                       call print_2hex
+                       call print_sp
+               
+                       mov dx,(vid)
+                       call print_hex
+                       call print_sp
+       
+                       mov bh, byte (devfn)    !Device number
+                       mov bl,#0x02    !Offset into config space
+                       mov cl,byte (bus)       !Bus number
+                       call pci_read_config_word
+       
+                       mov (did),ax
+               
+                       mov dx,ax
+                       call print_hex
+                       call print_sp
+       
+                       mov bh, byte (devfn)  !Device number
+                       mov bl,#0x10 !Offset into config space
+                       mov cl, byte (bus)      !Bus number
+                       call pci_read_config_word
+       
+                       and ax,#0xfffc
+                       mov (dad),ax
+       
+                       mov dx,ax
+                       call print_hex
+                       call print_sp
+       
+       
+                       cmp (vid),#0x1282
+                       bne skipfix
+                       cmp (did),#0x9102
+                       bne skipfix
+       
+                               mov dx,(dad) !Hit the Reset bit
+                               in eax,dx
+                               or eax,#1
+                               out dx,eax
+               
+                               lea si,fixed
+                               call prtstr
+       
+skipfix:
+       
+       
+                       mov bh, byte (devfn)    !Device number
+                       mov bl,#0x0e !Offset into config space
+                       mov cl,byte (bus)       !Bus number
+                       call pci_read_config_byte
+       
+                       and al,#0x80
+                       cmp al,#0x80
+                       beq multi
+                               inc byte (devfn)
+                               inc byte (devfn)
+                               inc byte (devfn)
+                               inc byte (devfn)
+                               inc byte (devfn)
+                               inc byte (devfn)
+                               inc byte (devfn)
+multi:
+
+                       call print_nl
+
+dull:
+
+
+               inc byte (devfn)
+               mov dl, byte (devfn)
+               cmp dl,#0
+               beq dev_loop_skip
+                       br dev_loop
+dev_loop_skip:
+
+       lea si,done
+       call prtstr
+       call print_nl
+
+! Hand over control to the 1 2ndary boot loader
+       jmp 0x9020:0x0
+
+
+! bh contains device_fn
+! bl conatins offset
+! cl contains the bus number
+
+
+pci_read_config_word: 
+       push bx
+       and bl,#0xfc
+       mov ch,#0x80
+
+       mov (controldword),bx
+       mov (controldword+2),cx
+
+       mov eax,(controldword)
+       mov dx,#0xcf8
+       out dx,eax
+
+       pop dx
+       and dx,#0x2
+       add dx,#0xcfc
+
+       in ax,dx
+       ret
+
+pci_read_config_byte: 
+       push bx
+       and bl,#0xfc
+       mov ch,#0x80
+
+       mov (controldword),bx
+       mov (controldword+2),cx
+
+       mov eax,(controldword)
+       mov dx,#0xcf8
+       out dx,eax
+
+       pop dx
+       and dx,#0x3
+       add dx,#0xcfc
+
+       in al,dx
+       ret
+
+
+prtstr: 
+               lodsb
+               and     al,al
+               jz      fin
+               call    prtchr
+        jmp     prtstr
+fin:    ret
+
+prtchr: push    ax
+        push    cx
+        xor     bh,bh
+        mov     cx,#0x01
+        mov     ah,#0x0e
+        int     0x10
+        pop     cx
+        pop     ax
+        ret
+
+print_hex:
+        mov     cx, #4          ! 4 hex digits
+print_digit:
+        rol     dx, #4          ! rotate so that lowest 4 bits are used
+        mov     ax, #0xe0f      ! ah = request, al = mask for nybble
+        and     al, dl
+        add     al, #0x90       ! convert al to ascii hex (four instructions)
+        daa
+        adc     al, #0x40
+        daa
+        int     0x10
+        loop    print_digit
+        ret
+
+print_2hex:
+        mov     cx, #2          ! 2 hex digits
+print_2digit:
+        rol     dx, #4          ! rotate so that lowest 4 bits are used
+        mov     ax, #0xe0f      ! ah = request, al = mask for nybble
+        and     al, dl
+        add     al, #0x90       ! convert al to ascii hex (four instructions)
+        daa
+        adc     al, #0x40
+        daa
+        int     0x10
+        loop    print_2digit
+        ret
+
+print_sp:
+        mov     ax, #0xe20      ! SP
+        int     0x10
+        ret
+
+print_nl:
+        mov     ax, #0xe0d      ! CR
+        int     0x10
+        mov     al, #0xa        ! LF
+        int     0x10
+        ret
+
+davicom_base:
+       .word   0x0
+bus:
+       .byte   0x0
+devfn:
+       .byte   0x0
+
+controldword:
+       .word 0
+       .word 0
+vid:
+       .word 0
+did:
+       .word 0
+dad:   
+       .word 0
+
+hello:    .ascii  "DAVICOM killer (c) 1999,2000 James McKenzie <james@fishsoup.dhs.org>"
+                db      0x00
+
+top:   .ascii "Bs Sl Fn VID  DID  Window 0 base"
+       db 0x00
+fixed:         .ascii "- FIXED"
+       db 0x00
+
+done:   .ascii "Transfering control to linux secondary boot loader"
+       db 0x00
+
+.text
+endtext:
+.data
+enddata:
+.bss
+endbss:
+
diff --git a/nics/dm9102/soup b/nics/dm9102/soup
deleted file mode 100755 (executable)
index 14b6341..0000000
Binary files a/nics/dm9102/soup and /dev/null differ
index 6aaff79..0317ad2 100644 (file)
--- a/project.h
+++ b/project.h
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 /*
- * $Id: project.h,v 1.10 1999/09/14 21:36:02 root Exp $
+ * $Id: project.h,v 1.14 2000/07/17 11:59:45 root Exp root $
  *
  * $Log: project.h,v $
+ * Revision 1.14  2000/07/17 11:59:45  root
+ * #
+ *
+ * Revision 1.13  2000/07/16 21:09:57  root
+ * #
+ *
+ * Revision 1.12  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.10  1999/09/14 21:36:02  root
  * #
  *
@@ -45,6 +60,7 @@
 /* issue a retransmit request */
 
 #include <stdio.h>
+#include <string.h>
 #include <strings.h>
 #include <sys/types.h>
 #include <sys/time.h>
@@ -64,6 +80,7 @@ extern int downloading;
 
 #define MY_FRAME_LEN 1500
 #define MY_BLOCK_LEN 1440       /*quad word aligned */
+#define MY_PACING    1000
 
 
 #define CONFIG_FILE "/etc/rpld.conf"
index c7558e2..374e508 100644 (file)
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: protocol.c,v 1.9 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] =
+  "$Id: protocol.c,v 1.16 2000/07/17 11:59:45 root Exp root $";
 
 /*
  * $Log: protocol.c,v $
+ * Revision 1.16  2000/07/17 11:59:45  root
+ * #
+ *
+ * Revision 1.15  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.14  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.13  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.12  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.10  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.9  1999/09/13 11:17:35  root
  * \#
  *
@@ -55,7 +80,9 @@ find_frame (struct nit *n, struct rpl_packet *in)
 
   out.type = RPL_PK_FOUND;
 
-  out.flags = RPL_FL_TMZ | RPL_FL_TSZ | RPL_FL_YOUMAC | RPL_FL_MYMAC | RPL_FL_FRAMELEN | RPL_FL_WHOAMI | RPL_FL_SAP;
+  out.flags =
+    RPL_FL_TMZ | RPL_FL_TSZ | RPL_FL_YOUMAC | RPL_FL_MYMAC | RPL_FL_FRAMELEN |
+    RPL_FL_WHOAMI | RPL_FL_SAP;
 
   out.themightyzero = in->themightyzero;
   out.thesmallzero = 0;
@@ -72,7 +99,8 @@ find_frame (struct nit *n, struct rpl_packet *in)
       c->blocklen &= ~0x7;
     }
 
-  c->framelen = out.framelen = (in->framelen > c->framelen) ? c->framelen : in->framelen;
+  c->framelen = out.framelen =
+    (in->framelen > c->framelen) ? c->framelen : in->framelen;
   out.sap = RPL_SAP;
 
   bcopy (in->mymac, out.youmac, ETH_ALEN);
@@ -152,7 +180,8 @@ send_file_frame (struct nit *n, struct rpl_packet *in)
   c->blocknum = in->block;
   c->framelen = in->framelen;
 
-  syslog (LOG_ERR, "client %s requested block %d", ethtoa (c->mac), c->blocknum);
+  syslog (LOG_ERR, "client %s requested block %d", ethtoa (c->mac),
+          c->blocknum);
 
   client_calc_offsets (c);
 
@@ -160,13 +189,9 @@ send_file_frame (struct nit *n, struct rpl_packet *in)
 
   clients_check_status ();      /* This will upgrade our condition to downloading */
 
-/*
-   while (c->state == ST_FILEDATA)
-   {
-   file_data_frame (n, c);
-   usleep (1000);
-   }
- */
+
+  if (c->nospew)
+    file_data_frame (n, c);
 
 
 }
@@ -197,7 +222,8 @@ rpl_packet_recvd_callback (struct nit *n, struct rpl_packet *p)
         }
       else
         {
-          syslog (LOG_ERR, "Incomplete SEND.FILE.REQUEST frame 0x%x vs 0x%x\n",
+          syslog (LOG_ERR,
+                  "Incomplete SEND.FILE.REQUEST frame 0x%x vs 0x%x\n",
                   p->flags, RPL_SEND_FILE_FLAGS);
         }
       break;
diff --git a/protocol.c.orig b/protocol.c.orig
new file mode 100644 (file)
index 0000000..8c7d082
--- /dev/null
@@ -0,0 +1,238 @@
+/*************************************************
+*     rpld - an IBM style RIPL server            *
+*************************************************/
+
+/* Copyright (c) 1999,2000, James McKenzie.
+ *                      All rights reserved
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
+ *                      All rights reserved
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENCE file which can be found at the top level of
+ * the rpld distribution.
+ *
+ * IBM is a trademark of IBM corp.
+ *
+ */
+
+
+static char rcsid[] =
+  "$Id: protocol.c,v 1.15 2000/07/17 10:49:20 root Exp root $";
+
+/*
+ * $Log: protocol.c,v $
+ * Revision 1.15  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.14  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.13  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.12  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.10  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
+ * Revision 1.9  1999/09/13 11:17:35  root
+ * \#
+ *
+ * Revision 1.8  1999/09/13 11:08:34  root
+ * \#
+ *
+ * Revision 1.7  1999/09/13 11:05:27  root
+ * \#
+ *
+ * Revision 1.6  1999/09/13 11:04:13  root
+ * \#
+ *
+ */
+
+#include "project.h"
+
+/* Process the find frame and xmit a found frame */
+void
+find_frame (struct nit *n, struct rpl_packet *in)
+{
+  struct client *c;
+  struct rpl_packet out;
+
+  c = find_client_by_mac (in->mymac);
+
+  if (!c)
+    {
+      syslog (LOG_ERR, "unknown client %s", ethtoa (in->mymac));
+      return;
+    }
+
+  c->blocknum = 0;
+
+  out.type = RPL_PK_FOUND;
+
+  out.flags =
+    RPL_FL_TMZ | RPL_FL_TSZ | RPL_FL_YOUMAC | RPL_FL_MYMAC | RPL_FL_FRAMELEN |
+    RPL_FL_WHOAMI | RPL_FL_SAP;
+
+  out.themightyzero = in->themightyzero;
+  out.thesmallzero = 0;
+  out.whoami = 0;
+
+  if (in->framelen < c->framelen)
+    {
+      c->framelen = in->framelen;
+    }
+
+  if ((c->blocklen + LLC_RPL_OVERHEAD) > c->framelen)
+    {
+      c->blocklen = c->framelen - LLC_RPL_OVERHEAD;
+      c->blocklen &= ~0x7;
+    }
+
+  c->framelen = out.framelen =
+    (in->framelen > c->framelen) ? c->framelen : in->framelen;
+  out.sap = RPL_SAP;
+
+  bcopy (in->mymac, out.youmac, ETH_ALEN);
+  bcopy (nit_mac (n), out.mymac, ETH_ALEN);
+
+  c->state = ST_FIND;
+
+  rpl_send_packet (n, c->mac, &out);
+
+  c->state = ST_FOUND;
+
+}
+
+
+file_data_frame (struct nit *n, struct client *c)
+{
+  struct rpl_packet out;
+  int i;
+
+  u32 addr = 0x10000;
+
+  if (c->state != ST_FILEDATA)
+    return;
+
+  out.flags = RPL_FL_BLOCK | RPL_FL_ADDR | RPL_FL_DATA;
+  out.type = RPL_PK_FILEDATA;
+
+  out.block = c->blocknum;
+
+  client_get_block (c, &out);
+
+  out.addr.run = c->run_addr;
+
+#ifdef DEBUG
+  printf ("block %5d, %4d bytes to 0x%08x\n", c->blocknum,
+          out.datalen, out.addr.load);
+#endif
+
+  if (client_last_block (c))
+    {
+      out.addr.flags = RPL_AD_FLAGS_DONE;
+      c->state = ST_DONE;
+#ifdef DEBUG
+      printf ("Last block - transfering control to 0x%08x\n", c->run_addr);
+#endif
+      clients_check_status ();
+    }
+  else
+    {
+      out.addr.flags = RPL_AD_FLAGS_MORE;
+    }
+
+
+
+  rpl_send_packet (n, c->mac, &out);
+  c->blocknum++;
+
+  return (i);
+}
+
+void
+send_file_frame (struct nit *n, struct rpl_packet *in)
+{
+  struct client *c;
+  struct rpl_packet out;
+
+  c = find_client_by_mac (in->mymac);
+
+  if (!c)
+    {
+      printf ("Unknown client\n");
+      return;
+    }
+
+  c->state = ST_SENDFILE;
+
+  c->blocknum = in->block;
+  c->framelen = in->framelen;
+
+  syslog (LOG_ERR, "client %s requested block %d", ethtoa (c->mac),
+          c->blocknum);
+
+  client_calc_offsets (c);
+
+  c->state = ST_FILEDATA;
+
+  clients_check_status ();      /* This will upgrade our condition to downloading */
+
+/*
+   while (c->state == ST_FILEDATA)
+   {
+   file_data_frame (n, c);
+   usleep (1000);
+   }
+ */
+
+
+}
+
+/* rpl.c call this after it's interpreted a packet from the nic */
+void
+rpl_packet_recvd_callback (struct nit *n, struct rpl_packet *p)
+{
+  switch (p->type)
+    {
+    case RPL_PK_FIND:
+
+      if ((p->flags & RPL_FIND_FLAGS) == RPL_FIND_FLAGS)
+        {
+          find_frame (n, p);
+        }
+      else
+        {
+          syslog (LOG_ERR, "Incomplete FIND frame 0x%x vs 0x%x\n",
+                  p->flags, RPL_FIND_FLAGS);
+        }
+    case RPL_PK_FOUND:         /*We're not a client */
+      break;
+    case RPL_PK_SENDFILE:
+      if ((p->flags & RPL_SEND_FILE_FLAGS) == RPL_SEND_FILE_FLAGS)
+        {
+          send_file_frame (n, p);
+        }
+      else
+        {
+          syslog (LOG_ERR,
+                  "Incomplete SEND.FILE.REQUEST frame 0x%x vs 0x%x\n",
+                  p->flags, RPL_SEND_FILE_FLAGS);
+        }
+      break;
+    case RPL_PK_FILEDATA:      /*We're not a client */
+      break;
+    default:
+      syslog (LOG_ERR, "Unknown RPL packet type 0x%04x\n", p->type);
+
+    }
+
+}
index 1fb02ce..1b7db71 100644 (file)
@@ -1,41 +1,45 @@
 /* protocol.c */
-void find_frame(struct nit *n, struct rpl_packet *in);
-int file_data_frame(struct nit *n, struct client *c);
-void send_file_frame(struct nit *n, struct rpl_packet *in);
-void rpl_packet_recvd_callback(struct nit *n, struct rpl_packet *p);
+extern void find_frame(struct nit *n, struct rpl_packet *in);
+extern int file_data_frame(struct nit *n, struct client *c);
+extern void send_file_frame(struct nit *n, struct rpl_packet *in);
+extern void rpl_packet_recvd_callback(struct nit *n, struct rpl_packet *p);
 /* linux-ps.c */
-void nit_close(struct nit *n);
-struct nit *nit_open(char *name);
-void nit_send_frame(struct nit *n, unsigned char *frame, int len);
-void nit_multicast(struct nit *n, unsigned char *mcaddr);
-int nit_read_packet(struct nit *n, char *buf, int len, struct timeval *tv);
+extern void nit_close(struct nit *n);
+extern struct nit *nit_open(char *name);
+extern void nit_send_frame(struct nit *n, unsigned char *frame, int len);
+extern void nit_multicast(struct nit *n, unsigned char *mcaddr);
+extern int nit_read_packet(struct nit *n, char *buf, int len, struct timeval *tv);
 /* rpld.c */
-int main(int argc, char **argv);
+extern int downloading;
+extern int pacing;
+extern int main(int argc, char **argv);
 /* util.c */
-unsigned char *ethtoa(void *in);
-void daemonize(void);
+extern unsigned char ethtoaret[1024];
+extern unsigned char *ethtoa(void *in);
+extern void daemonize(void);
 /* rpl.c */
-int write_char(unsigned char *ptr, u8 v);
-int write_short(unsigned char *ptr, u16 v);
-int write_long(unsigned char *ptr, u32 v);
-int put_char(unsigned char *ptr, u16 token, u8 value);
-int put_short(unsigned char *ptr, u16 token, u16 value);
-int put_long(unsigned char *ptr, u16 token, u32 value);
-int put_mac(unsigned char *ptr, u16 token, unsigned char *mac);
-void rpl_send_packet(struct nit *n, unsigned char *d, struct rpl_packet *p);
-void rpl_packet_recvd(struct nit *n, unsigned char *pptr, int plen);
+extern int write_char(unsigned char *ptr, u8 v);
+extern int write_short(unsigned char *ptr, u16 v);
+extern int write_long(unsigned char *ptr, u32 v);
+extern int put_char(unsigned char *ptr, u16 token, u8 value);
+extern int put_short(unsigned char *ptr, u16 token, u16 value);
+extern int put_long(unsigned char *ptr, u16 token, u32 value);
+extern int put_mac(unsigned char *ptr, u16 token, unsigned char *mac);
+extern void rpl_send_packet(struct nit *n, unsigned char *d, struct rpl_packet *p);
+extern void rpl_packet_recvd(struct nit *n, unsigned char *pptr, int plen);
 /* llc.c */
-void send_llc_frame(struct nit *n, unsigned char dsap, unsigned char ssap, unsigned char *dmac, unsigned char *ibuf, int len);
-void llc_recv_packet(struct nit *n, unsigned char *buf, int len);
+extern void send_llc_frame(struct nit *n, unsigned char dsap, unsigned char ssap, unsigned char *dmac, unsigned char *ibuf, int len);
+extern void llc_recv_packet(struct nit *n, unsigned char *buf, int len);
 /* client.c */
-void cache_locally(struct clfile *f);
-struct client *find_client_by_mac(unsigned char *mac);
-void client_calc_offsets(struct client *c);
-void client_get_block(struct client *c, struct rpl_packet *p);
-int client_last_block(struct client *c);
-void client_flush_cache(struct client *c);
-int clients_check_status(void);
-int client_dispatch(struct nit *n);
+extern struct client *clients;
+extern void cache_locally(struct clfile *f);
+extern struct client *find_client_by_mac(unsigned char *mac);
+extern void client_calc_offsets(struct client *c);
+extern void client_get_block(struct client *c, struct rpl_packet *p);
+extern int client_last_block(struct client *c);
+extern void client_flush_cache(struct client *c);
+extern int clients_check_status(void);
+extern int client_dispatch(struct nit *n);
 /* config.c */
-void do_linux_kernel(struct client *c, struct clfile *f);
-void parse_config(void);
+extern void do_linux_kernel(struct client *c, struct clfile *f);
+extern void parse_config(void);
diff --git a/rpl.c b/rpl.c
index 9557c9e..e4a68b0 100644 (file)
--- a/rpl.c
+++ b/rpl.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
 
 
 
-static char rcsid[] = "$Id: rpl.c,v 1.7 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] = "$Id: rpl.c,v 1.10 2000/07/17 10:43:34 root Exp $";
 
 /*
  * $Log: rpl.c,v $
+ * Revision 1.10  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.9  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.8  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.7  1999/09/13 11:17:35  root
  * \#
  *
@@ -160,12 +172,14 @@ write_char (unsigned char *ptr, u8 v)
   *ptr = v;
   return (1);
 }
+
 int
 write_short (unsigned char *ptr, u16 v)
 {
   *((u16 *) ptr) = htons (v);
   return (2);
 }
+
 int
 write_long (unsigned char *ptr, u32 v)
 {
@@ -188,6 +202,7 @@ put_char (unsigned char *ptr, u16 token, u8 value)
   len += i;
   return (len);
 }
+
 int
 put_short (unsigned char *ptr, u16 token, u16 value)
 {
@@ -203,6 +218,7 @@ put_short (unsigned char *ptr, u16 token, u16 value)
   len += i;
   return (len);
 }
+
 int
 put_long (unsigned char *ptr, u16 token, u32 value)
 {
@@ -218,6 +234,7 @@ put_long (unsigned char *ptr, u16 token, u32 value)
   len += i;
   return (len);
 }
+
 int
 put_mac (unsigned char *ptr, u16 token, unsigned char *mac)
 {
@@ -295,7 +312,8 @@ send_found_frame (struct nit *n, unsigned char *dmac, struct rpl_packet *out)
 
 
 static void
-send_file_data_frame (struct nit *n, unsigned char *dmac, struct rpl_packet *out)
+send_file_data_frame (struct nit *n, unsigned char *dmac,
+                      struct rpl_packet *out)
 {
   unsigned char buf[MAX_FRAME_LEN], *ptr;
   int len, i;
@@ -369,7 +387,8 @@ rpl_send_packet (struct nit *n, unsigned char *d, struct rpl_packet *p)
       send_file_data_frame (n, d, p);
       break;
     default:
-      syslog (LOG_ERR, "rpl_send_packet: unknown packet type 0x%04x", p->type);
+      syslog (LOG_ERR, "rpl_send_packet: unknown packet type 0x%04x",
+              p->type);
     }
 }
 
@@ -408,6 +427,6 @@ rpl_packet_recvd (struct nit *n, unsigned char *pptr, int plen)
 
   rpl_frag (&p, pptr, elen);    /*Analyse the packet */
 
-  rpl_packet_recvd_callback (n, &p);  /*Pass it up to the protocol layer */
+  rpl_packet_recvd_callback (n, &p); /*Pass it up to the protocol layer */
 
 }
diff --git a/rpl.h b/rpl.h
index 59a8d0c..6b05370 100644 (file)
--- a/rpl.h
+++ b/rpl.h
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
 
 
 /*
- * $Id: rpl.h,v 1.8 1999/09/13 11:17:35 root Exp $
+ * $Id: rpl.h,v 1.11 2000/07/17 10:43:34 root Exp $
  *
  * $Log: rpl.h,v $
+ * Revision 1.11  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.10  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.9  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.8  1999/09/13 11:17:35  root
  * \#
  *
@@ -88,34 +100,34 @@ typedef unsigned char u8;
 #define RPL_FILE_DATA_FLAGS (RPL_FL_BLOCK | RPL_FL_ADDR | RPL_FL_DATA)
 
 struct addr_block
-  {
-    u32 load;
-    u32 run;
-    u32 flags;
-  };
+{
+  u32 load;
+  u32 run;
+  u32 flags;
+};
 
 #define MAX_DATA_LEN MAX_FRAME_LEN
 #define MAX_IDENT_LEN MAX_FRAME_LEN
 
 struct rpl_packet
-  {
-    int flags;
-
-    int type;
-
-    u32 themightyzero;
-    u8 mymac[ETH_ALEN];
-    u8 sap;
-    u16 framelen;
-    u16 whoami;
-    u16 thesmallzero;
-    u8 youmac[ETH_ALEN];
-    u32 block;
-    u8 data[MAX_DATA_LEN];
-    int datalen;
-
-    u8 ident[MAX_IDENT_LEN];
-    int identlen;
-
-    struct addr_block addr;
-  };
+{
+  int flags;
+
+  int type;
+
+  u32 themightyzero;
+  u8 mymac[ETH_ALEN];
+  u8 sap;
+  u16 framelen;
+  u16 whoami;
+  u16 thesmallzero;
+  u8 youmac[ETH_ALEN];
+  u32 block;
+  u8 data[MAX_DATA_LEN];
+  int datalen;
+
+  u8 ident[MAX_IDENT_LEN];
+  int identlen;
+
+  struct addr_block addr;
+};
diff --git a/rpld.1 b/rpld.1
deleted file mode 100644 (file)
index b86c3a8..0000000
--- a/rpld.1
+++ /dev/null
@@ -1,118 +0,0 @@
-.\" 
-.\"/*************************************************
-.\"*     rpld - an IBM style RIPL server            *
-.\"*************************************************/
-.\"
-.\"Copyright (c) 1999, James McKenzie.
-.\"                     All rights reserved
-.\"Copyright (c) 1998, Christopher Lightfoot.
-.\"                     All rights reserved
-.\"
-.\"By using this file, you agree to the terms and conditions set
-.\"forth in the LICENSE file which can be found at the top level of
-.\"the rpld distribution.
-.\"
-.\"IBM is a trademark of IBM Corp.
-.\"
-.\"
-.\"
-.\" $Id: rpld.man,v 1.8 1999/09/15 00:25:57 root Exp root $;
-.\"
-.\" $Log: rpld.man,v $
-.\" Revision 1.8  1999/09/15 00:25:57  root
-.\" #
-.\"
-.\" Revision 1.7  1999/09/15 00:22:07  root
-.\" #
-.\"
-.\" Revision 1.6  1999/09/15 00:14:29  root
-.\" #
-.\"
-.\" Revision 1.5  1999/09/14 21:43:30  root
-.\" #
-.\"
-.\" Revision 1.4  1999/09/14 21:37:08  root
-.\" #
-.\"
-.\" Revision 1.3  1999/09/14 21:32:12  root
-.\" #
-.\"
-.\" Revision 1.2  1999/09/14 21:25:59  root
-.\" #
-.\"
-.\" Revision 1.1  1999/09/14 21:00:47  root
-.\" #
-.\"
-.\" Revision 1.1  1999/09/14 17:19:37  root
-.\" Initial revision
-.\"
-.\";
-.Dd Sep 14, 1999
-.Dt RPLD.CONF 5
-.Os Linux
-.Sh NAME
-.Nm rpld
-.Nd an RPL/RIPL remote boot server
-.Sh SYNOPSIS
-.Nm rpld
-.Sh WARRANTY
-.Nm rpld 
-DOES NOT come with ANY WARRANTY, NOT even an IMPLIED WARRANTY.
-.Sh DESCRIPTION
-.Nm rpld 
-will net-boot IBM style RPL boot ROMs. Communication between the client and the
-server is done in LLC-1 ui/C frames with the source and destination SAP both 
-being 0xfc. On booting the client transmits a FIND frame containing the client's
-MAC address, adapter type and frame length. The server replies with a FOUND frame
-containing the server's MAC address and a possibly smaller frame length. The
-client issues a SEND.FILE.REQUEST frame requesting the first block of the boot
-file. The server then issues a sequence of FILE.DATA.RESPONSE frames with 
-increasing block numbers. The FILE.DATA.RESPONSE frames contain a load address
-and an execute address and a flag. If the client fails to receive a  
-FILE.DATA.RESPONSE frame within a certain period it sends another 
-SEND.FILE.REQUEST frame requesting the block which follows the last block that
-was successfully received. On the last FILE.DATA.RESPONSE frame the server
-sets a special value of the flags which cause the client to transfer execution
-to the execute address specified in the frame.
-.Pp
-The server starts by reading the configuration file in /etc/rpld.conf,
-see 
-.Pa rpld.conf(5),
-After the configuration file has been read, it opens the system's
-default network interface and listens for RPL frames.
-The server recalculates the length of all the files to be downloaded every time
-it receives a SEND.FILE.REQUEST frame. 
-.Sh BUGS
-.Bl -tag -width 0 -compact
-.It
-Solenopsis invicta Buren 
-.It
-rpld (probably) doesn't support the new bzImage format correctly.
-.It
-rpld doesn't reload the first 512 octets of Linux kernels automatically.
-.It
-There is no way to make rpld re-read its configuration file.
-.It
-rpld 
-needs to meet more network cards.
-.Sh NOTES
-.Pp
-IBM is a trademark of IBM Corp.
-.Sh FILES
-.Bl -tag -width /etc/rpld.conf -compact
-.Pp
-.It Pa /usr/sbin/rpld
-.It Pa /etc/rpld.conf
-.It Pa /rplboot
-.El
-.Sh SEE ALSO
-.Pp
-.Bl -tag -width 0 -compact
-.It Pa rpld\.conf(5),
-.It Pa bootpd(1),
-.It Pa dhcpd(1),
-.It Pa http://bullard.esc.cam.ac.uk/~james/rpld;
-.El
-.Sh AUTHORS AND COPYRIGHT
-.Pp
-(c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
diff --git a/rpld.c b/rpld.c
index 7cc5cd9..371b86a 100644 (file)
--- a/rpld.c
+++ b/rpld.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: rpld.c,v 1.9 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] =
+  "$Id: rpld.c,v 1.17 2000/07/17 11:59:45 root Exp root $";
 
 /*
  * $Log: rpld.c,v $
+ * Revision 1.17  2000/07/17 11:59:45  root
+ * #
+ *
+ * Revision 1.16  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.15  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.14  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.13  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.12  2000/07/16 14:22:06  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.10  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.9  1999/09/13 11:17:35  root
  * \#
  *
@@ -33,10 +61,10 @@ static char rcsid[] = "$Id: rpld.c,v 1.9 1999/09/13 11:17:35 root Exp $";
 
 #include "project.h"
 
-static unsigned char RPL_MC_ADDR[ETH_ALEN] =
-{0x3, 0x0, 0x2, 0x0, 0x0, 0x0};
+static unsigned char RPL_MC_ADDR[ETH_ALEN] = { 0x3, 0x0, 0x2, 0x0, 0x0, 0x0 };
 
 int downloading = 0;
+int pacing = 1000;
 
 int
 main (argc, argv)
@@ -76,10 +104,11 @@ main (argc, argv)
       int len;
       struct timeval tv;
 
+
       if (downloading)
         {
           tv.tv_sec = 0;
-          tv.tv_usec = PACKET_DELAY;
+          tv.tv_usec = pacing >> 1;
         }
       else
         {
@@ -95,16 +124,22 @@ main (argc, argv)
           llc_recv_packet (n, buf, len);
         }
 
+
       if (downloading)
         {
           gettimeofday (&tv, NULL);
 
-          len = tv.tv_usec;
-          len += 1000000;
+          len = tv.tv_sec;
+          len -= last.tv_sec;
+          if (len > 1)
+            len = 2;
+          len *= 1000000;
+          len += tv.tv_usec;
           len -= last.tv_usec;
-          len %= 1000000;
 
-          if (len > 1000)
+
+
+          if (len > pacing)
             {
               client_dispatch (n);
               gettimeofday (&last, NULL);
diff --git a/rpld.c.orig b/rpld.c.orig
new file mode 100644 (file)
index 0000000..133b36a
--- /dev/null
@@ -0,0 +1,147 @@
+/*************************************************
+*     rpld - an IBM style RIPL server            *
+*************************************************/
+
+/* Copyright (c) 1999,2000, James McKenzie.
+ *                      All rights reserved
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
+ *                      All rights reserved
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENCE file which can be found at the top level of
+ * the rpld distribution.
+ *
+ * IBM is a trademark of IBM corp.
+ *
+ */
+
+
+static char rcsid[] =
+  "$Id: rpld.c,v 1.16 2000/07/17 10:49:20 root Exp root $";
+
+/*
+ * $Log: rpld.c,v $
+ * Revision 1.16  2000/07/17 10:49:20  root
+ * #
+ *
+ * Revision 1.15  2000/07/17 10:45:38  root
+ * #
+ *
+ * Revision 1.14  2000/07/17 10:43:54  root
+ * #
+ *
+ * Revision 1.13  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.12  2000/07/16 14:22:06  root
+ * #
+ *
+ * Revision 1.11  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.10  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
+ * Revision 1.9  1999/09/13 11:17:35  root
+ * \#
+ *
+ * Revision 1.8  1999/09/13 11:05:27  root
+ * \#
+ *
+ * Revision 1.7  1999/09/13 11:04:13  root
+ * \#
+ *
+ */
+
+#include "project.h"
+
+static unsigned char RPL_MC_ADDR[ETH_ALEN] = { 0x3, 0x0, 0x2, 0x0, 0x0, 0x0 };
+
+int downloading = 0;
+int pacing = 1000;
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  unsigned char buf[MAX_FRAME_LEN];
+  struct llchdr *h = (struct llchdr *) buf;
+  struct timeval last;
+
+  struct nit *n;
+
+  openlog ("rpld", LOG_PID, LOG_DAEMON);
+
+  parse_config ();
+
+  daemonize ();
+
+  n = nit_open (NULL);
+
+  if (!n)
+    {
+      syslog (LOG_ERR, "failed to initalize nit");
+      return (-1);
+    }
+
+  nit_multicast (n, RPL_MC_ADDR);
+
+  syslog (LOG_ERR, "my hw addr = %s", ethtoa (nit_mac (n)));
+
+
+  gettimeofday (&last, NULL);
+
+
+  while (1)
+    {
+      int len;
+      struct timeval tv;
+
+      if (downloading)
+        {
+          tv.tv_sec = 0;
+          tv.tv_usec = pacing >> 1;
+        }
+      else
+        {
+          tv.tv_sec = 10;
+          tv.tv_usec = 0;
+        }
+
+      len = nit_read_packet (n, buf, sizeof (buf), &tv);
+
+
+      if ((len > LLC_HDR_LEN) && (ntohs (h->h_len) <= 1514))
+        {                       /*Short circuit most packets */
+          llc_recv_packet (n, buf, len);
+        }
+
+      if (downloading)
+        {
+          gettimeofday (&tv, NULL);
+
+          len = tv.tv_sec;
+          len -= tv.tv_usec;
+          if (len > 1)
+            len = 2;
+          len *= 1000000;
+          len = tv.tv_usec;
+          len -= last.tv_usec;
+
+          if (len > pacing)
+            {
+              client_dispatch (n);
+              gettimeofday (&last, NULL);
+
+            }
+        }
+    }
+
+  nit_close (n);
+
+  return 0;
+}
index 39ff6df..9edebb5 100644 (file)
@@ -3,9 +3,9 @@
 .\"*     rpld - an IBM style RIPL server            *
 .\"*************************************************/
 .\"
-.\"Copyright (c) 1999, James McKenzie.
+.\"Copyright (c) 1999,2000, James McKenzie.
 .\"                     All rights reserved
-.\"Copyright (c) 1998, Christopher Lightfoot.
+.\"Copyright (c) 1998,2000, Christopher Lightfoot.
 .\"                     All rights reserved
 .\"
 .\"By using this file, you agree to the terms and conditions set
 .\"
 .\"
 .\"
-.\" $Id: rpld.conf.man,v 1.7 1999/09/15 14:29:10 root Exp $;
+.\" $Id: rpld.conf.man,v 1.7 2000/07/17 10:45:38 root Exp $;
 .\"
 .\" $Log: rpld.conf.man,v $
+.\" Revision 1.7  2000/07/17 10:45:38  root
+.\" #
+.\"
+.\" Revision 1.6  2000/07/17 10:43:34  root
+.\" #
+.\"
+.\" Revision 1.5  2000/07/16 14:22:06  root
+.\" #
+.\"
+.\" Revision 1.4  2000/07/16 14:05:28  root
+.\" #
+.\"
+.\" Revision 1.3  2000/07/16 13:18:10  root
+.\" #
+.\"
+.\" Revision 1.1  2000/07/16 13:16:33  root
+.\" #
+.\"
 .\" Revision 1.7  1999/09/15 14:29:10  root
 .\" #
 .\"
@@ -44,7 +62,7 @@
 .\" Initial revision
 .\"
 .\";
-.Dd Sep 14, 1999
+.Dd Jun 16, 2000
 .Dt RPLD.CONF 5
 .Os Linux
 .Sh NAME
@@ -64,7 +82,8 @@ HOST {
 
 .Ed
 Within the HOST blocks there can be 
-ethernet, execute, framesize  and blocksize directives and FILE blocks.
+ethernet, execute, framesize, blocksize, nospew, and pacing  directives 
+and FILE blocks.
 FILE blocks are of the form:
 .Bd -literal -ffset indent
        FILE {
@@ -123,11 +142,19 @@ to something that wasn't a multiple of four.
 .Ed
 .It Pa ethernet
 This directive sets the MAC address of the client referenced
-in this HOST block. It should be formatted as six octets separated by colons. e.g..
+in this HOST block. It should either be formatted as six octets separated by colons. e.g..
 .Bd -literal -ffset indent
        ethernet = 00:60:6e:33:4f:2c;
 
 .Ed
+or it can be specified as a range of mac addresses as six octets separated by colons followed by a solidus and the number of bytes to match. So:
+.Bd -literal --ffset indent
+       ethernet = 00:50:32:33:00:00/4;
+
+.Ed
+Will match anything of the form 00:50:32:33:xx:xx. It is expected that this 
+support will be changed from bytes to bits in a future release.
+
 .It Pa execute
 This directive sets the execute address that control is transferred to when 
 downloading has finished. It should be a number in either decimal or hexadecimal.
@@ -196,6 +223,16 @@ would load 4096 octets from the file
 starting 512 octets into the file into the
 client's memory starting 
 at address 0x90200. (so the 513th byte of the file will load to address 0x90200)
+.It Pa nospew
+This directive causes rpld to emit only one FILE.DATA.RESPONSE frame for SEND.FILE.REQUEST frame received. The usual behaviour is the client sends one FILE.DATA.RESPONSE frame which causes the server to transmit all the FILE.DATA.RESPONSE frames
+in order (see 
+.Pa pacing
+) Some RPL boot proms have made this sensible modification to the protocol. 
+.Pa NB
+if you
+specify this directive when it is not required, most roms will send another 
+SEND.FILE.REQUEST frame after a timeout of about one second. Some roms will only
+make twenty or so retransmits before aborting the boot.
 .It Pa offset
 This directive sets the offset for this FILE block. Data is read from 
 .Pa offset
@@ -205,6 +242,12 @@ specified by the load directive.
        offset = 512;
 
 .Ed
+.It Pa pacing
+This directive sets the minimum time gap in us between sequential frames when
+the 
+.Pa nospew
+option is NOT set. 1000 (or 1 ms) is a reasonable choice and the default. 
+Increase this if the client has to issue retransmits.
 .It Pa path
 This directive sets the path to the file that is to be downloaded. The file
 must exist, and is examined at startup and on reception of SEND.FILE.REQUEST
@@ -255,6 +298,7 @@ HOST {
                load=0x92000;
        };
        execute=0x92000;
+       pacing=2000;
 };
 
 .Ed
@@ -269,7 +313,7 @@ configuration file.
 .Xr rpld 1 ,
 .Xr bootpd 1 ,
 .Xr dhcpd 1 ,
-.Xr http://bullard.esc.cam.ac.uk/~james/rpld ;
+.Xr http://gimel.esc.cam.ac.uk/james/rpld ;
 .Sh AUTHORS AND COPYRIGHT
 .Pp
-(c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
+(c) 1999,2000 James McKenzie, and Christopher Lightfoot. All rights reserved.
index cd26ff6..cdf45ee 100644 (file)
--- a/rpld.man
+++ b/rpld.man
@@ -3,9 +3,9 @@
 .\"*     rpld - an IBM style RIPL server            *
 .\"*************************************************/
 .\"
-.\"Copyright (c) 1999, James McKenzie.
+.\"Copyright (c) 1999,2000, James McKenzie.
 .\"                     All rights reserved
-.\"Copyright (c) 1998, Christopher Lightfoot.
+.\"Copyright (c) 1998,2000, Christopher Lightfoot.
 .\"                     All rights reserved
 .\"
 .\"By using this file, you agree to the terms and conditions set
 .\"
 .\"
 .\"
-.\" $Id: rpld.man,v 1.10 1999/09/15 01:22:18 root Exp $;
+.\" $Id: rpld.man,v 1.10 2000/07/17 10:43:34 root Exp $;
 .\"
 .\" $Log: rpld.man,v $
+.\" Revision 1.10  2000/07/17 10:43:34  root
+.\" #
+.\"
+.\" Revision 1.9  2000/07/16 21:09:57  root
+.\" #
+.\"
+.\" Revision 1.8  2000/07/16 14:22:06  root
+.\" #
+.\"
+.\" Revision 1.7  2000/07/16 14:05:28  root
+.\" #
+.\"
+.\" Revision 1.6  2000/07/16 13:18:10  root
+.\" #
+.\"
+.\" Revision 1.1  2000/07/16 13:16:33  root
+.\" #
+.\"
 .\" Revision 1.10  1999/09/15 01:22:18  root
 .\" #
 .\"
@@ -53,7 +71,7 @@
 .\" Initial revision
 .\"
 .\";
-.Dd Sep 14, 1999
+.Dd Jun 16, 2000
 .Dt RPLD 8
 .Os Linux
 .Sh NAME
@@ -91,7 +109,7 @@ it receives a SEND.FILE.REQUEST frame.
 .Sh BUGS
 .Bl -tag -width 0 -compact
 .It
-Solenopsis invicta Buren 
+Solenopsis invicta Burens
 .It
 rpld (probably) doesn't support the new bzImage format correctly.
 .It
@@ -99,8 +117,11 @@ rpld doesn't reload the first 512 octets of Linux kernels automatically.
 .It
 There is no way to make rpld re-read its configuration file.
 .It
-rpld 
-needs to meet more network adapters.
+When concurrently serving multiple clients rpld will choose the pacing value of the slowest one.
+.It
+Partial ethernet addresses should be specified in bits not bytes.
+.It
+rpld needs to meet more network adapters.
 .Sh NOTES
 .Pp
 IBM is a trademark of IBM Corp.
@@ -117,8 +138,8 @@ IBM is a trademark of IBM Corp.
 .It Pa rpld\.conf(5),
 .It Pa bootpd(1),
 .It Pa dhcpd(1),
-.It Pa http://bullard.esc.cam.ac.uk/~james/rpld;
+.It Pa http://gimel.esc.cam.ac.uk/james/rpld;
 .El
 .Sh AUTHORS AND COPYRIGHT
 .Pp
-(c) 1999 James McKenzie, and Christopher Lightfoot. All rights reserved.
+(c) 1999,2000 James McKenzie, and Christopher Lightfoot. All rights reserved.
index f9bf0ef..7e0b70f 100644 (file)
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  *  Lexer for RPLD conf files
  *
  *  $Log: rpld_conf.lex,v $
- *  Revision 1.4  1999/09/26 10:46:56  root
+ *  Revision 1.6  2000/07/17 10:43:34  root
+ *  #
+ *
+ *  Revision 1.5  2000/07/16 14:05:28  root
+ *  #
+ *
+ *  Revision 1.4  2000/07/16 13:18:10  root
+ *  #
+ *
+ *  Revision 1.1  2000/07/16 13:16:33  root
  *  #
  *
  *  Revision 1.3  1999/09/13 11:17:35  root
  *  Revision 1.1  1999/09/13 11:04:13  root
  *  \#
  *
+ *  Revision 1.10  1999/09/12 19:08:24  chris
+ *  Another attempt at C comments.
+ *
+ *  Revision 1.9  1999/09/12 17:38:45  chris
+ *  Implemented proper MAC reading.
+ *
+ *  Revision 1.8  1999/09/12 03:27:43  chris
+ *  Changes to enable error reporting in yacc grammar.
+ *
+ *  Revision 1.7  1999/09/11 19:30:26  chris
+ *  Fixed hex number support.
+ *
+ *  Revision 1.6  1999/09/11 19:25:06  chris
+ *  No major changes.
+ *
+ *  Revision 1.5  1999/09/11 19:24:23  chris
+ *  Removed support for C-style comments, inserted support for C++ ones. Comment support actually works now
+ *
+ *  Revision 1.4  1999/09/11 19:02:25  chris
+ *  Fixed bug in comment support.
+ *
+ *  Revision 1.3  1999/09/11 19:00:43  chris
+ *  Added support for comments.
+ *
+ *  Revision 1.2  1999/09/11 18:57:31  chris
+ *  Initial revision.
+ *
  *  
  */
 
 %x     COMMENT
 
 %{
-static char rcsid[]="$Id: rpld_conf.lex,v 1.4 1999/09/26 10:46:56 root Exp root $";
+static char rcsid[]="$Id: rpld_conf.lex,v 1.6 2000/07/17 10:43:34 root Exp $";
 
 #include <stdio.h>
 #include <string.h>
index 4e07d3e..56c9609 100644 (file)
@@ -8,9 +8,9 @@ static char yysccsid[] = "@(#)yaccpar   1.9 (Berkeley) 02/21/93";
 #define yyerrok (yyerrflag=0)
 #define YYRECOVERING (yyerrflag!=0)
 #define YYPREFIX "yy"
-#line 34 "rpld_conf.y"
+#line 74 "rpld_conf.y"
 
-static char rcsid[]="$Id: rpld_conf.y,v 1.3 1999/09/26 10:46:56 root Exp root $";
+static char rcsid[]="$Id: rpld_conf.y,v 1.6 2000/07/17 11:59:45 root Exp root $";
 
 #include "project.h"
 
@@ -21,7 +21,7 @@ typedef enum {INIT, GLOBALBLOCK, HOSTBLOCK, FILEBLOCK} STATE ;
 
 /*void process_thing(THING thing, char *name, int type, YYSTYPE *pvalue);*/
 
-#line 50 "rpld_conf.y"
+#line 90 "rpld_conf.y"
 typedef union {
                long number;
                char *name;
@@ -172,7 +172,7 @@ YYSTYPE yylval;
 short yyss[YYSTACKSIZE];
 YYSTYPE yyvs[YYSTACKSIZE];
 #define yystacksize YYSTACKSIZE
-#line 88 "rpld_conf.y"
+#line 128 "rpld_conf.y"
 
 //
 // ERROR REPORTING
@@ -211,6 +211,8 @@ struct clientinfo
        // optional
        int have_framesize;
        int have_blocksize;
+       int have_pacing;
+       int have_nospew;
 };
 
 struct clfileinfo
@@ -338,7 +340,12 @@ void process_thing(THING thing, char *name, int type, YYSTYPE *pvalue)
                        THROW_ERROR("Unknown directive");
                } else if (state == HOSTBLOCK) {
                        // no host assertions ATM
-                       THROW_ERROR("Unknown directive");
+                       if (strsame(name,"nospew")) {
+                               if (ci.have_pacing) THROW_ERROR("Directive nospew incompatible with pacing ");
+                               if (ci.have_nospew) THROW_ERROR("Repeated directive");
+                               ci.have_nospew=1;
+                               pc->nospew++;
+                       } else THROW_ERROR("Unknown directive");
                } else if (state == FILEBLOCK) {
                        if (strsame(name,"linux")) {
                                if (!cfi.have_path) THROW_ERROR("A path to a
@@ -349,7 +356,7 @@ valid kernel must precede linux");
                                cfi.have_offset=1;
                                cfi.have_length=1;
                                ci.have_run_addr=1;
-                       } else{
+                       }else{
                        THROW_ERROR("Unknown directive");
                        }
                } else THROW_ERROR("Unknown directive");
@@ -402,6 +409,13 @@ valid kernel must precede linux");
                                pc->framelen = pvalue->number;
                                ci.have_framesize = 1;
                        }
+                       else if (strsame(name,"pacing")) {
+                               if (type != NUMBER) THROW_ERROR("Directive must be followed by an integer ");
+                               if (ci.have_nospew) THROW_ERROR("Directive pacing incompatible with nospew ");
+                               if (ci.have_pacing) THROW_ERROR("Repeated directive");
+                               pc->pacing = pvalue->number;
+                               ci.have_pacing =1;
+                       }
                        else THROW_ERROR("Unknown directive");
                } else if (state == FILEBLOCK) {
                        // path
@@ -449,7 +463,7 @@ valid kernel must precede linux");
        
 
 }
-#line 453 "rpld_conf.tab.c"
+#line 467 "rpld_conf.tab.c"
 #define YYABORT goto yyabort
 #define YYREJECT goto yyabort
 #define YYACCEPT goto yyaccept
@@ -591,42 +605,42 @@ yyreduce:
     switch (yyn)
     {
 case 3:
-#line 69 "rpld_conf.y"
+#line 109 "rpld_conf.y"
 { process_thing(BLOCK_END, "", 0, NULL); }
 break;
 case 4:
-#line 70 "rpld_conf.y"
+#line 110 "rpld_conf.y"
 { process_thing(BLOCK_END, "", 0, NULL); }
 break;
 case 5:
-#line 72 "rpld_conf.y"
+#line 112 "rpld_conf.y"
 { process_thing(BLOCK_START, yyvsp[-1].name, 0, NULL); }
 break;
 case 6:
-#line 73 "rpld_conf.y"
+#line 113 "rpld_conf.y"
 { process_thing(BLOCK_START, "", 0, NULL); }
 break;
 case 10:
-#line 80 "rpld_conf.y"
+#line 120 "rpld_conf.y"
 { process_thing(ASSERTION, yyvsp[0].name, 0, NULL); }
 break;
 case 11:
-#line 81 "rpld_conf.y"
+#line 121 "rpld_conf.y"
 { process_thing(ASSIGNMENT, yyvsp[-2].name, TEXT, &yyvsp[0]); }
 break;
 case 12:
-#line 82 "rpld_conf.y"
+#line 122 "rpld_conf.y"
 { process_thing(ASSIGNMENT, yyvsp[-2].name, NUMBER, &yyvsp[0]); }
 break;
 case 13:
-#line 83 "rpld_conf.y"
+#line 123 "rpld_conf.y"
 { process_thing(ASSIGNMENT, yyvsp[-2].name, MACADDR, &yyvsp[0]); }
 break;
 case 14:
-#line 84 "rpld_conf.y"
+#line 124 "rpld_conf.y"
 { process_thing(ASSIGNMENT, yyvsp[-2].name, MACADDR_PARTIAL, &yyvsp[0]); }
 break;
-#line 630 "rpld_conf.tab.c"
+#line 644 "rpld_conf.tab.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 8acaab9..5bf089e 100644 (file)
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  *     YACC grammar for RPLD conf file parser
  *
  * $Log: rpld_conf.y,v $
- * Revision 1.3  1999/09/26 10:46:56  root
+ * Revision 1.6  2000/07/17 11:59:45  root
+ * #
+ *
+ * Revision 1.5  2000/07/17 10:43:34  root
+ * #
+ *
+ * Revision 1.4  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.3  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
  * #
  *
  * Revision 1.2  1999/09/13 11:17:35  root
  * Revision 1.1  1999/09/13 11:04:13  root
  * \#
  *
+ * Revision 1.10  1999/09/12 19:45:03  chris
+ * *** empty log message ***
+ *
+ * Revision 1.9  1999/09/12 19:14:07  chris
+ * Error messages now report name of last token scanned, instead of current yytext.
+ *
+ * Revision 1.8  1999/09/12 17:39:01  chris
+ * Configuration file now correctly builds structures; various minor problems fixed.
+ *
+ * Revision 1.7  1999/09/12 04:21:29  chris
+ * Wrote back-end to parser.
+ *
+ * Revision 1.6  1999/09/12 03:27:35  chris
+ * Added better error reporting.
+ *
+ * Revision 1.5  1999/09/12 01:05:00  chris
+ * Supports detecting start and end of blocks.
+ *
+ * Revision 1.4  1999/09/12 00:58:02  chris
+ * Added named block syntax.
+ *
+ * Revision 1.3  1999/09/11 19:00:51  chris
+ * Added support for nested blocks.
+ *
+ * Revision 1.2  1999/09/11 18:53:41  chris
+ * Added a comment to say what the file does.
+ *
+ *
  */
 
 %{
 
-static char rcsid[]="$Id: rpld_conf.y,v 1.3 1999/09/26 10:46:56 root Exp root $";
+static char rcsid[]="$Id: rpld_conf.y,v 1.6 2000/07/17 11:59:45 root Exp root $";
 
 #include "project.h"
 
@@ -123,6 +163,8 @@ struct clientinfo
        // optional
        int have_framesize;
        int have_blocksize;
+       int have_pacing;
+       int have_nospew;
 };
 
 struct clfileinfo
@@ -250,7 +292,12 @@ void process_thing(THING thing, char *name, int type, YYSTYPE *pvalue)
                        THROW_ERROR("Unknown directive");
                } else if (state == HOSTBLOCK) {
                        // no host assertions ATM
-                       THROW_ERROR("Unknown directive");
+                       if (strsame(name,"nospew")) {
+                               if (ci.have_pacing) THROW_ERROR("Directive nospew incompatible with pacing ");
+                               if (ci.have_nospew) THROW_ERROR("Repeated directive");
+                               ci.have_nospew=1;
+                               pc->nospew++;
+                       } else THROW_ERROR("Unknown directive");
                } else if (state == FILEBLOCK) {
                        if (strsame(name,"linux")) {
                                if (!cfi.have_path) THROW_ERROR("A path to a
@@ -261,7 +308,7 @@ valid kernel must precede linux");
                                cfi.have_offset=1;
                                cfi.have_length=1;
                                ci.have_run_addr=1;
-                       } else{
+                       }else{
                        THROW_ERROR("Unknown directive");
                        }
                } else THROW_ERROR("Unknown directive");
@@ -314,6 +361,13 @@ valid kernel must precede linux");
                                pc->framelen = pvalue->number;
                                ci.have_framesize = 1;
                        }
+                       else if (strsame(name,"pacing")) {
+                               if (type != NUMBER) THROW_ERROR("Directive must be followed by an integer ");
+                               if (ci.have_nospew) THROW_ERROR("Directive pacing incompatible with nospew ");
+                               if (ci.have_pacing) THROW_ERROR("Repeated directive");
+                               pc->pacing = pvalue->number;
+                               ci.have_pacing =1;
+                       }
                        else THROW_ERROR("Unknown directive");
                } else if (state == FILEBLOCK) {
                        // path
index c1ce8b4..3894661 100644 (file)
@@ -406,9 +406,9 @@ char *yytext;
 /*************************************************
 *     rpld - an IBM style RIPL server            *
 *************************************************/
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
@@ -422,7 +422,16 @@ char *yytext;
  *  Lexer for RPLD conf files
  *
  *  $Log: rpld_conf.lex,v $
- *  Revision 1.4  1999/09/26 10:46:56  root
+ *  Revision 1.6  2000/07/17 10:43:34  root
+ *  #
+ *
+ *  Revision 1.5  2000/07/16 14:05:28  root
+ *  #
+ *
+ *  Revision 1.4  2000/07/16 13:18:10  root
+ *  #
+ *
+ *  Revision 1.1  2000/07/16 13:16:33  root
  *  #
  *
  *  Revision 1.3  1999/09/13 11:17:35  root
@@ -434,12 +443,39 @@ char *yytext;
  *  Revision 1.1  1999/09/13 11:04:13  root
  *  \#
  *
+ *  Revision 1.10  1999/09/12 19:08:24  chris
+ *  Another attempt at C comments.
+ *
+ *  Revision 1.9  1999/09/12 17:38:45  chris
+ *  Implemented proper MAC reading.
+ *
+ *  Revision 1.8  1999/09/12 03:27:43  chris
+ *  Changes to enable error reporting in yacc grammar.
+ *
+ *  Revision 1.7  1999/09/11 19:30:26  chris
+ *  Fixed hex number support.
+ *
+ *  Revision 1.6  1999/09/11 19:25:06  chris
+ *  No major changes.
+ *
+ *  Revision 1.5  1999/09/11 19:24:23  chris
+ *  Removed support for C-style comments, inserted support for C++ ones. Comment support actually works now
+ *
+ *  Revision 1.4  1999/09/11 19:02:25  chris
+ *  Fixed bug in comment support.
+ *
+ *  Revision 1.3  1999/09/11 19:00:43  chris
+ *  Added support for comments.
+ *
+ *  Revision 1.2  1999/09/11 18:57:31  chris
+ *  Initial revision.
+ *
  *  
  */
 #define COMMENT 1
 
-#line 40 "rpld_conf.lex"
-static char rcsid[]="$Id: rpld_conf.lex,v 1.4 1999/09/26 10:46:56 root Exp root $";
+#line 76 "rpld_conf.lex"
+static char rcsid[]="$Id: rpld_conf.lex,v 1.6 2000/07/17 10:43:34 root Exp $";
 
 #include <stdio.h>
 #include <string.h>
@@ -462,7 +498,7 @@ void strtomac(char *s, char *mac)
 }
 
 
-#line 466 "rpld_conf.yy.c"
+#line 502 "rpld_conf.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -610,13 +646,13 @@ YY_MALLOC_DECL
 YY_DECL
        {
        register yy_state_type yy_current_state;
-       register char *yy_cp, *yy_bp;
+       register char *yy_cp = NULL, *yy_bp = NULL;
        register int yy_act;
 
-#line 68 "rpld_conf.lex"
+#line 104 "rpld_conf.lex"
 
 
-#line 620 "rpld_conf.yy.c"
+#line 656 "rpld_conf.yy.c"
 
        if ( yy_init )
                {
@@ -701,49 +737,49 @@ do_action:        /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 70 "rpld_conf.lex"
+#line 106 "rpld_conf.lex"
 ;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 71 "rpld_conf.lex"
+#line 107 "rpld_conf.lex"
 { lineno++; }
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 73 "rpld_conf.lex"
+#line 109 "rpld_conf.lex"
 ;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 75 "rpld_conf.lex"
+#line 111 "rpld_conf.lex"
 BEGIN COMMENT;
        YY_BREAK
 case 5:
-#line 77 "rpld_conf.lex"
+#line 113 "rpld_conf.lex"
 case 6:
 YY_RULE_SETUP
-#line 77 "rpld_conf.lex"
+#line 113 "rpld_conf.lex"
 ;
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 78 "rpld_conf.lex"
+#line 114 "rpld_conf.lex"
 BEGIN INITIAL;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 80 "rpld_conf.lex"
+#line 116 "rpld_conf.lex"
 { return BLOCK_START; }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 82 "rpld_conf.lex"
+#line 118 "rpld_conf.lex"
 { return BLOCK_END; }
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 84 "rpld_conf.lex"
+#line 120 "rpld_conf.lex"
 {
                                strtomac(yytext, (yylval.mac_address));
                                return MACADDR;
@@ -754,7 +790,7 @@ case 11:
 yy_c_buf_p = yy_cp = yy_bp + 17;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 89 "rpld_conf.lex"
+#line 125 "rpld_conf.lex"
 {
                                strtomac(yytext, (yylval.pm.mac_address));
                                yylval.pm.mac_len = yytext[13] - '0';
@@ -763,7 +799,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 95 "rpld_conf.lex"
+#line 131 "rpld_conf.lex"
 {
                                yylval.number = strtol(yytext + 2, NULL, 16);
                                return NUMBER;
@@ -771,7 +807,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 100 "rpld_conf.lex"
+#line 136 "rpld_conf.lex"
 {
                                int i; i = strtol(yytext, NULL, 10);
                                yylval.number = i; return NUMBER;
@@ -779,25 +815,25 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 105 "rpld_conf.lex"
+#line 141 "rpld_conf.lex"
 { yylval.name = strdup(yytext); return NAME; }
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 107 "rpld_conf.lex"
+#line 143 "rpld_conf.lex"
 { yylval.text = strdup(yytext + 1); *(yylval.text + strlen(yylval.text) - 1) = 0; return TEXT;}
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 109 "rpld_conf.lex"
+#line 145 "rpld_conf.lex"
 { return yytext[0]; }
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 111 "rpld_conf.lex"
+#line 147 "rpld_conf.lex"
 ECHO;
        YY_BREAK
-#line 801 "rpld_conf.yy.c"
+#line 837 "rpld_conf.yy.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
        yyterminate();
@@ -1684,7 +1720,7 @@ int main()
        return 0;
        }
 #endif
-#line 111 "rpld_conf.lex"
+#line 147 "rpld_conf.lex"
 
 
 
diff --git a/util.c b/util.c
index 2ac215f..e2b74ab 100644 (file)
--- a/util.c
+++ b/util.c
@@ -2,9 +2,9 @@
 *     rpld - an IBM style RIPL server            *
 *************************************************/
 
-/* Copyright (c) 1999, James McKenzie.
+/* Copyright (c) 1999,2000, James McKenzie.
  *                      All rights reserved
- * Copyright (c) 1998, Christopher Lightfoot.
+ * Copyright (c) 1998,2000, Christopher Lightfoot.
  *                      All rights reserved
  *
  * By using this file, you agree to the terms and conditions set
  */
 
 
-static char rcsid[] = "$Id: util.c,v 1.5 1999/09/13 11:17:35 root Exp $";
+static char rcsid[] = "$Id: util.c,v 1.7 2000/07/16 14:05:28 root Exp $";
 
 /*
  * $Log: util.c,v $
+ * Revision 1.7  2000/07/16 14:05:28  root
+ * #
+ *
+ * Revision 1.6  2000/07/16 13:18:10  root
+ * #
+ *
+ * Revision 1.1  2000/07/16 13:16:33  root
+ * #
+ *
  * Revision 1.5  1999/09/13 11:17:35  root
  * \#
  *