Fix permission checks for devether
[akaros.git] / kern / src / net / icmp6.c
index 01948fa..a6b6d72 100644 (file)
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE. */
 
-#include <vfs.h>
-#include <kfs.h>
-#include <slab.h>
 #include <kmalloc.h>
-#include <kref.h>
 #include <string.h>
 #include <stdio.h>
-#include <assert.h>
+#include <syscall.h>
 #include <error.h>
-#include <cpio.h>
-#include <pmap.h>
-#include <smp.h>
 #include <ip.h>
 
 struct ICMPpkt {
@@ -52,10 +45,6 @@ struct ICMPpkt {
  * We have been naming the struct
  * members and just using the extra level of deref
  * e.g. i->x becomes i->i6->x.
- * I'm going to use insert the structs into
- * this because it's just a lot easier, and
- * maybe someday gcc will grow up and me more
- * like Plan 9 C.
  */
 struct IPICMP {
 /*
@@ -210,7 +199,6 @@ typedef struct Icmppriv6 {
 } Icmppriv6;
 
 typedef struct Icmpcb6 {
-       qlock_t qlock;
        uint8_t headers;
 } Icmpcb6;
 
@@ -265,7 +253,7 @@ static void set_cksum(struct block *bp)
 static struct block *newIPICMP(int packetlen)
 {
        struct block *nbp;
-       nbp = allocb(packetlen);
+       nbp = block_alloc(packetlen, MEM_WAIT);
        nbp->wp += packetlen;
        memset(nbp->rp, 0, packetlen);
        return nbp;
@@ -350,7 +338,7 @@ static void icmpctl6(struct conv *c, char **argv, int argc)
        if ((argc == 1) && strcmp(argv[0], "headers") == 0)
                icb->headers = 6;
        else
-               error(EINVAL, "unknown command to %s", __func__);
+               error(EINVAL, "unknown command to icmpctl6");
 }
 
 static void goticmpkt6(struct Proto *icmp, struct block *bp, int muxkey)
@@ -396,14 +384,15 @@ static struct block *mkechoreply6(struct block *bp)
 
 /*
  * sends out an ICMPv6 neighbor solicitation
- *     suni == SRC_UNSPEC or SRC_UNI, 
+ *     suni == SRC_UNSPEC or SRC_UNI,
  *     tuni == TARG_MULTI => multicast for address resolution,
  *     and tuni == TARG_UNI => neighbor reachability.
  */
 
-extern void
-icmpns(struct Fs *f, uint8_t * src, int suni, uint8_t * targ, int tuni,
-          uint8_t * mac)
+void icmpns(struct Fs *f,
+            uint8_t *src, int suni,
+            uint8_t *targ, int tuni,
+            uint8_t *mac)
 {
        struct block *nbp;
        struct Ndpkt *np;
@@ -447,9 +436,8 @@ icmpns(struct Fs *f, uint8_t * src, int suni, uint8_t * targ, int tuni,
 /*
  * sends out an ICMPv6 neighbor advertisement. pktflags == RSO flags.
  */
-extern void
-icmpna(struct Fs *f, uint8_t * src, uint8_t * dst, uint8_t * targ,
-          uint8_t * mac, uint8_t flags)
+void icmpna(struct Fs *f, uint8_t * src, uint8_t * dst, uint8_t * targ,
+            uint8_t * mac, uint8_t flags)
 {
        struct block *nbp;
        struct Ndpkt *np;
@@ -480,9 +468,8 @@ icmpna(struct Fs *f, uint8_t * src, uint8_t * dst, uint8_t * targ,
        ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, NULL);
 }
 
-extern void
-icmphostunr(struct Fs *f, struct Ipifc *ifc,
-                       struct block *bp, int code, int free)
+void icmphostunr(struct Fs *f, struct Ipifc *ifc,
+                 struct block *bp, int code, int free)
 {
        struct block *nbp;
        struct IPICMP *np;
@@ -530,7 +517,7 @@ freebl:
                freeblist(bp);
 }
 
-extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
+void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
 {
        struct block *nbp;
        struct IPICMP *np;
@@ -550,10 +537,10 @@ extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
 
        if (ipv6anylocal(ifc, np->src)) {
                netlog(f, Logicmp, "send icmpttlexceeded6 -> s%I d%I\n", p->src,
-                          p->dst);
+                      p->dst);
        } else {
                netlog(f, Logicmp, "icmpttlexceeded6 fail -> s%I d%I\n", p->src,
-                          p->dst);
+                      p->dst);
                return;
        }
 
@@ -561,7 +548,7 @@ extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
        np->type = TimeExceedV6;
        np->code = 0;
        memmove(nbp->rp + sizeof(struct IPICMP), bp->rp,
-                       sz - sizeof(struct IPICMP));
+               sz - sizeof(struct IPICMP));
        set_cksum(nbp);
        np->ttl = HOP_LIMIT;
        np->vcf[0] = 0x06 << 4;
@@ -569,7 +556,7 @@ extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
        ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, NULL);
 }
 
-extern void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
+void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
 {
        struct block *nbp;
        struct IPICMP *np;
@@ -587,12 +574,11 @@ extern void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
        nbp = newIPICMP(sz);
        np = (struct IPICMP *)nbp->rp;
 
-       if (ipv6anylocal(ifc, np->src)) {
-               netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n", p->src, p->dst);
-       } else {
+       if (!ipv6anylocal(ifc, np->src)) {
                netlog(f, Logicmp, "icmppkttoobig6 fail -> s%I d%I\n", p->src, p->dst);
                return;
        }
+       netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n", p->src, p->dst);
 
        memmove(np->dst, p->src, IPaddrlen);
        np->type = PacketTooBigV6;
@@ -610,9 +596,8 @@ extern void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp)
 /*
  * RFC 2461, pages 39-40, pages 57-58.
  */
-static int
-valid(struct Proto *icmp, struct Ipifc *ifc,
-         struct block *bp, Icmppriv6 * ipriv)
+static int valid(struct Proto *icmp, struct Ipifc *ifc,
+                 struct block *bp, Icmppriv6 * ipriv)
 {
        int sz, osz, unsp, n, ttl, iplen;
        int pktsz = BLEN(bp);
@@ -846,7 +831,7 @@ static void icmpiput6(struct Proto *icmp, struct Ipifc *ipifc, struct block *bp)
 
                case RouterAdvert:
                case RouterSolicit:
-                       /* using lsrc as a temp, munge hdr for goticmp6 
+                       /* using lsrc as a temp, munge hdr for goticmp6
                           memmove(lsrc, p->src, IPaddrlen);
                           memmove(p->src, p->dst, IPaddrlen);
                           memmove(p->dst, lsrc, IPaddrlen); */
@@ -890,10 +875,10 @@ static void icmpiput6(struct Proto *icmp, struct Ipifc *ipifc, struct block *bp)
                case NbrAdvert:
                        np = (struct Ndpkt *)p;
 
-                       /* if the target address matches one of the local interface 
-                        * address and the local interface address has tentative bit set, 
-                        * then insert into ARP table. this is so the duplication address 
-                        * detection part of ipconfig can discover duplication through 
+                       /* if the target address matches one of the local interface
+                        * address and the local interface address has tentative bit set,
+                        * then insert into ARP table. this is so the duplication address
+                        * detection part of ipconfig can discover duplication through
                         * the arp table
                         */
                        lifc = iplocalonifc(ipifc, np->target);
@@ -932,27 +917,18 @@ int icmpstats6(struct Proto *icmp6, char *buf, int len)
                if (icmpnames6[i])
                        p = seprintf(p, e, "%s: %u %u\n", icmpnames6[i], priv->in[i],
                                                 priv->out[i]);
-/*             else
+               else
                        p = seprintf(p, e, "%d: %u %u\n", i, priv->in[i], priv->out[i]);
-*/
        }
        return p - buf;
 }
 
 // need to import from icmp.c
 extern int icmpstate(struct conv *c, char *state, int n);
-extern char *icmpannounce(struct conv *c, char **argv, int argc);
+extern void icmpannounce(struct conv *c, char **argv, int argc);
 extern void icmpconnect(struct conv *c, char **argv, int argc);
 extern void icmpclose(struct conv *c);
 
-void icmp6newconv(struct Proto *icmp6, struct conv *conv)
-{
-       /* Fsprotoclone alloc'd our priv struct and attached it to conv already.
-        * Now we need to init it */
-       struct Icmpcb6 *icb = (struct Icmpcb6 *)conv->ptcl;
-       qlock_init(&icb->qlock);
-}
-
 void icmp6init(struct Fs *fs)
 {
        struct Proto *icmp6 = kzmalloc(sizeof(struct Proto), 0);
@@ -968,7 +944,6 @@ void icmp6init(struct Fs *fs)
        icmp6->stats = icmpstats6;
        icmp6->ctl = icmpctl6;
        icmp6->advise = icmpadvise6;
-       icmp6->newconv = icmp6newconv;
        icmp6->gc = NULL;
        icmp6->ipproto = ICMPv6;
        icmp6->nc = 16;