Assume natural alignment for IP & ether addrs
[akaros.git] / kern / src / net / bootp.c
index a956132..556f225 100644 (file)
@@ -7,41 +7,39 @@
 #include "kernel.h"
 #include "ip.h"
 
-static ulong   fsip;
-static ulong   auip;
-static ulong   gwip;
-static ulong   ipmask;
-static ulong   ipaddr;
+static ulong fsip;
+static ulong auip;
+static ulong gwip;
+static ulong ipmask;
+static ulong ipaddr;
 
-enum
-{
+enum {
        Bootrequest = 1,
-       Bootreply   = 2,
+       Bootreply = 2,
 };
 
-typedef struct Bootp
-{
+typedef struct Bootp {
        /* udp.c oldheader */
-       uchar   raddr[IPaddrlen];
-       uchar   laddr[IPaddrlen];
-       uchar   rport[2];
-       uchar   lport[2];
+       uchar raddr[IPaddrlen];
+       uchar laddr[IPaddrlen];
+       uchar rport[2];
+       uchar lport[2];
        /* bootp itself */
-       uchar   op;             /* opcode */
-       uchar   htype;          /* hardware type */
-       uchar   hlen;           /* hardware address len */
-       uchar   hops;           /* hops */
-       uchar   xid[4];         /* a random number */
-       uchar   secs[2];        /* elapsed snce client started booting */
-       uchar   pad[2];
-       uchar   ciaddr[4];      /* client IP address (client tells server) */
-       uchar   yiaddr[4];      /* client IP address (server tells client) */
-       uchar   siaddr[4];      /* server IP address */
-       uchar   giaddr[4];      /* gateway IP address */
-       uchar   chaddr[16];     /* client hardware address */
-       uchar   sname[64];      /* server host name (optional) */
-       uchar   file[128];      /* boot file name */
-       uchar   vend[128];      /* vendor-specific goo */
+       uchar op;                                       /* opcode */
+       uchar htype;                            /* hardware type */
+       uchar hlen;                                     /* hardware address len */
+       uchar hops;                                     /* hops */
+       uchar xid[4];                           /* a random number */
+       uchar secs[2];                          /* elapsed snce client started booting */
+       uchar pad[2];
+       uchar ciaddr[4];                        /* client IP address (client tells server) */
+       uchar yiaddr[4];                        /* client IP address (server tells client) */
+       uchar siaddr[4];                        /* server IP address */
+       uchar giaddr[4];                        /* gateway IP address */
+       uchar chaddr[16];                       /* client hardware address */
+       uchar sname[64];                        /* server host name (optional) */
+       uchar file[128];                        /* boot file name */
+       uchar vend[128];                        /* vendor-specific goo */
 } Bootp;
 
 /*
@@ -57,44 +55,43 @@ typedef struct Bootp
  * address is followed by a newline.
  */
 
-static Bootp   req;
-static Proc*   rcvprocp;
-static int     recv;
-static int     done;
-static Rendez  bootpr;
-static char    rcvbuf[512+2*IPaddrlen+2*2];
+static Bootp req;
+static Proc *rcvprocp;
+static int recv;
+static int done;
+static Rendez bootpr;
+static char rcvbuf[512 + 2 * IPaddrlen + 2 * 2];
 
-static void
-rcvbootp(void *a)
+static void rcvbootp(void *a)
 {
        int n, fd;
        Bootp *rp;
        char *field[4];
        uchar ip[IPaddrlen];
 
-       if(waserror())
+       if (waserror())
                pexit("", 0);
        rcvprocp = up;  /* store for postnote below */
        fd = (int)a;
-       while(done == 0) {
+       while (done == 0) {
                n = kread(fd, rcvbuf, sizeof(rcvbuf));
-               if(n <= 0)
+               if (n <= 0)
                        break;
-               rp = (Bootp*)rcvbuf;
+               rp = (Bootp *) rcvbuf;
                /* currently ignore udp's header */
-               if(memcmp(req.chaddr, rp->chaddr, 6) == 0
-               && rp->htype == 1 && rp->hlen == 6
-               && getfields((char*)rp->vend+4, field, 4, 1, " ") == 4
-               && strncmp((char*)rp->vend, "p9  ", 4) == 0){
-                       if(ipaddr == 0)
+               if (memcmp(req.chaddr, rp->chaddr, 6) == 0
+                       && rp->htype == 1 && rp->hlen == 6
+                       && getfields((char *)rp->vend + 4, field, 4, 1, " ") == 4
+                       && strncmp((char *)rp->vend, "p9  ", 4) == 0) {
+                       if (ipaddr == 0)
                                ipaddr = nhgetl(rp->yiaddr);
-                       if(ipmask == 0)
+                       if (ipmask == 0)
                                ipmask = parseip(ip, field[0]);
-                       if(fsip == 0)
+                       if (fsip == 0)
                                fsip = parseip(ip, field[1]);
-                       if(auip == 0)
+                       if (auip == 0)
                                auip = parseip(ip, field[2]);
-                       if(gwip == 0)
+                       if (gwip == 0)
                                gwip = parseip(ip, field[3]);
                        break;
                }
@@ -107,11 +104,10 @@ rcvbootp(void *a)
        pexit("", 0);
 }
 
-static char*
-rbootp(Ipifc *ifc)
+static char *rbootp(Ipifc * ifc)
 {
        int cfd, dfd, tries, n;
-       char ia[5+3*24], im[16], *av[3];
+       char ia[5 + 3 * 24], im[16], *av[3];
        uchar nipaddr[4], ngwip[4], nipmask[4];
        char dir[Maxpath];
 
@@ -120,36 +116,35 @@ rbootp(Ipifc *ifc)
        ipifcadd(ifc, av, 3, 0, nil);
 
        cfd = kannounce("udp!*!68", dir);
-       if(cfd < 0)
+       if (cfd < 0)
                return "bootp announce failed";
        strcat(dir, "/data");
-       if(kwrite(cfd, "headers", 7) < 0){
+       if (kwrite(cfd, "headers", 7) < 0) {
                kclose(cfd);
                return "bootp ctl headers failed";
        }
        kwrite(cfd, "oldheaders", 10);
        dfd = kopen(dir, ORDWR);
-       if(dfd < 0){
+       if (dfd < 0) {
                kclose(cfd);
                return "bootp open data failed";
        }
        kclose(cfd);
-       
 
        /* create request */
        memset(&req, 0, sizeof(req));
        ipmove(req.raddr, IPv4bcast);
        hnputs(req.rport, 67);
        req.op = Bootrequest;
-       req.htype = 1;                  /* ethernet (all we know) */
-       req.hlen = 6;                   /* ethernet (all we know) */
+       req.htype = 1;  /* ethernet (all we know) */
+       req.hlen = 6;   /* ethernet (all we know) */
 
        /* Hardware MAC address */
        memmove(req.chaddr, ifc->mac, 6);
        /* Fill in the local IP address if we know it */
        ipv4local(ifc, req.ciaddr);
        memset(req.file, 0, sizeof(req.file));
-       strcpy((char*)req.vend, "p9  ");
+       strcpy((char *)req.vend, "p9  ");
 
        done = 0;
        recv = 0;
@@ -161,19 +156,19 @@ rbootp(Ipifc *ifc)
         * or fixed number of tries
         */
        tries = 0;
-       while(recv == 0) {
-               if(kwrite(dfd, &req, sizeof(req)) < 0)
+       while (recv == 0) {
+               if (kwrite(dfd, &req, sizeof(req)) < 0)
                        print("bootp: write: %s\n", commonerror());
 
                udelay_sched(1000 * 1000);
-               if(++tries > 10) {
+               if (++tries > 10) {
                        print("bootp: timed out\n");
                        break;
                }
        }
        kclose(dfd);
        done = 1;
-       if(rcvprocp != nil){
+       if (rcvprocp != nil) {
                postnote(rcvprocp, 1, "timeout", 0);
                rcvprocp = nil;
        }
@@ -190,7 +185,7 @@ rbootp(Ipifc *ifc)
        av[2] = im;
        ipifcadd(ifc, av, 3, 0, nil);
 
-       if(gwip != 0) {
+       if (gwip != 0) {
                hnputl(ngwip, gwip);
                n = snprint(ia, sizeof(ia), "add 0.0.0.0 0.0.0.0 %V", ngwip);
                routewrite(ifc->conv->p->f, nil, ia, n);
@@ -198,28 +193,27 @@ rbootp(Ipifc *ifc)
        return nil;
 }
 
-static int
-rbootpread(char *bp, ulong offset, int len)
+static int rbootpread(char *bp, ulong offset, int len)
 {
        int n;
        char *buf;
        uchar a[4];
 
        buf = smalloc(READSTR);
-       if(waserror()){
+       if (waserror()) {
                free(buf);
                nexterror();
        }
        hnputl(a, fsip);
        n = snprint(buf, READSTR, "fsip %15V\n", a);
        hnputl(a, auip);
-       n += snprint(buf + n, READSTR-n, "auip %15V\n", a);
+       n += snprint(buf + n, READSTR - n, "auip %15V\n", a);
        hnputl(a, gwip);
-       n += snprint(buf + n, READSTR-n, "gwip %15V\n", a);
+       n += snprint(buf + n, READSTR - n, "gwip %15V\n", a);
        hnputl(a, ipmask);
-       n += snprint(buf + n, READSTR-n, "ipmask %15V\n", a);
+       n += snprint(buf + n, READSTR - n, "ipmask %15V\n", a);
        hnputl(a, ipaddr);
-       snprint(buf + n, READSTR-n, "ipaddr %15V\n", a);
+       snprint(buf + n, READSTR - n, "ipaddr %15V\n", a);
 
        len = readstr(offset, bp, len, buf);
        poperror();
@@ -227,5 +221,5 @@ rbootpread(char *bp, ulong offset, int len)
        return len;
 }
 
-char*  (*bootp)(Ipifc*) = rbootp;
-int    (*bootpread)(char*, ulong, int) = rbootpread;
+char *(*bootp) (Ipifc *) = rbootp;
+int (*bootpread) (char *, ulong, int) = rbootpread;