diff options
author | glebius <glebius@FreeBSD.org> | 2006-05-16 11:15:22 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2006-05-16 11:15:22 +0000 |
commit | 7a372541349967b87a6e7aad8eeeb311706caedc (patch) | |
tree | ce77874d5dbfa2c8aae4e83ace565e9617a5258c | |
parent | 7840c3c3e096cd9dccdd40980840f31270536639 (diff) | |
download | FreeBSD-src-7a372541349967b87a6e7aad8eeeb311706caedc.zip FreeBSD-src-7a372541349967b87a6e7aad8eeeb311706caedc.tar.gz |
Since m_pullup() can return a new mbuf, change gre_input2() to
return mbuf back to gre_input(). If the former returns mbuf back
to the latter, then pass it to raw_input().
Coverity ID: 829
-rw-r--r-- | sys/netinet/ip_gre.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/sys/netinet/ip_gre.c b/sys/netinet/ip_gre.c index 0faf84e..874df7c 100644 --- a/sys/netinet/ip_gre.c +++ b/sys/netinet/ip_gre.c @@ -95,7 +95,7 @@ void gre_inet_ntoa(struct in_addr in); /* XXX */ static struct gre_softc *gre_lookup(struct mbuf *, u_int8_t); -static int gre_input2(struct mbuf *, int, u_char); +static struct mbuf *gre_input2(struct mbuf *, int, u_char); /* * De-encapsulate a packet and feed it back through ip input (this @@ -106,29 +106,27 @@ static int gre_input2(struct mbuf *, int, u_char); void gre_input(struct mbuf *m, int off) { - int ret, proto; + int proto; proto = (mtod(m, struct ip *))->ip_p; - ret = gre_input2(m, off, proto); + m = gre_input2(m, off, proto); + /* - * ret == 0 : packet not processed, meaning that - * no matching tunnel that is up is found. - * we inject it to raw ip socket to see if anyone picks it up. + * If no matching tunnel that is up is found. We inject + * the mbuf to raw ip socket to see if anyone picks it up. */ - if (ret == 0) + if (m != NULL) rip_input(m, off); } /* - * decapsulate. - * Does the real work and is called from gre_input() (above) - * returns 0 if packet is not yet processed - * and 1 if it needs no further processing - * proto is the protocol number of the "calling" foo_input() - * routine. + * Decapsulate. Does the real work and is called from gre_input() + * (above). Returns an mbuf back if packet is not yet processed, + * and NULL if it needs no further processing. proto is the protocol + * number of the "calling" foo_input() routine. */ -static int +static struct mbuf * gre_input2(struct mbuf *m ,int hlen, u_char proto) { struct greip *gip; @@ -139,13 +137,13 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto) if ((sc = gre_lookup(m, proto)) == NULL) { /* No matching tunnel or tunnel is down. */ - return (0); + return (m); } if (m->m_len < sizeof(*gip)) { m = m_pullup(m, sizeof(*gip)); if (m == NULL) - return (ENOBUFS); + return (NULL); } gip = mtod(m, struct greip *); @@ -164,7 +162,7 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto) hlen += 4; /* We don't support routing fields (variable length) */ if (flags & GRE_RP) - return (0); + return (m); if (flags & GRE_KP) hlen += 4; if (flags & GRE_SP) @@ -191,18 +189,19 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto) af = AF_APPLETALK; break; #endif - default: /* others not yet supported */ - return (0); + default: + /* Others not yet supported. */ + return (m); } break; default: - /* others not yet supported */ - return (0); + /* Others not yet supported. */ + return (m); } if (hlen > m->m_pkthdr.len) { m_freem(m); - return (EINVAL); + return (NULL); } /* Unlike NetBSD, in FreeBSD m_adj() adjusts m->m_pkthdr.len as well */ m_adj(m, hlen); @@ -215,7 +214,8 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto) netisr_dispatch(isr, m); - return (1); /* packet is done, no further processing needed */ + /* Packet is done, no further processing needed. */ + return (NULL); } /* |