Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if_gre.c
Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
#include <net/ethernet.h> | #include <net/ethernet.h> | ||||
#include <net/if.h> | #include <net/if.h> | ||||
#include <net/if_var.h> | #include <net/if_var.h> | ||||
#include <net/if_clone.h> | #include <net/if_clone.h> | ||||
#include <net/if_types.h> | #include <net/if_types.h> | ||||
#include <net/netisr.h> | #include <net/netisr.h> | ||||
#include <net/vnet.h> | #include <net/vnet.h> | ||||
#include <net/route.h> | |||||
#include <netinet/in.h> | #include <netinet/in.h> | ||||
#ifdef INET | #ifdef INET | ||||
#include <netinet/in_systm.h> | #include <netinet/in_systm.h> | ||||
#include <netinet/in_var.h> | #include <netinet/in_var.h> | ||||
#include <netinet/ip.h> | #include <netinet/ip.h> | ||||
#include <netinet/ip_var.h> | #include <netinet/ip_var.h> | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 361 Lines • ▼ Show 20 Lines | case SIOCGIFPDSTADDR_IN6: | ||||
(struct sockaddr *)sin6); | (struct sockaddr *)sin6); | ||||
if (error == 0) | if (error == 0) | ||||
error = sa6_recoverscope(sin6); | error = sa6_recoverscope(sin6); | ||||
if (error != 0) | if (error != 0) | ||||
memset(sin6, 0, sizeof(*sin6)); | memset(sin6, 0, sizeof(*sin6)); | ||||
#endif | #endif | ||||
} | } | ||||
break; | break; | ||||
case SIOCGTUNFIB: | |||||
ifr->ifr_fib = sc->gre_fibnum; | |||||
break; | |||||
case SIOCSTUNFIB: | |||||
if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) | |||||
break; | |||||
if (ifr->ifr_fib >= rt_numfibs) | |||||
error = EINVAL; | |||||
else | |||||
sc->gre_fibnum = ifr->ifr_fib; | |||||
break; | |||||
case GRESKEY: | case GRESKEY: | ||||
if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) | if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) | ||||
break; | break; | ||||
if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) | if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) | ||||
break; | break; | ||||
if (sc->gre_key != opt) { | if (sc->gre_key != opt) { | ||||
GRE_WLOCK(sc); | GRE_WLOCK(sc); | ||||
sc->gre_key = opt; | sc->gre_key = opt; | ||||
gre_updatehdr(sc); | gre_updatehdr(sc); | ||||
GRE_WUNLOCK(sc); | GRE_WUNLOCK(sc); | ||||
} | } | ||||
break; | break; | ||||
case GREGKEY: | case GREGKEY: | ||||
error = copyout(&sc->gre_key, ifr->ifr_data, sizeof(sc->gre_key)); | error = copyout(&sc->gre_key, ifr->ifr_data, | ||||
sizeof(sc->gre_key)); | |||||
break; | break; | ||||
case GRESOPTS: | case GRESOPTS: | ||||
if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) | if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) | ||||
break; | break; | ||||
if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) | if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) | ||||
break; | break; | ||||
if (opt & ~GRE_OPTMASK) | if (opt & ~GRE_OPTMASK) | ||||
error = EINVAL; | error = EINVAL; | ||||
▲ Show 20 Lines • Show All 254 Lines • ▼ Show 20 Lines | case ETHERTYPE_IPV6: | ||||
af = AF_INET6; | af = AF_INET6; | ||||
break; | break; | ||||
default: | default: | ||||
goto drop; | goto drop; | ||||
} | } | ||||
m_adj(m, *offp + hlen); | m_adj(m, *offp + hlen); | ||||
m_clrprotoflags(m); | m_clrprotoflags(m); | ||||
m->m_pkthdr.rcvif = ifp; | m->m_pkthdr.rcvif = ifp; | ||||
M_SETFIB(m, sc->gre_fibnum); | M_SETFIB(m, ifp->if_fib); | ||||
#ifdef MAC | #ifdef MAC | ||||
mac_ifnet_create_mbuf(ifp, m); | mac_ifnet_create_mbuf(ifp, m); | ||||
#endif | #endif | ||||
BPF_MTAP2(ifp, &af, sizeof(af), m); | BPF_MTAP2(ifp, &af, sizeof(af), m); | ||||
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); | if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); | ||||
if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len); | if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len); | ||||
if ((ifp->if_flags & IFF_MONITOR) != 0) | if ((ifp->if_flags & IFF_MONITOR) != 0) | ||||
m_freem(m); | m_freem(m); | ||||
▲ Show 20 Lines • Show All 225 Lines • Show Last 20 Lines |