summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c/src/exec/libcsupport/include/sys/sockio.h7
-rw-r--r--c/src/exec/libnetworking/net/if.c11
-rw-r--r--c/src/exec/libnetworking/net/if.h4
-rw-r--r--c/src/exec/libnetworking/net/if_ethersubr.c9
-rw-r--r--c/src/lib/include/sys/sockio.h7
-rw-r--r--c/src/lib/libnetworking/net/if.c11
-rw-r--r--c/src/lib/libnetworking/net/if.h4
-rw-r--r--c/src/lib/libnetworking/net/if_ethersubr.c9
-rw-r--r--c/src/lib/libnetworking/sys/sockio.h7
-rw-r--r--c/src/libnetworking/net/if.c11
-rw-r--r--c/src/libnetworking/net/if.h4
-rw-r--r--c/src/libnetworking/net/if_ethersubr.c9
-rw-r--r--c/src/libnetworking/sys/sockio.h7
-rw-r--r--cpukit/libcsupport/include/sys/sockio.h7
-rw-r--r--cpukit/libnetworking/net/if.c11
-rw-r--r--cpukit/libnetworking/net/if.h4
-rw-r--r--cpukit/libnetworking/net/if_ethersubr.c9
17 files changed, 131 insertions, 0 deletions
diff --git a/c/src/exec/libcsupport/include/sys/sockio.h b/c/src/exec/libcsupport/include/sys/sockio.h
index 020061170f..03ec16e43a 100644
--- a/c/src/exec/libcsupport/include/sys/sockio.h
+++ b/c/src/exec/libcsupport/include/sys/sockio.h
@@ -83,4 +83,11 @@
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
+
+/*
+ * RTEMS additions for setting/getting `tap' function on incoming packets.
+ */
+#define SIOCSIFTAP _IOW('i', 80, struct ifreq) /* set tap function */
+#define SIOCGIFTAP _IOWR('i', 81, struct ifreq) /* get tap function */
+
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/c/src/exec/libnetworking/net/if.c b/c/src/exec/libnetworking/net/if.c
index af6f003de3..6f42b29903 100644
--- a/c/src/exec/libnetworking/net/if.c
+++ b/c/src/exec/libnetworking/net/if.c
@@ -664,6 +664,17 @@ ifioctl(so, cmd, data, p)
}
#endif
+
+ /*
+ * RTEMS additions for setting/getting `tap' function
+ */
+ case SIOCSIFTAP:
+ ifp->if_tap = ifr->ifr_tap;
+ return 0;
+
+ case SIOCGIFTAP:
+ ifr->ifr_tap = ifp->if_tap;
+ return 0;
}
return (0);
}
diff --git a/c/src/exec/libnetworking/net/if.h b/c/src/exec/libnetworking/net/if.h
index acddd4f095..16785d7626 100644
--- a/c/src/exec/libnetworking/net/if.h
+++ b/c/src/exec/libnetworking/net/if.h
@@ -162,6 +162,8 @@ struct ifnet {
__P((struct ifnet *, struct mbuf *));
void (*if_init) /* Init routine */
__P((void *));
+ int (*if_tap) /* Packet filter routine */
+ (struct ifnet *, struct ether_header *, struct mbuf *);
struct ifqueue if_snd; /* output queue */
struct ifqueue *if_poll_slowq; /* input queue for slow devices */
};
@@ -369,6 +371,7 @@ struct ifreq {
int ifru_phys;
int ifru_media;
caddr_t ifru_data;
+ int (*ifru_tap)(struct ifnet *, struct ether_header *, struct mbuf *);
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -379,6 +382,7 @@ struct ifreq {
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
#define ifr_media ifr_ifru.ifru_media /* physical media */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
+#define ifr_tap ifr_ifru.ifru_tap /* tap function */
};
struct ifaliasreq {
diff --git a/c/src/exec/libnetworking/net/if_ethersubr.c b/c/src/exec/libnetworking/net/if_ethersubr.c
index 4d1675ca3c..2a6446ebb6 100644
--- a/c/src/exec/libnetworking/net/if_ethersubr.c
+++ b/c/src/exec/libnetworking/net/if_ethersubr.c
@@ -483,6 +483,15 @@ ether_input(ifp, eh, m)
if (m->m_flags & (M_BCAST|M_MCAST))
ifp->if_imcasts++;
+ /*
+ * RTEMS addition -- allow application to `tap into'
+ * the incoming packet stream.
+ */
+ if (ifp->if_tap && (*ifp->if_tap)(ifp, eh, m)) {
+ m_freem(m);
+ return;
+ }
+
ether_type = ntohs(eh->ether_type);
switch (ether_type) {
diff --git a/c/src/lib/include/sys/sockio.h b/c/src/lib/include/sys/sockio.h
index 020061170f..03ec16e43a 100644
--- a/c/src/lib/include/sys/sockio.h
+++ b/c/src/lib/include/sys/sockio.h
@@ -83,4 +83,11 @@
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
+
+/*
+ * RTEMS additions for setting/getting `tap' function on incoming packets.
+ */
+#define SIOCSIFTAP _IOW('i', 80, struct ifreq) /* set tap function */
+#define SIOCGIFTAP _IOWR('i', 81, struct ifreq) /* get tap function */
+
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/c/src/lib/libnetworking/net/if.c b/c/src/lib/libnetworking/net/if.c
index af6f003de3..6f42b29903 100644
--- a/c/src/lib/libnetworking/net/if.c
+++ b/c/src/lib/libnetworking/net/if.c
@@ -664,6 +664,17 @@ ifioctl(so, cmd, data, p)
}
#endif
+
+ /*
+ * RTEMS additions for setting/getting `tap' function
+ */
+ case SIOCSIFTAP:
+ ifp->if_tap = ifr->ifr_tap;
+ return 0;
+
+ case SIOCGIFTAP:
+ ifr->ifr_tap = ifp->if_tap;
+ return 0;
}
return (0);
}
diff --git a/c/src/lib/libnetworking/net/if.h b/c/src/lib/libnetworking/net/if.h
index acddd4f095..16785d7626 100644
--- a/c/src/lib/libnetworking/net/if.h
+++ b/c/src/lib/libnetworking/net/if.h
@@ -162,6 +162,8 @@ struct ifnet {
__P((struct ifnet *, struct mbuf *));
void (*if_init) /* Init routine */
__P((void *));
+ int (*if_tap) /* Packet filter routine */
+ (struct ifnet *, struct ether_header *, struct mbuf *);
struct ifqueue if_snd; /* output queue */
struct ifqueue *if_poll_slowq; /* input queue for slow devices */
};
@@ -369,6 +371,7 @@ struct ifreq {
int ifru_phys;
int ifru_media;
caddr_t ifru_data;
+ int (*ifru_tap)(struct ifnet *, struct ether_header *, struct mbuf *);
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -379,6 +382,7 @@ struct ifreq {
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
#define ifr_media ifr_ifru.ifru_media /* physical media */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
+#define ifr_tap ifr_ifru.ifru_tap /* tap function */
};
struct ifaliasreq {
diff --git a/c/src/lib/libnetworking/net/if_ethersubr.c b/c/src/lib/libnetworking/net/if_ethersubr.c
index 4d1675ca3c..2a6446ebb6 100644
--- a/c/src/lib/libnetworking/net/if_ethersubr.c
+++ b/c/src/lib/libnetworking/net/if_ethersubr.c
@@ -483,6 +483,15 @@ ether_input(ifp, eh, m)
if (m->m_flags & (M_BCAST|M_MCAST))
ifp->if_imcasts++;
+ /*
+ * RTEMS addition -- allow application to `tap into'
+ * the incoming packet stream.
+ */
+ if (ifp->if_tap && (*ifp->if_tap)(ifp, eh, m)) {
+ m_freem(m);
+ return;
+ }
+
ether_type = ntohs(eh->ether_type);
switch (ether_type) {
diff --git a/c/src/lib/libnetworking/sys/sockio.h b/c/src/lib/libnetworking/sys/sockio.h
index 020061170f..03ec16e43a 100644
--- a/c/src/lib/libnetworking/sys/sockio.h
+++ b/c/src/lib/libnetworking/sys/sockio.h
@@ -83,4 +83,11 @@
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
+
+/*
+ * RTEMS additions for setting/getting `tap' function on incoming packets.
+ */
+#define SIOCSIFTAP _IOW('i', 80, struct ifreq) /* set tap function */
+#define SIOCGIFTAP _IOWR('i', 81, struct ifreq) /* get tap function */
+
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/c/src/libnetworking/net/if.c b/c/src/libnetworking/net/if.c
index af6f003de3..6f42b29903 100644
--- a/c/src/libnetworking/net/if.c
+++ b/c/src/libnetworking/net/if.c
@@ -664,6 +664,17 @@ ifioctl(so, cmd, data, p)
}
#endif
+
+ /*
+ * RTEMS additions for setting/getting `tap' function
+ */
+ case SIOCSIFTAP:
+ ifp->if_tap = ifr->ifr_tap;
+ return 0;
+
+ case SIOCGIFTAP:
+ ifr->ifr_tap = ifp->if_tap;
+ return 0;
}
return (0);
}
diff --git a/c/src/libnetworking/net/if.h b/c/src/libnetworking/net/if.h
index acddd4f095..16785d7626 100644
--- a/c/src/libnetworking/net/if.h
+++ b/c/src/libnetworking/net/if.h
@@ -162,6 +162,8 @@ struct ifnet {
__P((struct ifnet *, struct mbuf *));
void (*if_init) /* Init routine */
__P((void *));
+ int (*if_tap) /* Packet filter routine */
+ (struct ifnet *, struct ether_header *, struct mbuf *);
struct ifqueue if_snd; /* output queue */
struct ifqueue *if_poll_slowq; /* input queue for slow devices */
};
@@ -369,6 +371,7 @@ struct ifreq {
int ifru_phys;
int ifru_media;
caddr_t ifru_data;
+ int (*ifru_tap)(struct ifnet *, struct ether_header *, struct mbuf *);
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -379,6 +382,7 @@ struct ifreq {
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
#define ifr_media ifr_ifru.ifru_media /* physical media */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
+#define ifr_tap ifr_ifru.ifru_tap /* tap function */
};
struct ifaliasreq {
diff --git a/c/src/libnetworking/net/if_ethersubr.c b/c/src/libnetworking/net/if_ethersubr.c
index 4d1675ca3c..2a6446ebb6 100644
--- a/c/src/libnetworking/net/if_ethersubr.c
+++ b/c/src/libnetworking/net/if_ethersubr.c
@@ -483,6 +483,15 @@ ether_input(ifp, eh, m)
if (m->m_flags & (M_BCAST|M_MCAST))
ifp->if_imcasts++;
+ /*
+ * RTEMS addition -- allow application to `tap into'
+ * the incoming packet stream.
+ */
+ if (ifp->if_tap && (*ifp->if_tap)(ifp, eh, m)) {
+ m_freem(m);
+ return;
+ }
+
ether_type = ntohs(eh->ether_type);
switch (ether_type) {
diff --git a/c/src/libnetworking/sys/sockio.h b/c/src/libnetworking/sys/sockio.h
index 020061170f..03ec16e43a 100644
--- a/c/src/libnetworking/sys/sockio.h
+++ b/c/src/libnetworking/sys/sockio.h
@@ -83,4 +83,11 @@
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
+
+/*
+ * RTEMS additions for setting/getting `tap' function on incoming packets.
+ */
+#define SIOCSIFTAP _IOW('i', 80, struct ifreq) /* set tap function */
+#define SIOCGIFTAP _IOWR('i', 81, struct ifreq) /* get tap function */
+
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/cpukit/libcsupport/include/sys/sockio.h b/cpukit/libcsupport/include/sys/sockio.h
index 020061170f..03ec16e43a 100644
--- a/cpukit/libcsupport/include/sys/sockio.h
+++ b/cpukit/libcsupport/include/sys/sockio.h
@@ -83,4 +83,11 @@
#define SIOCSIFMEDIA _IOWR('i', 55, struct ifreq) /* set net media */
#define SIOCGIFMEDIA _IOWR('i', 56, struct ifmediareq) /* get net media */
+
+/*
+ * RTEMS additions for setting/getting `tap' function on incoming packets.
+ */
+#define SIOCSIFTAP _IOW('i', 80, struct ifreq) /* set tap function */
+#define SIOCGIFTAP _IOWR('i', 81, struct ifreq) /* get tap function */
+
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/cpukit/libnetworking/net/if.c b/cpukit/libnetworking/net/if.c
index af6f003de3..6f42b29903 100644
--- a/cpukit/libnetworking/net/if.c
+++ b/cpukit/libnetworking/net/if.c
@@ -664,6 +664,17 @@ ifioctl(so, cmd, data, p)
}
#endif
+
+ /*
+ * RTEMS additions for setting/getting `tap' function
+ */
+ case SIOCSIFTAP:
+ ifp->if_tap = ifr->ifr_tap;
+ return 0;
+
+ case SIOCGIFTAP:
+ ifr->ifr_tap = ifp->if_tap;
+ return 0;
}
return (0);
}
diff --git a/cpukit/libnetworking/net/if.h b/cpukit/libnetworking/net/if.h
index acddd4f095..16785d7626 100644
--- a/cpukit/libnetworking/net/if.h
+++ b/cpukit/libnetworking/net/if.h
@@ -162,6 +162,8 @@ struct ifnet {
__P((struct ifnet *, struct mbuf *));
void (*if_init) /* Init routine */
__P((void *));
+ int (*if_tap) /* Packet filter routine */
+ (struct ifnet *, struct ether_header *, struct mbuf *);
struct ifqueue if_snd; /* output queue */
struct ifqueue *if_poll_slowq; /* input queue for slow devices */
};
@@ -369,6 +371,7 @@ struct ifreq {
int ifru_phys;
int ifru_media;
caddr_t ifru_data;
+ int (*ifru_tap)(struct ifnet *, struct ether_header *, struct mbuf *);
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -379,6 +382,7 @@ struct ifreq {
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
#define ifr_media ifr_ifru.ifru_media /* physical media */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
+#define ifr_tap ifr_ifru.ifru_tap /* tap function */
};
struct ifaliasreq {
diff --git a/cpukit/libnetworking/net/if_ethersubr.c b/cpukit/libnetworking/net/if_ethersubr.c
index 4d1675ca3c..2a6446ebb6 100644
--- a/cpukit/libnetworking/net/if_ethersubr.c
+++ b/cpukit/libnetworking/net/if_ethersubr.c
@@ -483,6 +483,15 @@ ether_input(ifp, eh, m)
if (m->m_flags & (M_BCAST|M_MCAST))
ifp->if_imcasts++;
+ /*
+ * RTEMS addition -- allow application to `tap into'
+ * the incoming packet stream.
+ */
+ if (ifp->if_tap && (*ifp->if_tap)(ifp, eh, m)) {
+ m_freem(m);
+ return;
+ }
+
ether_type = ntohs(eh->ether_type);
switch (ether_type) {