Have #ip's protocol ctl()s throw errors
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 13 Feb 2016 16:29:03 +0000 (11:29 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 14 Feb 2016 14:03:17 +0000 (09:03 -0500)
I took care of UDP and ICMP6 in this commit, since they were fairly
simple.  TCP and IPIFC were a bit more complex.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ip.h
kern/src/net/devip.c
kern/src/net/icmp6.c
kern/src/net/ipifc.c
kern/src/net/tcp.c
kern/src/net/udp.c

index c6eea15..06259f0 100644 (file)
@@ -296,7 +296,7 @@ struct Proto {
        void (*create) (struct conv *);
        void (*close) (struct conv *);
        void (*rcv) (struct Proto *, struct Ipifc *, struct block *);
-       char *(*ctl) (struct conv *, char **unused_char_pp_t, int);
+       void (*ctl)(struct conv *, char **, int);
        void (*advise) (struct Proto *, struct block *, char *unused_char_p_t);
        int (*stats) (struct Proto *, char *unused_char_p_t, int);
        int (*local) (struct conv *, char *unused_char_p_t, int);
index 94b0818..88930a6 100644 (file)
@@ -1267,9 +1267,7 @@ static long ipwrite(struct chan *ch, void *v, long n, int64_t off)
                                parseip(ia, cb->f[1]);
                                ipifcremmulti(c, c->raddr, ia);
                        } else if (x->ctl != NULL) {
-                               p = x->ctl(c, cb->f, cb->nf);
-                               if (p != NULL)
-                                       error(EFAIL, p);
+                               x->ctl(c, cb->f, cb->nf);
                        } else
                                error(EFAIL, "unknown control request");
                        qunlock(&c->qlock);
index 4bc2ed3..b0ec8b9 100644 (file)
@@ -343,19 +343,14 @@ static void icmpkick6(void *x, struct block *bp)
        ipoput6(c->p->f, bp, 0, c->ttl, c->tos, NULL);
 }
 
-char *icmpctl6(struct conv *c, char **argv, int argc)
+static void icmpctl6(struct conv *c, char **argv, int argc)
 {
-       Icmpcb6 *icb;
+       Icmpcb6 *icb = (Icmpcb6*)c->ptcl;
 
-       icb = (Icmpcb6 *) c->ptcl;
-
-       if (argc == 1) {
-               if (strcmp(argv[0], "headers") == 0) {
-                       icb->headers = 6;
-                       return NULL;
-               }
-       }
-       return "unknown control request";
+       if ((argc == 1) && strcmp(argv[0], "headers") == 0)
+               icb->headers = 6;
+       else
+               error(EINVAL, "unknown command to %s", __func__);
 }
 
 static void goticmpkt6(struct Proto *icmp, struct block *bp, int muxkey)
index 702f4a9..cef9360 100644 (file)
@@ -802,16 +802,10 @@ static void ipifc_iprouting(struct Fs *f, char **argv, int argc)
  *  non-standard control messages.
  *  called with c locked.
  */
-static char *ipifcctl(struct conv *c, char **argv, int argc)
+static void ipifcctl(struct conv *c, char **argv, int argc)
 {
        struct Ipifc *ifc;
        int i;
-       ERRSTACK(1);
-
-       if (waserror()) {
-               poperror();
-               return current_errstr();
-       }
 
        ifc = (struct Ipifc *)c->ptcl;
        if (strcmp(argv[0], "add") == 0)
@@ -842,9 +836,6 @@ static char *ipifcctl(struct conv *c, char **argv, int argc)
                ipifcrecvra6(ifc, argv, argc);
        else
                error(EINVAL, "unknown command to %s", __func__);
-
-       poperror();
-       return NULL;
 }
 
 int ipifcstats(struct Proto *ipifc, char *buf, int len)
index 32b946b..2ae15b7 100644 (file)
@@ -3087,15 +3087,8 @@ static void tcpporthogdefensectl(char *val)
 }
 
 /* called with c qlocked */
-char *tcpctl(struct conv *c, char **f, int n)
+static void tcpctl(struct conv *c, char **f, int n)
 {
-       ERRSTACK(1);
-
-       if (waserror()) {
-               poperror();
-               return current_errstr();
-       }
-
        if (n == 1 && strcmp(f[0], "hangup") == 0)
                tcphangup(c);
        else if (n >= 1 && strcmp(f[0], "keepalive") == 0)
@@ -3106,9 +3099,6 @@ char *tcpctl(struct conv *c, char **f, int n)
                tcpporthogdefensectl(f[1]);
        else
                error(EINVAL, "unknown command to %s", __func__);
-
-       poperror();
-       return NULL;
 }
 
 int tcpstats(struct Proto *tcp, char *buf, int len)
index f32d83f..8b280de 100644 (file)
@@ -582,21 +582,16 @@ void udpiput(struct Proto *udp, struct Ipifc *ifc, struct block *bp)
 
 }
 
-char *udpctl(struct conv *c, char **f, int n)
+static void udpctl(struct conv *c, char **f, int n)
 {
-       Udpcb *ucb;
-
-       ucb = (Udpcb *) c->ptcl;
-       if (n == 1) {
-               if (strcmp(f[0], "oldheaders") == 0) {
-                       ucb->headers = 6;
-                       return NULL;
-               } else if (strcmp(f[0], "headers") == 0) {
-                       ucb->headers = 7;
-                       return NULL;
-               }
-       }
-       return "unknown control request";
+       Udpcb *ucb = (Udpcb*)c->ptcl;
+
+       if ((n == 1) && strcmp(f[0], "oldheaders") == 0)
+               ucb->headers = 6;
+       else if ((n == 1) && strcmp(f[0], "headers") == 0)
+               ucb->headers = 7;
+       else
+               error(EINVAL, "unknown command to %s", __func__);
 }
 
 void udpadvise(struct Proto *udp, struct block *bp, char *msg)