- Merge changes to the base system to support OFED. These include

a wider arg2 for sysctl, updates to vlan code, IFT_INFINIBAND,
   and other miscellaneous small features.
This commit is contained in:
Jeff Roberson 2011-03-21 09:40:01 +00:00
parent 0b626a289e
commit e4cd31dd3c
34 changed files with 766 additions and 192 deletions

View File

@ -69,73 +69,59 @@ extern "C" {
#if defined(__GNUCLIKE_ASM) && defined(__GNUCLIKE_BUILTIN_CONSTANT_P)
#define __byte_swap_int_var(x) \
__extension__ ({ register __uint32_t __X = (x); \
__asm ("bswap %0" : "+r" (__X)); \
__X; })
#define __bswap64_const(_x) \
(((_x) >> 56) | \
(((_x) >> 40) & (0xffUL << 8)) | \
(((_x) >> 24) & (0xffUL << 16)) | \
(((_x) >> 8) & (0xffUL << 24)) | \
(((_x) << 8) & (0xffUL << 32)) | \
(((_x) << 24) & (0xffUL << 40)) | \
(((_x) << 40) & (0xffUL << 48)) | \
((_x) << 56))
#ifdef __OPTIMIZE__
#define __bswap32_const(_x) \
(((_x) >> 24) | \
(((_x) & (0xff << 16)) >> 8) | \
(((_x) & (0xff << 8)) << 8) | \
((_x) << 24))
#define __byte_swap_int_const(x) \
((((x) & 0xff000000) >> 24) | \
(((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | \
(((x) & 0x000000ff) << 24))
#define __byte_swap_int(x) (__builtin_constant_p(x) ? \
__byte_swap_int_const(x) : __byte_swap_int_var(x))
#else /* __OPTIMIZE__ */
#define __byte_swap_int(x) __byte_swap_int_var(x)
#endif /* __OPTIMIZE__ */
#define __byte_swap_long_var(x) \
__extension__ ({ register __uint64_t __X = (x); \
__asm ("bswap %0" : "+r" (__X)); \
__X; })
#ifdef __OPTIMIZE__
#define __byte_swap_long_const(x) \
(((x >> 56) | \
((x >> 40) & 0xff00) | \
((x >> 24) & 0xff0000) | \
((x >> 8) & 0xff000000) | \
((x << 8) & (0xfful << 32)) | \
((x << 24) & (0xfful << 40)) | \
((x << 40) & (0xfful << 48)) | \
((x << 56))))
#define __byte_swap_long(x) (__builtin_constant_p(x) ? \
__byte_swap_long_const(x) : __byte_swap_long_var(x))
#else /* __OPTIMIZE__ */
#define __byte_swap_long(x) __byte_swap_long_var(x)
#endif /* __OPTIMIZE__ */
#define __bswap16_const(_x) (__uint16_t)((_x) << 8 | (_x) >> 8)
static __inline __uint64_t
__bswap64(__uint64_t _x)
__bswap64_var(__uint64_t _x)
{
return (__byte_swap_long(_x));
__asm ("bswap %0" : "+r" (_x));
return (_x);
}
static __inline __uint32_t
__bswap32(__uint32_t _x)
__bswap32_var(__uint32_t _x)
{
return (__byte_swap_int(_x));
__asm ("bswap %0" : "+r" (_x));
return (_x);
}
static __inline __uint16_t
__bswap16(__uint16_t _x)
__bswap16_var(__uint16_t _x)
{
return (_x << 8 | _x >> 8);
return (__bswap16_const(_x));
}
#define __bswap64(_x) \
(__builtin_constant_p(_x) ? \
__bswap64_const((__uint64_t)(_x)) : __bswap64_var(_x))
#define __bswap32(_x) \
(__builtin_constant_p(_x) ? \
__bswap32_const((__uint32_t)(_x)) : __bswap32_var(_x))
#define __bswap16(_x) \
(__builtin_constant_p(_x) ? \
__bswap16_const((__uint16_t)(_x)) : __bswap16_var(_x))
#define __htonl(x) __bswap32(x)
#define __htons(x) __bswap16(x)
#define __ntohl(x) __bswap32(x)

View File

@ -2791,6 +2791,281 @@ nlm/nlm_prot_server.c optional nfslockd | nfsd
nlm/nlm_prot_svc.c optional nfslockd | nfsd
nlm/nlm_prot_xdr.c optional nfslockd | nfsd
nlm/sm_inter_xdr.c optional nfslockd | nfsd
# OpenFabrics Enterprise Distribution (Infiniband)
ofed/include/linux/linux_compat.c optional ofed \
no-depend compile-with "${OFED_C}"
ofed/include/linux/linux_idr.c optional ofed \
no-depend compile-with "${OFED_C}"
ofed/include/linux/linux_radix.c optional ofed \
no-depend compile-with "${OFED_C}"
ofed/drivers/infiniband/core/addr.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/agent.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/cache.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
# XXX Mad.c must be ordered before cm.c for sysinit sets to occur in
# the correct order.
ofed/drivers/infiniband/core/mad.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/cm.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/cma.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/device.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/fmr_pool.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/iwcm.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/local_sa.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/mad_rmpp.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/multicast.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/notice.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/packer.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/sa_query.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/smi.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/sysfs.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/ucm.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/ucma.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/ud_header.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/umem.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/user_mad.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/uverbs_cmd.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/uverbs_main.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/uverbs_marshall.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/core/verbs.c optional ofed \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/core/"
ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c optional ipoib \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
#ofed/drivers/infiniband/ulp/ipoib/ipoib_fs.c optional ipoib \
# no-depend \
# compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c optional ipoib \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c optional ipoib \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c optional ipoib \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
ofed/drivers/infiniband/ulp/ipoib/ipoib_verbs.c optional ipoib \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
#ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c optional ipoib \
# no-depend \
# compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
ofed/drivers/infiniband/ulp/sdp/sdp_bcopy.c optional sdp \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
ofed/drivers/infiniband/ulp/sdp/sdp_main.c optional sdp \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
ofed/drivers/infiniband/ulp/sdp/sdp_rx.c optional sdp \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
ofed/drivers/infiniband/ulp/sdp/sdp_cma.c optional sdp \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
ofed/drivers/infiniband/ulp/sdp/sdp_tx.c optional sdp \
no-depend \
compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
ofed/drivers/infiniband/hw/mlx4/ah.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/cq.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/doorbell.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/mad.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/main.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/mr.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/qp.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/srq.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/infiniband/hw/mlx4/wc.c optional mlx4ib \
no-depend obj-prefix "mlx4ib_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/"
ofed/drivers/net/mlx4/alloc.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/catas.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/cmd.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/cq.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/eq.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/fw.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/icm.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/intf.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/main.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/mcg.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/mr.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/pd.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/port.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/profile.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/qp.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/reset.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/sense.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/srq.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/xrcd.c optional mlx4ib | mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_cq.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_frag.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_main.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_netdev.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_port.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_resources.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_rx.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/net/mlx4/en_tx.c optional mlxen \
no-depend obj-prefix "mlx4_" \
compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/"
ofed/drivers/infiniband/hw/mthca/mthca_allocator.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_av.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_catas.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_cmd.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_cq.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_eq.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_mad.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_main.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_mcg.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_memfree.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_mr.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_pd.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_profile.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_provider.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_qp.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_reset.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_srq.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
ofed/drivers/infiniband/hw/mthca/mthca_uar.c optional mthca \
no-depend compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/mthca/"
# crypto support
opencrypto/cast.c optional crypto | ipsec
opencrypto/criov.c optional crypto

View File

@ -142,6 +142,14 @@ NORMAL_CTFCONVERT= [ -z "${CTFCONVERT}" -o -n "${NO_CTF}" ] || \
NORMAL_LINT= ${LINT} ${LINTFLAGS} ${CFLAGS:M-[DIU]*} ${.IMPSRC}
# Infiniband C flags. Correct include paths and omit errors that linux
# does not honor.
OFEDINCLUDES= -I$S/ofed/include/
OFEDNOERR= -Wno-cast-qual -Wno-pointer-arith -fms-extensions
OFEDCFLAGS= ${CFLAGS:N-I*} ${OFEDINCLUDES} ${CFLAGS:M-I*} ${OFEDNOERR}
OFED_C_NOIMP= ${CC} -c -o ${.TARGET} ${OFEDCFLAGS} ${WERROR} ${PROF}
OFED_C= ${OFED_C_NOIMP} ${.IMPSRC}
GEN_CFILES= $S/$M/$M/genassym.c ${MFILES:T:S/.m$/.c/}
SYSTEM_CFILES= config.c env.c hints.c vnode_if.c
SYSTEM_DEP= Makefile ${SYSTEM_OBJS}

View File

@ -862,3 +862,11 @@ X86BIOS
# Flattened device tree options
FDT opt_platform.h
FDT_DTB_STATIC opt_platform.h
# OFED Infiniband stack
OFED opt_ofed.h
OFED_DEBUG_INIT opt_ofed.h
SDP opt_ofed.h
SDP_DEBUG opt_ofed.h
IPOIB_DEBUG opt_ofed.h
IPOIB_CM opt_ofed.h

View File

@ -51,8 +51,8 @@ int hpt_rescan_all(void);
static char hptproc_buffer[256];
extern char DRIVER_VERSION[];
#define FORMAL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, int arg2, \
struct sysctl_req *req
#define FORMAL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, \
intptr_t arg2, struct sysctl_req *req
#define REAL_HANDLER_ARGS oidp, arg1, arg2, req
typedef struct sysctl_req HPT_GET_INFO;

View File

@ -69,50 +69,59 @@ extern "C" {
#if defined(__GNUCLIKE_ASM) && defined(__GNUCLIKE_BUILTIN_CONSTANT_P)
#define __byte_swap_int_var(x) \
__extension__ ({ register __uint32_t __X = (x); \
__asm ("bswap %0" : "+r" (__X)); \
__X; })
#define __bswap64_const(_x) \
(((_x) >> 56) | \
(((_x) >> 40) & (0xffULL << 8)) | \
(((_x) >> 24) & (0xffULL << 16)) | \
(((_x) >> 8) & (0xffULL << 24)) | \
(((_x) << 8) & (0xffULL << 32)) | \
(((_x) << 24) & (0xffULL << 40)) | \
(((_x) << 40) & (0xffULL << 48)) | \
((_x) << 56))
#ifdef __OPTIMIZE__
#define __bswap32_const(_x) \
(((_x) >> 24) | \
(((_x) & (0xff << 16)) >> 8) | \
(((_x) & (0xff << 8)) << 8) | \
((_x) << 24))
#define __byte_swap_int_const(x) \
((((x) & 0xff000000) >> 24) | \
(((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | \
(((x) & 0x000000ff) << 24))
#define __byte_swap_int(x) (__builtin_constant_p(x) ? \
__byte_swap_int_const(x) : __byte_swap_int_var(x))
#else /* __OPTIMIZE__ */
#define __byte_swap_int(x) __byte_swap_int_var(x)
#endif /* __OPTIMIZE__ */
#define __bswap16_const(_x) (__uint16_t)((_x) << 8 | (_x) >> 8)
static __inline __uint64_t
__bswap64(__uint64_t _x)
__bswap64_var(__uint64_t __x)
{
return ((_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) |
((_x >> 8) & 0xff000000) | ((_x << 8) & ((__uint64_t)0xff << 32)) |
((_x << 24) & ((__uint64_t)0xff << 40)) |
((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)));
return __bswap64_const(__x);
}
static __inline __uint32_t
__bswap32(__uint32_t _x)
__bswap32_var(__uint32_t _x)
{
return (__byte_swap_int(_x));
__asm ("bswap %0" : "+r" (_x));
return (_x);
}
static __inline __uint16_t
__bswap16(__uint16_t _x)
__bswap16_var(__uint16_t _x)
{
return (_x << 8 | _x >> 8);
return (__bswap16_const(_x));
}
#define __bswap64(_x) \
(__builtin_constant_p(_x) ? \
__bswap64_const((__uint64_t)(_x)) : __bswap64_var(_x))
#define __bswap32(_x) \
(__builtin_constant_p(_x) ? \
__bswap32_const((__uint32_t)(_x)) : __bswap32_var(_x))
#define __bswap16(_x) \
(__builtin_constant_p(_x) ? \
__bswap16_const((__uint16_t)(_x)) : __bswap16_var(_x))
#define __htonl(x) __bswap32(x)
#define __htons(x) __bswap16(x)
#define __ntohl(x) __bswap32(x)

View File

@ -74,6 +74,7 @@ struct intr_thread {
/* Interrupt thread flags kept in it_flags */
#define IT_DEAD 0x000001 /* Thread is waiting to exit. */
#define IT_WAIT 0x000002 /* Thread is waiting for completion. */
struct intr_entropy {
struct thread *td;
@ -735,6 +736,39 @@ intr_handler_source(void *cookie)
return (ie->ie_source);
}
/*
* Sleep until an ithread finishes executing an interrupt handler.
*
* XXX Doesn't currently handle interrupt filters or fast interrupt
* handlers. This is intended for compatibility with linux drivers
* only. Do not use in BSD code.
*/
void
_intr_drain(int irq)
{
struct mtx *mtx;
struct intr_event *ie;
struct intr_thread *ithd;
struct thread *td;
ie = intr_lookup(irq);
if (ie == NULL)
return;
if (ie->ie_thread == NULL)
return;
ithd = ie->ie_thread;
td = ithd->it_thread;
thread_lock(td);
mtx = td->td_lock;
if (!TD_AWAITING_INTR(td)) {
ithd->it_flags |= IT_WAIT;
msleep_spin(ithd, mtx, "isync", 0);
}
mtx_unlock_spin(mtx);
return;
}
#ifndef INTR_FILTER
int
intr_event_remove_handler(void *cookie)
@ -1271,6 +1305,7 @@ ithread_loop(void *arg)
struct intr_event *ie;
struct thread *td;
struct proc *p;
int wake;
td = curthread;
p = td->td_proc;
@ -1279,6 +1314,7 @@ ithread_loop(void *arg)
("%s: ithread and proc linkage out of sync", __func__));
ie = ithd->it_event;
ie->ie_count = 0;
wake = 0;
/*
* As long as we have interrupts outstanding, go through the
@ -1319,12 +1355,20 @@ ithread_loop(void *arg)
* set again, so we have to check it again.
*/
thread_lock(td);
if (!ithd->it_need && !(ithd->it_flags & IT_DEAD)) {
if (!ithd->it_need && !(ithd->it_flags & (IT_DEAD | IT_WAIT))) {
TD_SET_IWAIT(td);
ie->ie_count = 0;
mi_switch(SW_VOL | SWT_IWAIT, NULL);
}
if (ithd->it_flags & IT_WAIT) {
wake = 1;
ithd->it_flags &= ~IT_WAIT;
}
thread_unlock(td);
if (wake) {
wakeup(ithd);
wake = 0;
}
}
}
@ -1439,6 +1483,7 @@ ithread_loop(void *arg)
struct thread *td;
struct proc *p;
int priv;
int wake;
td = curthread;
p = td->td_proc;
@ -1449,6 +1494,7 @@ ithread_loop(void *arg)
("%s: ithread and proc linkage out of sync", __func__));
ie = ithd->it_event;
ie->ie_count = 0;
wake = 0;
/*
* As long as we have interrupts outstanding, go through the
@ -1492,12 +1538,20 @@ ithread_loop(void *arg)
* set again, so we have to check it again.
*/
thread_lock(td);
if (!ithd->it_need && !(ithd->it_flags & IT_DEAD)) {
if (!ithd->it_need && !(ithd->it_flags & (IT_DEAD | IT_WAIT))) {
TD_SET_IWAIT(td);
ie->ie_count = 0;
mi_switch(SW_VOL | SWT_IWAIT, NULL);
}
if (ithd->it_flags & IT_WAIT) {
wake = 1;
ithd->it_flags &= ~IT_WAIT;
}
thread_unlock(td);
if (wake) {
wakeup(ithd);
wake = 0;
}
}
}

View File

@ -4182,7 +4182,7 @@ sysctl_jail_param(SYSCTL_HANDLER_ARGS)
i = 0;
return (SYSCTL_OUT(req, &i, sizeof(i)));
case CTLTYPE_STRING:
snprintf(numbuf, sizeof(numbuf), "%d", arg2);
snprintf(numbuf, sizeof(numbuf), "%jd", (intmax_t)arg2);
return
(sysctl_handle_string(oidp, numbuf, sizeof(numbuf), req));
case CTLTYPE_STRUCT:

View File

@ -194,7 +194,7 @@ sx_sysinit(void *arg)
{
struct sx_args *sargs = arg;
sx_init(sargs->sa_sx, sargs->sa_desc);
sx_init_flags(sargs->sa_sx, sargs->sa_desc, sargs->sa_flags);
}
void

View File

@ -365,10 +365,31 @@ sysctl_remove_oid(struct sysctl_oid *oidp, int del, int recurse)
return (error);
}
int
sysctl_remove_name(struct sysctl_oid *parent, const char *name,
int del, int recurse)
{
struct sysctl_oid *p, *tmp;
int error;
error = ENOENT;
SYSCTL_XLOCK();
SLIST_FOREACH_SAFE(p, SYSCTL_CHILDREN(parent), oid_link, tmp) {
if (strcmp(p->oid_name, name) == 0) {
error = sysctl_remove_oid_locked(p, del, recurse);
break;
}
}
SYSCTL_XUNLOCK();
return (error);
}
static int
sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse)
{
struct sysctl_oid *p;
struct sysctl_oid *p, *tmp;
int error;
SYSCTL_ASSERT_XLOCKED();
@ -387,7 +408,8 @@ sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse)
*/
if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) {
if (oidp->oid_refcnt == 1) {
SLIST_FOREACH(p, SYSCTL_CHILDREN(oidp), oid_link) {
SLIST_FOREACH_SAFE(p,
SYSCTL_CHILDREN(oidp), oid_link, tmp) {
if (!recurse)
return (ENOTEMPTY);
error = sysctl_remove_oid_locked(p, del,
@ -428,14 +450,13 @@ sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse)
}
return (0);
}
/*
* Create new sysctls at run time.
* clist may point to a valid context initialized with sysctl_ctx_init().
*/
struct sysctl_oid *
sysctl_add_oid(struct sysctl_ctx_list *clist, struct sysctl_oid_list *parent,
int number, const char *name, int kind, void *arg1, int arg2,
int number, const char *name, int kind, void *arg1, intptr_t arg2,
int (*handler)(SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr)
{
struct sysctl_oid *oidp;
@ -479,6 +500,7 @@ sysctl_add_oid(struct sysctl_ctx_list *clist, struct sysctl_oid_list *parent,
SYSCTL_CHILDREN_SET(oidp, malloc(sizeof(struct sysctl_oid_list),
M_SYSCTLOID, M_WAITOK));
SLIST_INIT(SYSCTL_CHILDREN(oidp));
oidp->oid_arg2 = arg2;
} else {
oidp->oid_arg1 = arg1;
oidp->oid_arg2 = arg2;

View File

@ -1038,7 +1038,7 @@ devclass_driver_added(devclass_t dc, driver_t *driver)
* @param dc the devclass to edit
* @param driver the driver to register
*/
static int
int
devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp)
{
driverlink_t dl;
@ -1172,7 +1172,7 @@ devclass_driver_deleted(devclass_t busclass, devclass_t dc, driver_t *driver)
* @param dc the devclass to edit
* @param driver the driver to unregister
*/
static int
int
devclass_delete_driver(devclass_t busclass, driver_t *driver)
{
devclass_t dc = devclass_find(driver->name);

View File

@ -1881,6 +1881,11 @@ if_route(struct ifnet *ifp, int flag, int fam)
void (*vlan_link_state_p)(struct ifnet *); /* XXX: private from if_vlan */
void (*vlan_trunk_cap_p)(struct ifnet *); /* XXX: private from if_vlan */
struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
struct ifnet *(*vlan_devat_p)(struct ifnet *, uint16_t);
int (*vlan_tag_p)(struct ifnet *, uint16_t *);
int (*vlan_setcookie_p)(struct ifnet *, void *);
void *(*vlan_cookie_p)(struct ifnet *);
/*
* Handle a change in the interface link state. To avoid LORs
@ -1935,6 +1940,7 @@ do_link_state_change(void *arg, int pending)
if (log_link_state_change)
log(LOG_NOTICE, "%s: link state changed to %s\n", ifp->if_xname,
(link_state == LINK_STATE_UP) ? "UP" : "DOWN" );
EVENTHANDLER_INVOKE(ifnet_link_event, ifp, ifp->if_link_state);
CURVNET_RESTORE();
}

View File

@ -50,6 +50,7 @@ struct arphdr {
#define ARPHRD_ARCNET 7 /* arcnet hardware format */
#define ARPHRD_FRELAY 15 /* frame relay hardware format */
#define ARPHRD_IEEE1394 24 /* firewire hardware format */
#define ARPHRD_INFINIBAND 32 /* infiniband hardware format */
u_short ar_pro; /* format of protocol address */
u_char ar_hln; /* length of hardware address */
u_char ar_pln; /* length of protocol address */

View File

@ -30,6 +30,8 @@ __FBSDID("$FreeBSD$");
#ifndef _NET_IF_LLATBL_H_
#define _NET_IF_LLATBL_H_
#include "opt_ofed.h"
#include <sys/_rwlock.h>
#include <netinet/in.h>
@ -72,6 +74,9 @@ struct llentry {
union {
uint64_t mac_aligned;
uint16_t mac16[3];
#ifdef OFED
uint8_t mac8[20]; /* IB needs 20 bytes. */
#endif
} ll_addr;
/* XXX af-private? */

View File

@ -238,6 +238,7 @@
#define IFT_ATMVCIENDPT 0xc2 /* ATM VCI End Point */
#define IFT_OPTICALCHANNEL 0xc3 /* Optical Channel */
#define IFT_OPTICALTRANSPORT 0xc4 /* Optical Transport */
#define IFT_INFINIBAND 0xc7 /* Infiniband */
#define IFT_BRIDGE 0xd1 /* Transparent bridge interface */
#define IFT_STF 0xd7 /* 6to4 interface */

View File

@ -352,6 +352,9 @@ EVENTHANDLER_DECLARE(ifnet_arrival_event, ifnet_arrival_event_handler_t);
/* interface departure event */
typedef void (*ifnet_departure_event_handler_t)(void *, struct ifnet *);
EVENTHANDLER_DECLARE(ifnet_departure_event, ifnet_departure_event_handler_t);
/* Interface link state change event */
typedef void (*ifnet_link_event_handler_t)(void *, struct ifnet *, int);
EVENTHANDLER_DECLARE(ifnet_link_event, ifnet_link_event_handler_t);
/*
* interface groups

View File

@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sockio.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/sx.h>
#include <net/bpf.h>
#include <net/ethernet.h>
@ -90,13 +91,14 @@ struct ifvlantrunk {
};
struct vlan_mc_entry {
struct ether_addr mc_addr;
struct sockaddr_dl mc_addr;
SLIST_ENTRY(vlan_mc_entry) mc_entries;
};
struct ifvlan {
struct ifvlantrunk *ifv_trunk;
struct ifnet *ifv_ifp;
void *ifv_cookie;
#define TRUNK(ifv) ((ifv)->ifv_trunk)
#define PARENT(ifv) ((ifv)->ifv_trunk->parent)
int ifv_pflags; /* special flags we have set on parent */
@ -153,12 +155,12 @@ static eventhandler_tag iflladdr_tag;
* however on practice it does not. Probably this is because array
* is too big to fit into CPU cache.
*/
static struct mtx ifv_mtx;
#define VLAN_LOCK_INIT() mtx_init(&ifv_mtx, "vlan_global", NULL, MTX_DEF)
#define VLAN_LOCK_DESTROY() mtx_destroy(&ifv_mtx)
#define VLAN_LOCK_ASSERT() mtx_assert(&ifv_mtx, MA_OWNED)
#define VLAN_LOCK() mtx_lock(&ifv_mtx)
#define VLAN_UNLOCK() mtx_unlock(&ifv_mtx)
static struct sx ifv_lock;
#define VLAN_LOCK_INIT() sx_init(&ifv_lock, "vlan_global")
#define VLAN_LOCK_DESTROY() sx_destroy(&ifv_lock)
#define VLAN_LOCK_ASSERT() sx_assert(&ifv_lock, SA_LOCKED)
#define VLAN_LOCK() sx_xlock(&ifv_lock)
#define VLAN_UNLOCK() sx_xunlock(&ifv_lock)
#define TRUNK_LOCK_INIT(trunk) rw_init(&(trunk)->rw, VLANNAME)
#define TRUNK_LOCK_DESTROY(trunk) rw_destroy(&(trunk)->rw)
#define TRUNK_LOCK(trunk) rw_wlock(&(trunk)->rw)
@ -386,6 +388,47 @@ vlan_dumphash(struct ifvlantrunk *trunk)
}
}
#endif /* 0 */
#else
static __inline struct ifvlan *
vlan_gethash(struct ifvlantrunk *trunk, uint16_t tag)
{
return trunk->vlans[tag];
}
static __inline int
vlan_inshash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
{
if (trunk->vlans[ifv->ifv_tag] != NULL)
return EEXIST;
trunk->vlans[ifv->ifv_tag] = ifv;
trunk->refcnt++;
return (0);
}
static __inline int
vlan_remhash(struct ifvlantrunk *trunk, struct ifvlan *ifv)
{
trunk->vlans[ifv->ifv_tag] = NULL;
trunk->refcnt--;
return (0);
}
static __inline void
vlan_freehash(struct ifvlantrunk *trunk)
{
}
static __inline void
vlan_inithash(struct ifvlantrunk *trunk)
{
}
#endif /* !VLAN_ARRAY */
static void
@ -394,9 +437,7 @@ trunk_destroy(struct ifvlantrunk *trunk)
VLAN_LOCK_ASSERT();
TRUNK_LOCK(trunk);
#ifndef VLAN_ARRAY
vlan_freehash(trunk);
#endif
trunk->parent->if_vlantrunk = NULL;
TRUNK_UNLOCK(trunk);
TRUNK_LOCK_DESTROY(trunk);
@ -421,7 +462,6 @@ vlan_setmulti(struct ifnet *ifp)
struct ifmultiaddr *ifma, *rifma = NULL;
struct ifvlan *sc;
struct vlan_mc_entry *mc;
struct sockaddr_dl sdl;
int error;
/*VLAN_LOCK_ASSERT();*/
@ -432,17 +472,9 @@ vlan_setmulti(struct ifnet *ifp)
CURVNET_SET_QUIET(ifp_p->if_vnet);
bzero((char *)&sdl, sizeof(sdl));
sdl.sdl_len = sizeof(sdl);
sdl.sdl_family = AF_LINK;
sdl.sdl_index = ifp_p->if_index;
sdl.sdl_type = IFT_ETHER;
sdl.sdl_alen = ETHER_ADDR_LEN;
/* First, remove any existing filter entries. */
while ((mc = SLIST_FIRST(&sc->vlan_mc_listhead)) != NULL) {
bcopy((char *)&mc->mc_addr, LLADDR(&sdl), ETHER_ADDR_LEN);
error = if_delmulti(ifp_p, (struct sockaddr *)&sdl);
error = if_delmulti(ifp_p, (struct sockaddr *)&mc->mc_addr);
if (error)
return (error);
SLIST_REMOVE_HEAD(&sc->vlan_mc_listhead, mc_entries);
@ -456,12 +488,11 @@ vlan_setmulti(struct ifnet *ifp)
mc = malloc(sizeof(struct vlan_mc_entry), M_VLAN, M_NOWAIT);
if (mc == NULL)
return (ENOMEM);
bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
(char *)&mc->mc_addr, ETHER_ADDR_LEN);
bcopy(ifma->ifma_addr, &mc->mc_addr, ifma->ifma_addr->sa_len);
mc->mc_addr.sdl_index = ifp_p->if_index;
SLIST_INSERT_HEAD(&sc->vlan_mc_listhead, mc, mc_entries);
bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
LLADDR(&sdl), ETHER_ADDR_LEN);
error = if_addmulti(ifp_p, (struct sockaddr *)&sdl, &rifma);
error = if_addmulti(ifp_p, (struct sockaddr *)&mc->mc_addr,
&rifma);
if (error)
return (error);
}
@ -503,7 +534,8 @@ vlan_iflladdr(void *arg __unused, struct ifnet *ifp)
LIST_FOREACH_SAFE(ifv, &ifp->if_vlantrunk->hash[i], ifv_list, next) {
#endif /* VLAN_ARRAY */
VLAN_UNLOCK();
if_setlladdr(ifv->ifv_ifp, IF_LLADDR(ifp), ETHER_ADDR_LEN);
if_setlladdr(ifv->ifv_ifp, IF_LLADDR(ifp),
ifp->if_addrlen);
VLAN_LOCK();
}
VLAN_UNLOCK();
@ -563,6 +595,92 @@ vlan_ifdetach(void *arg __unused, struct ifnet *ifp)
VLAN_UNLOCK();
}
/*
* Return the trunk device for a virtual interface.
*/
static struct ifnet *
vlan_trunkdev(struct ifnet *ifp)
{
struct ifvlan *ifv;
if (ifp->if_type != IFT_L2VLAN)
return (NULL);
ifv = ifp->if_softc;
ifp = NULL;
VLAN_LOCK();
if (ifv->ifv_trunk)
ifp = PARENT(ifv);
VLAN_UNLOCK();
return (ifp);
}
/*
* Return the 16bit vlan tag for this interface.
*/
static int
vlan_tag(struct ifnet *ifp, uint16_t *tagp)
{
struct ifvlan *ifv;
if (ifp->if_type != IFT_L2VLAN)
return (EINVAL);
ifv = ifp->if_softc;
*tagp = ifv->ifv_tag;
return (0);
}
/*
* Return a driver specific cookie for this interface. Synchronization
* with setcookie must be provided by the driver.
*/
static void *
vlan_cookie(struct ifnet *ifp)
{
struct ifvlan *ifv;
if (ifp->if_type != IFT_L2VLAN)
return (NULL);
ifv = ifp->if_softc;
return (ifv->ifv_cookie);
}
/*
* Store a cookie in our softc that drivers can use to store driver
* private per-instance data in.
*/
static int
vlan_setcookie(struct ifnet *ifp, void *cookie)
{
struct ifvlan *ifv;
if (ifp->if_type != IFT_L2VLAN)
return (EINVAL);
ifv = ifp->if_softc;
ifv->ifv_cookie = cookie;
return (0);
}
/*
* Return the vlan device present at the specific tag.
*/
static struct ifnet *
vlan_devat(struct ifnet *ifp, uint16_t tag)
{
struct ifvlantrunk *trunk;
struct ifvlan *ifv;
trunk = ifp->if_vlantrunk;
if (trunk == NULL)
return (NULL);
ifp = NULL;
TRUNK_RLOCK(trunk);
ifv = vlan_gethash(trunk, tag);
if (ifv)
ifp = ifv->ifv_ifp;
TRUNK_RUNLOCK(trunk);
return (ifp);
}
/*
* VLAN support can be loaded as a module. The only place in the
* system that's intimately aware of this is ether_input. We hook
@ -593,6 +711,11 @@ vlan_modevent(module_t mod, int type, void *data)
vlan_input_p = vlan_input;
vlan_link_state_p = vlan_link_state;
vlan_trunk_cap_p = vlan_trunk_capabilities;
vlan_trunkdev_p = vlan_trunkdev;
vlan_cookie_p = vlan_cookie;
vlan_setcookie_p = vlan_setcookie;
vlan_tag_p = vlan_tag;
vlan_devat_p = vlan_devat;
#ifndef VIMAGE
if_clone_attach(&vlan_cloner);
#endif
@ -615,6 +738,11 @@ vlan_modevent(module_t mod, int type, void *data)
vlan_input_p = NULL;
vlan_link_state_p = NULL;
vlan_trunk_cap_p = NULL;
vlan_trunkdev_p = NULL;
vlan_tag_p = NULL;
vlan_cookie_p = vlan_cookie;
vlan_setcookie_p = vlan_setcookie;
vlan_devat_p = NULL;
VLAN_LOCK_DESTROY();
if (bootverbose)
printf("vlan: unloaded\n");
@ -665,7 +793,12 @@ vlan_clone_match_ethertag(struct if_clone *ifc, const char *name, int *tag)
/* Check for <etherif>.<vlan> style interface names. */
IFNET_RLOCK_NOSLEEP();
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
if (ifp->if_type != IFT_ETHER)
/*
* We can handle non-ethernet hardware types as long as
* they handle the tagging and headers themselves.
*/
if (ifp->if_type != IFT_ETHER &&
(ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0)
continue;
if (strncmp(ifp->if_xname, name, strlen(ifp->if_xname)) != 0)
continue;
@ -916,7 +1049,7 @@ vlan_start(struct ifnet *ifp)
* devices that just discard such runts instead or mishandle
* them somehow.
*/
if (soft_pad) {
if (soft_pad && p->if_type == IFT_ETHER) {
static char pad[8]; /* just zeros */
int n;
@ -1020,11 +1153,7 @@ vlan_input(struct ifnet *ifp, struct mbuf *m)
}
TRUNK_RLOCK(trunk);
#ifdef VLAN_ARRAY
ifv = trunk->vlans[tag];
#else
ifv = vlan_gethash(trunk, tag);
#endif
if (ifv == NULL || !UP_AND_RUNNING(ifv->ifv_ifp)) {
TRUNK_RUNLOCK(trunk);
m_freem(m);
@ -1050,7 +1179,8 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag)
/* VID numbers 0x0 and 0xFFF are reserved */
if (tag == 0 || tag == 0xFFF)
return (EINVAL);
if (p->if_type != IFT_ETHER)
if (p->if_type != IFT_ETHER &&
(p->if_capenable & IFCAP_VLAN_HWTAGGING) == 0)
return (EPROTONOSUPPORT);
if ((p->if_flags & VLAN_IFFLAGS) != VLAN_IFFLAGS)
return (EPROTONOSUPPORT);
@ -1060,15 +1190,11 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag)
if (p->if_vlantrunk == NULL) {
trunk = malloc(sizeof(struct ifvlantrunk),
M_VLAN, M_WAITOK | M_ZERO);
#ifndef VLAN_ARRAY
vlan_inithash(trunk);
#endif
VLAN_LOCK();
if (p->if_vlantrunk != NULL) {
/* A race that that is very unlikely to be hit. */
#ifndef VLAN_ARRAY
vlan_freehash(trunk);
#endif
free(trunk, M_VLAN);
goto exists;
}
@ -1084,18 +1210,9 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag)
}
ifv->ifv_tag = tag; /* must set this before vlan_inshash() */
#ifdef VLAN_ARRAY
if (trunk->vlans[tag] != NULL) {
error = EEXIST;
goto done;
}
trunk->vlans[tag] = ifv;
trunk->refcnt++;
#else
error = vlan_inshash(trunk, ifv);
if (error)
goto done;
#endif
ifv->ifv_proto = ETHERTYPE_VLAN;
ifv->ifv_encaplen = ETHER_VLAN_ENCAP_LEN;
ifv->ifv_mintu = ETHERMIN;
@ -1125,8 +1242,19 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag)
ifv->ifv_trunk = trunk;
ifp = ifv->ifv_ifp;
/*
* Initialize fields from our parent. This duplicates some
* work with ether_ifattach() but allows for non-ethernet
* interfaces to also work.
*/
ifp->if_mtu = p->if_mtu - ifv->ifv_mtufudge;
ifp->if_baudrate = p->if_baudrate;
ifp->if_output = p->if_output;
ifp->if_input = p->if_input;
ifp->if_resolvemulti = p->if_resolvemulti;
ifp->if_addrlen = p->if_addrlen;
ifp->if_broadcastaddr = p->if_broadcastaddr;
/*
* Copy only a selected subset of flags from the parent.
* Other flags are none of our business.
@ -1141,10 +1269,12 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag)
vlan_capabilities(ifv);
/*
* Set up our ``Ethernet address'' to reflect the underlying
* Set up our interface address to reflect the underlying
* physical interface's.
*/
bcopy(IF_LLADDR(p), IF_LLADDR(ifp), ETHER_ADDR_LEN);
bcopy(IF_LLADDR(p), IF_LLADDR(ifp), p->if_addrlen);
((struct sockaddr_dl *)ifp->if_addr->ifa_addr)->sdl_alen =
p->if_addrlen;
/*
* Configure multicast addresses that may already be
@ -1187,7 +1317,6 @@ vlan_unconfig_locked(struct ifnet *ifp)
parent = NULL;
if (trunk != NULL) {
struct sockaddr_dl sdl;
TRUNK_LOCK(trunk);
parent = trunk->parent;
@ -1197,17 +1326,7 @@ vlan_unconfig_locked(struct ifnet *ifp)
* empty the list of multicast groups that we may have joined
* while we were alive from the parent's list.
*/
bzero((char *)&sdl, sizeof(sdl));
sdl.sdl_len = sizeof(sdl);
sdl.sdl_family = AF_LINK;
sdl.sdl_index = parent->if_index;
sdl.sdl_type = IFT_ETHER;
sdl.sdl_alen = ETHER_ADDR_LEN;
while ((mc = SLIST_FIRST(&ifv->vlan_mc_listhead)) != NULL) {
bcopy((char *)&mc->mc_addr, LLADDR(&sdl),
ETHER_ADDR_LEN);
/*
* This may fail if the parent interface is
* being detached. Regardless, we should do a
@ -1215,18 +1334,14 @@ vlan_unconfig_locked(struct ifnet *ifp)
* as possible as all callers expect vlan
* destruction to succeed.
*/
(void)if_delmulti(parent, (struct sockaddr *)&sdl);
(void)if_delmulti(parent,
(struct sockaddr *)&mc->mc_addr);
SLIST_REMOVE_HEAD(&ifv->vlan_mc_listhead, mc_entries);
free(mc, M_VLAN);
}
vlan_setflags(ifp, 0); /* clear special flags on parent */
#ifdef VLAN_ARRAY
trunk->vlans[ifv->ifv_tag] = NULL;
trunk->refcnt--;
#else
vlan_remhash(trunk, ifv);
#endif
ifv->ifv_trunk = NULL;
/*
@ -1407,14 +1522,31 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
struct ifnet *p;
struct ifreq *ifr;
struct ifaddr *ifa;
struct ifvlan *ifv;
struct vlanreq vlr;
int error = 0;
ifr = (struct ifreq *)data;
ifa = (struct ifaddr *) data;
ifv = ifp->if_softc;
switch (cmd) {
case SIOCSIFADDR:
ifp->if_flags |= IFF_UP;
#ifdef INET
if (ifa->ifa_addr->sa_family == AF_INET)
arp_ifinit(ifp, ifa);
#endif
break;
case SIOCGIFADDR:
{
struct sockaddr *sa;
sa = (struct sockaddr *)&ifr->ifr_data;
bcopy(IF_LLADDR(ifp), sa->sa_data, ifp->if_addrlen);
}
break;
case SIOCGIFMEDIA:
VLAN_LOCK();
if (TRUNK(ifv) != NULL) {
@ -1534,7 +1666,8 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
default:
error = ether_ioctl(ifp, cmd, data);
error = EINVAL;
break;
}
return (error);

View File

@ -131,7 +131,25 @@ struct vlanreq {
(*vlan_trunk_cap_p)(_ifp); \
} while (0)
#define VLAN_TRUNKDEV(_ifp) \
(_ifp)->if_type == IFT_L2VLAN ? (*vlan_trunkdev_p)((_ifp)) : NULL
#define VLAN_TAG(_ifp, _tag) \
(_ifp)->if_type == IFT_L2VLAN ? (*vlan_tag_p)((_ifp), (_tag)) : EINVAL
#define VLAN_COOKIE(_ifp) \
(_ifp)->if_type == IFT_L2VLAN ? (*vlan_cookie_p)((_ifp)) : NULL
#define VLAN_SETCOOKIE(_ifp, _cookie) \
(_ifp)->if_type == IFT_L2VLAN ? \
(*vlan_setcookie_p)((_ifp), (_cookie)) : EINVAL
#define VLAN_DEVAT(_ifp, _tag) \
(_ifp)->if_vlantrunk != NULL ? (*vlan_devat_p)((_ifp), (_tag)) : NULL
extern void (*vlan_trunk_cap_p)(struct ifnet *);
extern struct ifnet *(*vlan_trunkdev_p)(struct ifnet *);
extern struct ifnet *(*vlan_devat_p)(struct ifnet *, uint16_t);
extern int (*vlan_tag_p)(struct ifnet *, uint16_t *);
extern int (*vlan_setcookie_p)(struct ifnet *, void *);
extern void *(*vlan_cookie_p)(struct ifnet *);
#endif /* _KERNEL */
#endif /* _NET_IF_VLAN_VAR_H_ */

View File

@ -441,7 +441,8 @@ arpintr(struct mbuf *m)
if (ntohs(ar->ar_hrd) != ARPHRD_ETHER &&
ntohs(ar->ar_hrd) != ARPHRD_IEEE802 &&
ntohs(ar->ar_hrd) != ARPHRD_ARCNET &&
ntohs(ar->ar_hrd) != ARPHRD_IEEE1394) {
ntohs(ar->ar_hrd) != ARPHRD_IEEE1394 &&
ntohs(ar->ar_hrd) != ARPHRD_INFINIBAND) {
log(LOG_ERR, "arp: unknown hardware address format (0x%2D)\n",
(unsigned char *)&ar->ar_hrd, "");
m_freem(m);

View File

@ -2298,6 +2298,7 @@ in6_if2idlen(struct ifnet *ifp)
#ifdef IFT_MIP
case IFT_MIP: /* ditto */
#endif
case IFT_INFINIBAND:
return (64);
case IFT_FDDI: /* RFC2467 */
return (64);

View File

@ -2100,6 +2100,7 @@ nd6_need_cache(struct ifnet *ifp)
#ifdef IFT_CARP
case IFT_CARP:
#endif
case IFT_INFINIBAND:
case IFT_GIF: /* XXX need more cases? */
case IFT_PPP:
case IFT_TUNNEL:

View File

@ -1132,6 +1132,7 @@ nd6_ifptomac(struct ifnet *ifp)
#ifdef IFT_CARP
case IFT_CARP:
#endif
case IFT_INFINIBAND:
case IFT_BRIDGE:
case IFT_ISO88025:
return IF_LLADDR(ifp);
@ -1449,6 +1450,7 @@ nd6_dad_duplicated(struct ifaddr *ifa)
#ifdef IFT_IEEE80211
case IFT_IEEE80211:
#endif
case IFT_INFINIBAND:
in6 = ia->ia_addr.sin6_addr;
if (in6_get_hw_ifid(ifp, &in6) == 0 &&
IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr, &in6)) {

View File

@ -464,7 +464,10 @@ void device_verbose(device_t dev);
/*
* Access functions for devclass.
*/
int devclass_add_driver(devclass_t dc, driver_t *driver,
int pass, devclass_t *dcp);
devclass_t devclass_create(const char *classname);
int devclass_delete_driver(devclass_t busclass, driver_t *driver);
devclass_t devclass_find(const char *classname);
const char *devclass_get_name(devclass_t dc);
device_t devclass_get_device(devclass_t dc, int unit);

View File

@ -63,6 +63,7 @@ struct socket;
#define DTYPE_SHM 8 /* swap-backed shared memory */
#define DTYPE_SEM 9 /* posix semaphore */
#define DTYPE_PTS 10 /* pseudo teletype master device */
#define DTYPE_DEV 11 /* Device specific fd type */
#ifdef _KERNEL

View File

@ -176,6 +176,7 @@ int intr_event_remove_handler(void *cookie);
int intr_getaffinity(int irq, void *mask);
void *intr_handler_source(void *cookie);
int intr_setaffinity(int irq, void *mask);
void _intr_drain(int irq); /* Linux compat only. */
int swi_add(struct intr_event **eventp, const char *name,
driver_intr_t handler, void *arg, int pri, enum intr_type flags,
void **cookiep);

View File

@ -379,7 +379,7 @@ int prison_check_af(struct ucred *cred, int af);
int prison_if(struct ucred *cred, struct sockaddr *sa);
char *prison_name(struct prison *, struct prison *);
int prison_priv_check(struct ucred *cred, int priv);
int sysctl_jail_param(struct sysctl_oid *, void *, int , struct sysctl_req *);
int sysctl_jail_param(SYSCTL_HANDLER_ARGS);
#endif /* _KERNEL */
#endif /* !_SYS_JAIL_H_ */

View File

@ -118,18 +118,22 @@ int sx_chain(struct thread *td, struct thread **ownerp);
struct sx_args {
struct sx *sa_sx;
const char *sa_desc;
int sa_flags;
};
#define SX_SYSINIT(name, sxa, desc) \
#define SX_SYSINIT_FLAGS(name, sxa, desc, flags) \
static struct sx_args name##_args = { \
(sxa), \
(desc) \
(desc), \
(flags) \
}; \
SYSINIT(name##_sx_sysinit, SI_SUB_LOCK, SI_ORDER_MIDDLE, \
sx_sysinit, &name##_args); \
SYSUNINIT(name##_sx_sysuninit, SI_SUB_LOCK, SI_ORDER_MIDDLE, \
sx_destroy, (sxa))
#define SX_SYSINIT(name, sxa, desc) SX_SYSINIT_FLAGS(name, sxa, desc, 0)
/*
* Full lock operations that are suitable to be inlined in non-debug kernels.
* If the lock can't be acquired or released trivially then the work is

View File

@ -117,8 +117,8 @@ struct ctlname {
#ifdef _KERNEL
#include <sys/linker_set.h>
#define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, int arg2, \
struct sysctl_req *req
#define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, \
intptr_t arg2, struct sysctl_req *req
/* definitions for sysctl_req 'lock' member */
#define REQ_UNWIRED 1
@ -160,7 +160,7 @@ struct sysctl_oid {
int oid_number;
u_int oid_kind;
void *oid_arg1;
int oid_arg2;
intptr_t oid_arg2;
const char *oid_name;
int (*oid_handler)(SYSCTL_HANDLER_ARGS);
const char *oid_fmt;
@ -746,9 +746,11 @@ extern char kern_ident[];
/* Dynamic oid handling */
struct sysctl_oid *sysctl_add_oid(struct sysctl_ctx_list *clist,
struct sysctl_oid_list *parent, int nbr, const char *name,
int kind, void *arg1, int arg2,
int kind, void *arg1, intptr_t arg2,
int (*handler) (SYSCTL_HANDLER_ARGS),
const char *fmt, const char *descr);
int sysctl_remove_name(struct sysctl_oid *parent, const char *name, int del,
int recurse);
void sysctl_rename_oid(struct sysctl_oid *oidp, const char *name);
int sysctl_move_oid(struct sysctl_oid *oidp,
struct sysctl_oid_list *parent);

View File

@ -112,7 +112,7 @@ static uma_zone_t slabrefzone; /* With refcounters (for UMA_ZONE_REFCNT) */
static uma_zone_t hashzone;
/* The boot-time adjusted value for cache line alignment. */
static int uma_align_cache = 64 - 1;
int uma_align_cache = 64 - 1;
static MALLOC_DEFINE(M_UMAHASH, "UMAHash", "UMA Hash Buckets");

View File

@ -2324,7 +2324,11 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
unsigned int last_timestamp;
int rv;
boolean_t fictitious, need_wakeup, result, user_wire;
vm_prot_t prot;
prot = 0;
if (flags & VM_MAP_WIRE_WRITE)
prot |= VM_PROT_WRITE;
user_wire = (flags & VM_MAP_WIRE_USER) ? TRUE : FALSE;
vm_map_lock(map);
VM_MAP_RANGE_CHECK(map, start, end);
@ -2392,20 +2396,17 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
* above.)
*/
entry->eflags |= MAP_ENTRY_IN_TRANSITION;
/*
*
*/
if (entry->wired_count == 0) {
if ((entry->protection & (VM_PROT_READ|VM_PROT_EXECUTE))
== 0) {
entry->eflags |= MAP_ENTRY_WIRE_SKIPPED;
if ((flags & VM_MAP_WIRE_HOLESOK) == 0) {
end = entry->end;
rv = KERN_INVALID_ADDRESS;
goto done;
}
goto next_entry;
if ((entry->protection & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0
|| (entry->protection & prot) != prot) {
entry->eflags |= MAP_ENTRY_WIRE_SKIPPED;
if ((flags & VM_MAP_WIRE_HOLESOK) == 0) {
end = entry->end;
rv = KERN_INVALID_ADDRESS;
goto done;
}
goto next_entry;
}
if (entry->wired_count == 0) {
entry->wired_count++;
saved_start = entry->start;
saved_end = entry->end;

View File

@ -346,6 +346,8 @@ long vmspace_wired_count(struct vmspace *vmspace);
#define VM_MAP_WIRE_NOHOLES 0 /* region must not have holes */
#define VM_MAP_WIRE_HOLESOK 2 /* region may have holes */
#define VM_MAP_WIRE_WRITE 4 /* Validate writable. */
#ifdef _KERNEL
boolean_t vm_map_check_protection (vm_map_t, vm_offset_t, vm_offset_t, vm_prot_t);
vm_map_t vm_map_create(pmap_t, vm_offset_t, vm_offset_t);

View File

@ -53,6 +53,7 @@ struct file_list {
char *f_depends; /* additional dependancies */
char *f_clean; /* File list to add to clean rule */
char *f_warn; /* warning message */
const char *f_objprefix; /* prefix string for object name */
};
struct files_name {

View File

@ -312,6 +312,7 @@ read_file(char *fname)
struct device *dp;
struct opt *op;
char *wd, *this, *compilewith, *depends, *clean, *warning;
const char *objprefix;
int compile, match, nreqs, std, filetype,
imp_rule, no_obj, before_depend, mandatory, nowerror;
@ -326,6 +327,7 @@ read_file(char *fname)
* [ compile-with "compile rule" [no-implicit-rule] ]
* [ dependency "dependency-list"] [ before-depend ]
* [ clean "file-list"] [ warning "text warning" ]
* [ obj-prefix "file prefix"]
*/
wd = get_word(fp);
if (wd == (char *)EOF) {
@ -373,6 +375,7 @@ read_file(char *fname)
before_depend = 0;
nowerror = 0;
filetype = NORMAL;
objprefix = "";
if (eq(wd, "standard")) {
std = 1;
/*
@ -467,6 +470,16 @@ read_file(char *fname)
warning = ns(wd);
goto nextparam;
}
if (eq(wd, "obj-prefix")) {
next_quoted_word(fp, wd);
if (wd == 0) {
printf("%s: %s missing object prefix string.\n",
fname, this);
exit(1);
}
objprefix = ns(wd);
goto nextparam;
}
nreqs++;
if (eq(wd, "local")) {
filetype = LOCAL;
@ -535,6 +548,7 @@ read_file(char *fname)
tp->f_depends = depends;
tp->f_clean = clean;
tp->f_warn = warning;
tp->f_objprefix = objprefix;
goto next;
}
@ -619,11 +633,12 @@ do_objs(FILE *fp)
cp = sp + (len = strlen(sp)) - 1;
och = *cp;
*cp = 'o';
len += strlen(tp->f_objprefix);
if (len + lpos > 72) {
lpos = 8;
fprintf(fp, "\\\n\t");
}
fprintf(fp, "%s ", sp);
fprintf(fp, "%s%s ", tp->f_objprefix, sp);
lpos += len + 1;
*cp = och;
}
@ -699,30 +714,33 @@ do_rules(FILE *f)
och = *cp;
if (ftp->f_flags & NO_IMPLCT_RULE) {
if (ftp->f_depends)
fprintf(f, "%s: %s\n", np, ftp->f_depends);
fprintf(f, "%s%s: %s\n",
ftp->f_objprefix, np, ftp->f_depends);
else
fprintf(f, "%s: \n", np);
fprintf(f, "%s%s: \n", ftp->f_objprefix, np);
}
else {
*cp = '\0';
if (och == 'o') {
fprintf(f, "%so:\n\t-cp $S/%so .\n\n",
tail(np), np);
fprintf(f, "%s%so:\n\t-cp $S/%so .\n\n",
ftp->f_objprefix, tail(np), np);
continue;
}
if (ftp->f_depends) {
fprintf(f, "%sln: $S/%s%c %s\n", tail(np),
np, och, ftp->f_depends);
fprintf(f, "%s%sln: $S/%s%c %s\n",
ftp->f_objprefix, tail(np), np, och,
ftp->f_depends);
fprintf(f, "\t${NORMAL_LINT}\n\n");
fprintf(f, "%so: $S/%s%c %s\n", tail(np),
np, och, ftp->f_depends);
fprintf(f, "%s%so: $S/%s%c %s\n",
ftp->f_objprefix, tail(np), np, och,
ftp->f_depends);
}
else {
fprintf(f, "%sln: $S/%s%c\n", tail(np),
np, och);
fprintf(f, "%s%sln: $S/%s%c\n",
ftp->f_objprefix, tail(np), np, och);
fprintf(f, "\t${NORMAL_LINT}\n\n");
fprintf(f, "%so: $S/%s%c\n", tail(np),
np, och);
fprintf(f, "%s%so: $S/%s%c\n",
ftp->f_objprefix, tail(np), np, och);
}
}
compilewith = ftp->f_compilewith;
@ -750,7 +768,10 @@ do_rules(FILE *f)
compilewith = cmd;
}
*cp = och;
fprintf(f, "\t%s\n\n", compilewith);
if (strlen(ftp->f_objprefix))
fprintf(f, "\t%s $S/%s\n\n", compilewith, np);
else
fprintf(f, "\t%s\n\n", compilewith);
}
}

View File

@ -822,11 +822,15 @@ static char *
ether_str(struct sockaddr_dl *sdl)
{
static char hbuf[NI_MAXHOST];
char *cp;
if (sdl->sdl_alen > 0)
if (sdl->sdl_alen == ETHER_ADDR_LEN) {
strlcpy(hbuf, ether_ntoa((struct ether_addr *)LLADDR(sdl)),
sizeof(hbuf));
else
} else if (sdl->sdl_alen) {
int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
snprintf(hbuf, sizeof(hbuf), "%s", link_ntoa(sdl) + n);
} else
snprintf(hbuf, sizeof(hbuf), "(incomplete)");
return(hbuf);