mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-14 13:15:21 +08:00
Update to FreeBSD head 2016-08-23
Git mirror commit 9fe7c416e6abb28b1398fd3e5687099846800cfd.
This commit is contained in:
@@ -47,10 +47,12 @@
|
||||
#include <sys/sockio.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_clone.h>
|
||||
#include <net/if_types.h>
|
||||
#include <net/route.h>
|
||||
#include <net/bpf.h>
|
||||
#include <net/vnet.h>
|
||||
|
||||
#include <rtems/bsd/local/opt_inet.h>
|
||||
#include <rtems/bsd/local/opt_inet6.h>
|
||||
@@ -61,22 +63,21 @@
|
||||
#define DSMTU 65532
|
||||
#endif
|
||||
|
||||
#define DISCNAME "disc"
|
||||
|
||||
struct disc_softc {
|
||||
struct ifnet *sc_ifp;
|
||||
};
|
||||
|
||||
static int discoutput(struct ifnet *, struct mbuf *,
|
||||
struct sockaddr *, struct route *);
|
||||
static void discrtrequest(int, struct rtentry *, struct rt_addrinfo *);
|
||||
const struct sockaddr *, struct route *);
|
||||
static int discioctl(struct ifnet *, u_long, caddr_t);
|
||||
static int disc_clone_create(struct if_clone *, int, caddr_t);
|
||||
static void disc_clone_destroy(struct ifnet *);
|
||||
|
||||
static MALLOC_DEFINE(M_DISC, DISCNAME, "Discard interface");
|
||||
static const char discname[] = "disc";
|
||||
static MALLOC_DEFINE(M_DISC, discname, "Discard interface");
|
||||
|
||||
IFC_SIMPLE_DECLARE(disc, 0);
|
||||
static VNET_DEFINE(struct if_clone *, disc_cloner);
|
||||
#define V_disc_cloner VNET(disc_cloner)
|
||||
|
||||
static int
|
||||
disc_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
@@ -92,7 +93,7 @@ disc_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
}
|
||||
|
||||
ifp->if_softc = sc;
|
||||
if_initname(ifp, ifc->ifc_name, unit);
|
||||
if_initname(ifp, discname, unit);
|
||||
ifp->if_mtu = DSMTU;
|
||||
/*
|
||||
* IFF_LOOPBACK should not be removed from disc's flags because
|
||||
@@ -131,16 +132,32 @@ disc_clone_destroy(struct ifnet *ifp)
|
||||
free(sc, M_DISC);
|
||||
}
|
||||
|
||||
static void
|
||||
vnet_disc_init(const void *unused __unused)
|
||||
{
|
||||
|
||||
V_disc_cloner = if_clone_simple(discname, disc_clone_create,
|
||||
disc_clone_destroy, 0);
|
||||
}
|
||||
VNET_SYSINIT(vnet_disc_init, SI_SUB_PSEUDO, SI_ORDER_ANY,
|
||||
vnet_disc_init, NULL);
|
||||
|
||||
static void
|
||||
vnet_disc_uninit(const void *unused __unused)
|
||||
{
|
||||
|
||||
if_clone_detach(V_disc_cloner);
|
||||
}
|
||||
VNET_SYSUNINIT(vnet_disc_uninit, SI_SUB_INIT_IF, SI_ORDER_ANY,
|
||||
vnet_disc_uninit, NULL);
|
||||
|
||||
static int
|
||||
disc_modevent(module_t mod, int type, void *data)
|
||||
{
|
||||
|
||||
switch (type) {
|
||||
case MOD_LOAD:
|
||||
if_clone_attach(&disc_cloner);
|
||||
break;
|
||||
case MOD_UNLOAD:
|
||||
if_clone_detach(&disc_cloner);
|
||||
break;
|
||||
default:
|
||||
return (EOPNOTSUPP);
|
||||
@@ -157,7 +174,7 @@ static moduledata_t disc_mod = {
|
||||
DECLARE_MODULE(if_disc, disc_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
|
||||
|
||||
static int
|
||||
discoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
|
||||
discoutput(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
struct route *ro)
|
||||
{
|
||||
u_int32_t af;
|
||||
@@ -165,62 +182,47 @@ discoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
|
||||
M_ASSERTPKTHDR(m);
|
||||
|
||||
/* BPF writes need to be handled specially. */
|
||||
if (dst->sa_family == AF_UNSPEC) {
|
||||
if (dst->sa_family == AF_UNSPEC)
|
||||
bcopy(dst->sa_data, &af, sizeof(af));
|
||||
dst->sa_family = af;
|
||||
}
|
||||
else
|
||||
af = dst->sa_family;
|
||||
|
||||
if (bpf_peers_present(ifp->if_bpf)) {
|
||||
u_int af = dst->sa_family;
|
||||
if (bpf_peers_present(ifp->if_bpf))
|
||||
bpf_mtap2(ifp->if_bpf, &af, sizeof(af), m);
|
||||
}
|
||||
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
ifp->if_opackets++;
|
||||
ifp->if_obytes += m->m_pkthdr.len;
|
||||
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
|
||||
if_inc_counter(ifp, IFCOUNTER_OBYTES, m->m_pkthdr.len);
|
||||
|
||||
m_freem(m);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
discrtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
|
||||
{
|
||||
RT_LOCK_ASSERT(rt);
|
||||
rt->rt_rmx.rmx_mtu = DSMTU;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process an ioctl request.
|
||||
*/
|
||||
static int
|
||||
discioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
{
|
||||
struct ifaddr *ifa;
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
int error = 0;
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
ifp->if_flags |= IFF_UP;
|
||||
ifa = (struct ifaddr *)data;
|
||||
if (ifa != 0)
|
||||
ifa->ifa_rtrequest = discrtrequest;
|
||||
|
||||
/*
|
||||
* Everything else is done at a higher level.
|
||||
*/
|
||||
break;
|
||||
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
if (ifr == 0) {
|
||||
if (ifr == NULL) {
|
||||
error = EAFNOSUPPORT; /* XXX */
|
||||
break;
|
||||
}
|
||||
switch (ifr->ifr_addr.sa_family) {
|
||||
|
||||
#ifdef INET
|
||||
case AF_INET:
|
||||
break;
|
||||
@@ -229,17 +231,14 @@ discioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
case AF_INET6:
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
error = EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SIOCSIFMTU:
|
||||
ifp->if_mtu = ifr->ifr_mtu;
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user