diff options
-rw-r--r-- | c/src/exec/libcsupport/include/sys/sockio.h | 7 | ||||
-rw-r--r-- | c/src/exec/libnetworking/net/if.c | 11 | ||||
-rw-r--r-- | c/src/exec/libnetworking/net/if.h | 4 | ||||
-rw-r--r-- | c/src/exec/libnetworking/net/if_ethersubr.c | 9 | ||||
-rw-r--r-- | c/src/lib/include/sys/sockio.h | 7 | ||||
-rw-r--r-- | c/src/lib/libnetworking/net/if.c | 11 | ||||
-rw-r--r-- | c/src/lib/libnetworking/net/if.h | 4 | ||||
-rw-r--r-- | c/src/lib/libnetworking/net/if_ethersubr.c | 9 | ||||
-rw-r--r-- | c/src/lib/libnetworking/sys/sockio.h | 7 | ||||
-rw-r--r-- | c/src/libnetworking/net/if.c | 11 | ||||
-rw-r--r-- | c/src/libnetworking/net/if.h | 4 | ||||
-rw-r--r-- | c/src/libnetworking/net/if_ethersubr.c | 9 | ||||
-rw-r--r-- | c/src/libnetworking/sys/sockio.h | 7 | ||||
-rw-r--r-- | cpukit/libcsupport/include/sys/sockio.h | 7 | ||||
-rw-r--r-- | cpukit/libnetworking/net/if.c | 11 | ||||
-rw-r--r-- | cpukit/libnetworking/net/if.h | 4 | ||||
-rw-r--r-- | cpukit/libnetworking/net/if_ethersubr.c | 9 |
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) { |