summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2006-05-16 11:15:22 +0000
committerglebius <glebius@FreeBSD.org>2006-05-16 11:15:22 +0000
commit7a372541349967b87a6e7aad8eeeb311706caedc (patch)
treece77874d5dbfa2c8aae4e83ace565e9617a5258c /sys/netinet
parent7840c3c3e096cd9dccdd40980840f31270536639 (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_gre.c46
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);
}
/*
OpenPOWER on IntegriCloud