mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-06-01 23:04:19 +08:00
Update to FreeBSD stable/12 2019-02-04
Git mirror commit 50f507fe430c8041715f649f179f4b0a431dd7ff.
This commit is contained in:
parent
a5b385b26f
commit
4a8bc9e5fa
@ -1 +1 @@
|
||||
Subproject commit 7005c2e76a6bfb359bf2f1acb8382c0b7a01f4be
|
||||
Subproject commit 50f507fe430c8041715f649f179f4b0a431dd7ff
|
@ -263,7 +263,7 @@ led_set(char const *name, char const *cmd)
|
||||
mtx_unlock(&led_mtx);
|
||||
if (sb != NULL)
|
||||
sbuf_delete(sb);
|
||||
return (0);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static struct cdevsw led_cdevsw = {
|
||||
|
@ -157,7 +157,8 @@ static const STRUCT_USB_HOST_ID rtwn_devs[] = {
|
||||
RTWN_RTL8821AU_DEV(HAWKING, HD65U),
|
||||
RTWN_RTL8821AU_DEV(MELCO, WIU2433DM),
|
||||
RTWN_RTL8821AU_DEV(NETGEAR, A6100),
|
||||
RTWN_RTL8821AU_DEV(REALTEK, RTL8821AU)
|
||||
RTWN_RTL8821AU_DEV(REALTEK, RTL8821AU_1),
|
||||
RTWN_RTL8821AU_DEV(REALTEK, RTL8821AU_2)
|
||||
#undef RTWN_RTL8821AU_DEV
|
||||
};
|
||||
|
||||
|
@ -98,6 +98,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
USB_QUIRK(TELEX, MIC1, 0x009, 0x009, UQ_AU_NO_FRAC),
|
||||
USB_QUIRK(SILICONPORTALS, YAPPHONE, 0x100, 0x100, UQ_AU_INP_ASYNC),
|
||||
USB_QUIRK(LOGITECH, UN53B, 0x0000, 0xffff, UQ_NO_STRINGS),
|
||||
USB_QUIRK(LOGITECH, G510S, 0x0000, 0xFFFF, UQ_KBD_BOOTPROTO),
|
||||
USB_QUIRK(REALTEK, RTL8196EU, 0x0000, 0xffff, UQ_CFG_INDEX_1),
|
||||
USB_QUIRK(ELSA, MODEM1, 0x0000, 0xffff, UQ_CFG_INDEX_1),
|
||||
USB_QUIRK(PLANEX2, MZKUE150N, 0x0000, 0xffff, UQ_CFG_INDEX_1),
|
||||
@ -112,8 +113,19 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
USB_QUIRK(XEROX, WCM15, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
|
||||
/* Devices which should be ignored by uhid */
|
||||
USB_QUIRK(APC, UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6H375USB, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C550AVR, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C1250TWRK, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C1500TWRK, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C900UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C100UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C120UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C800UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(BELKIN, F6C1100UNV, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(CYBERPOWER, BC900D, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(CYBERPOWER, 1500CAVRLCD, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(CYBERPOWER, OR2200LCDRM2U, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(DELL2, VARIOUS_UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(CYPRESS, SILVERSHIELD, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(DELORME, EARTHMATE, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(DREAMLINK, DL100B, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
@ -121,8 +133,26 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
USB_QUIRK(ITUNERNET, USBLCD4X20, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(LIEBERT, POWERSURE_PXT, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(LIEBERT2, PSI1000, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(LIEBERT2, POWERSURE_PSA, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(MGE, UPS1, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(MGE, UPS2, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(POWERCOM, IMPERIAL_SERIES, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(POWERCOM, SMART_KING_PRO, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(POWERCOM, WOW, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(POWERCOM, VANGUARD, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(POWERCOM, BLACK_KNIGHT_PRO, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, AVR550U, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, AVR750U, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, ECO550UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, T750_INTL, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, RT_2200_INTL, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, OMNI1000LCD, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, OMNI900LCD, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, SMART_2200RMXL2U, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, UPS_3014, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, SU1500RTXL2UA, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, SU6000RT4U, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(TRIPPLITE2, SU1500RTXL2UA_2, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(APPLE, IPHONE, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(APPLE, IPHONE_3G, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
USB_QUIRK(MEGATEC, UPS, 0x0000, 0xffff, UQ_HID_IGNORE),
|
||||
@ -137,12 +167,15 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
USB_QUIRK(MICROSOFT, WLINTELLIMOUSE, 0x0000, 0xffff, UQ_MS_LEADING_BYTE),
|
||||
/* Quirk for Corsair Vengeance K60 keyboard */
|
||||
USB_QUIRK(CORSAIR, K60, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
/* Quirk for Corsair Gaming K68 keyboard */
|
||||
USB_QUIRK(CORSAIR, K68, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
/* Quirk for Corsair Vengeance K70 keyboard */
|
||||
USB_QUIRK(CORSAIR, K70, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
/* Quirk for Corsair K70 RGB keyboard */
|
||||
USB_QUIRK(CORSAIR, K70_RGB, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
/* Quirk for Corsair STRAFE Gaming keyboard */
|
||||
USB_QUIRK(CORSAIR, STRAFE, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
USB_QUIRK(CORSAIR, STRAFE2, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
|
||||
/* umodem(4) device quirks */
|
||||
USB_QUIRK(METRICOM, RICOCHET_GS, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA),
|
||||
USB_QUIRK(SANYO, SCP4900, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA),
|
||||
@ -498,6 +531,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
|
||||
USB_QUIRK(VIALABS, USB30SATABRIDGE, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
|
||||
USB_QUIRK(QUALCOMMINC, ZTE_MF730M, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN,
|
||||
UQ_MSC_NO_INQUIRY, UQ_CFG_INDEX_0),
|
||||
USB_QUIRK(SMART2, G2MEMKEY, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
|
||||
/* Non-standard USB MIDI devices */
|
||||
USB_QUIRK(ROLAND, UM1, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
|
||||
USB_QUIRK(ROLAND, SC8850, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
|
||||
|
@ -2762,15 +2762,17 @@ static int
|
||||
rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
|
||||
struct mbuf *m0, struct rsu_data *data)
|
||||
{
|
||||
const struct ieee80211_txparam *tp = ni->ni_txparms;
|
||||
struct ieee80211com *ic = &sc->sc_ic;
|
||||
struct ieee80211vap *vap = ni->ni_vap;
|
||||
struct ieee80211_frame *wh;
|
||||
struct ieee80211_key *k = NULL;
|
||||
struct r92s_tx_desc *txd;
|
||||
uint8_t type, cipher;
|
||||
uint8_t rate, ridx, type, cipher;
|
||||
int prio = 0;
|
||||
uint8_t which;
|
||||
int hasqos;
|
||||
int ismcast;
|
||||
int xferlen;
|
||||
int qid;
|
||||
|
||||
@ -2778,10 +2780,26 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
|
||||
|
||||
wh = mtod(m0, struct ieee80211_frame *);
|
||||
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
|
||||
ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
|
||||
|
||||
RSU_DPRINTF(sc, RSU_DEBUG_TX, "%s: data=%p, m=%p\n",
|
||||
__func__, data, m0);
|
||||
|
||||
/* Choose a TX rate index. */
|
||||
if (type == IEEE80211_FC0_TYPE_MGT ||
|
||||
type == IEEE80211_FC0_TYPE_CTL ||
|
||||
(m0->m_flags & M_EAPOL) != 0)
|
||||
rate = tp->mgmtrate;
|
||||
else if (ismcast)
|
||||
rate = tp->mcastrate;
|
||||
else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
|
||||
rate = tp->ucastrate;
|
||||
else
|
||||
rate = 0;
|
||||
|
||||
if (rate != 0)
|
||||
ridx = rate2ridx(rate);
|
||||
|
||||
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
|
||||
k = ieee80211_crypto_encap(ni, m0);
|
||||
if (k == NULL) {
|
||||
@ -2860,8 +2878,17 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
|
||||
}
|
||||
/* XXX todo: set AGGEN bit if appropriate? */
|
||||
txd->txdw2 |= htole32(R92S_TXDW2_BK);
|
||||
if (IEEE80211_IS_MULTICAST(wh->i_addr1))
|
||||
if (ismcast)
|
||||
txd->txdw2 |= htole32(R92S_TXDW2_BMCAST);
|
||||
|
||||
/* Force mgmt / mcast / ucast rate if needed. */
|
||||
if (rate != 0) {
|
||||
/* Data rate fallback limit (max). */
|
||||
txd->txdw5 |= htole32(SM(R92S_TXDW5_DATARATE_FB_LMT, 0x1f));
|
||||
txd->txdw5 |= htole32(SM(R92S_TXDW5_DATARATE, ridx));
|
||||
txd->txdw4 |= htole32(R92S_TXDW4_DRVRATE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Firmware will use and increment the sequence number for the
|
||||
* specified priority.
|
||||
|
@ -700,9 +700,14 @@ struct r92s_tx_desc {
|
||||
|
||||
uint32_t txdw4;
|
||||
#define R92S_TXDW4_TXBW 0x00040000
|
||||
#define R92S_TXDW4_DRVRATE 0x80000000
|
||||
|
||||
uint32_t txdw5;
|
||||
#define R92S_TXDW5_DISFB 0x00008000
|
||||
#define R92S_TXDW5_DATARATE_M 0x00007e00
|
||||
#define R92S_TXDW5_DATARATE_S 9
|
||||
#define R92S_TXDW5_DISFB 0x00008000
|
||||
#define R92S_TXDW5_DATARATE_FB_LMT_M 0x001f0000
|
||||
#define R92S_TXDW5_DATARATE_FB_LMT_S 16
|
||||
|
||||
uint16_t ipchksum;
|
||||
uint16_t tcpchksum;
|
||||
|
@ -175,14 +175,14 @@ struct ifmediareq32 {
|
||||
#define SIOCGIFXMEDIA32 _IOC_NEWTYPE(SIOCGIFXMEDIA, struct ifmediareq32)
|
||||
|
||||
#define _CASE_IOC_IFGROUPREQ_32(cmd) \
|
||||
case _IOC_NEWTYPE((cmd), struct ifgroupreq32):
|
||||
_IOC_NEWTYPE((cmd), struct ifgroupreq32): case
|
||||
#else /* !COMPAT_FREEBSD32 */
|
||||
#define _CASE_IOC_IFGROUPREQ_32(cmd)
|
||||
#endif /* !COMPAT_FREEBSD32 */
|
||||
|
||||
#define CASE_IOC_IFGROUPREQ(cmd) \
|
||||
_CASE_IOC_IFGROUPREQ_32(cmd) \
|
||||
case (cmd)
|
||||
(cmd)
|
||||
|
||||
union ifreq_union {
|
||||
struct ifreq ifr;
|
||||
@ -2901,7 +2901,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
error = if_gethwaddr(ifp, ifr);
|
||||
break;
|
||||
|
||||
CASE_IOC_IFGROUPREQ(SIOCAIFGROUP):
|
||||
case CASE_IOC_IFGROUPREQ(SIOCAIFGROUP):
|
||||
error = priv_check(td, PRIV_NET_ADDIFGROUP);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -2910,12 +2910,12 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
return (error);
|
||||
break;
|
||||
|
||||
CASE_IOC_IFGROUPREQ(SIOCGIFGROUP):
|
||||
case CASE_IOC_IFGROUPREQ(SIOCGIFGROUP):
|
||||
if ((error = if_getgroup((struct ifgroupreq *)data, ifp)))
|
||||
return (error);
|
||||
break;
|
||||
|
||||
CASE_IOC_IFGROUPREQ(SIOCDIFGROUP):
|
||||
case CASE_IOC_IFGROUPREQ(SIOCDIFGROUP):
|
||||
error = priv_check(td, PRIV_NET_DELIFGROUP);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -3086,7 +3086,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
|
||||
error = if_clone_list((struct if_clonereq *)data);
|
||||
goto out_noref;
|
||||
|
||||
CASE_IOC_IFGROUPREQ(SIOCGIFGMEMB):
|
||||
case CASE_IOC_IFGROUPREQ(SIOCGIFGMEMB):
|
||||
error = if_getgroupmembers((struct ifgroupreq *)data);
|
||||
goto out_noref;
|
||||
|
||||
|
@ -708,6 +708,7 @@ struct _ipfw_dyn_rule {
|
||||
u_int32_t state; /* state of this rule (typically a
|
||||
* combination of TCP flags)
|
||||
*/
|
||||
#define IPFW_DYN_ORPHANED 0x40000 /* state's parent rule was deleted */
|
||||
u_int32_t ack_fwd; /* most recent ACKs in forward */
|
||||
u_int32_t ack_rev; /* and reverse directions (used */
|
||||
/* to generate keepalives) */
|
||||
@ -938,9 +939,10 @@ typedef struct _ipfw_range_tlv {
|
||||
#define IPFW_RCFLAG_RANGE 0x01 /* rule range is set */
|
||||
#define IPFW_RCFLAG_ALL 0x02 /* match ALL rules */
|
||||
#define IPFW_RCFLAG_SET 0x04 /* match rules in given set */
|
||||
#define IPFW_RCFLAG_DYNAMIC 0x08 /* match only dynamic states */
|
||||
/* User-settable flags */
|
||||
#define IPFW_RCFLAG_USER (IPFW_RCFLAG_RANGE | IPFW_RCFLAG_ALL | \
|
||||
IPFW_RCFLAG_SET)
|
||||
IPFW_RCFLAG_SET | IPFW_RCFLAG_DYNAMIC)
|
||||
/* Internally used flags */
|
||||
#define IPFW_RCFLAG_DEFAULT 0x0100 /* Do not skip defaul rule */
|
||||
|
||||
|
@ -862,36 +862,22 @@ in6_tmpaddrtimer(void *arg)
|
||||
static void
|
||||
in6_purgemaddrs(struct ifnet *ifp)
|
||||
{
|
||||
struct in6_multi_head purgeinms;
|
||||
struct in6_multi *inm;
|
||||
struct ifmultiaddr *ifma, *next;
|
||||
struct in6_multi_head inmh;
|
||||
|
||||
SLIST_INIT(&purgeinms);
|
||||
SLIST_INIT(&inmh);
|
||||
IN6_MULTI_LOCK();
|
||||
IN6_MULTI_LIST_LOCK();
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
/*
|
||||
* Extract list of in6_multi associated with the detaching ifp
|
||||
* which the PF_INET6 layer is about to release.
|
||||
*/
|
||||
restart:
|
||||
CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
in6m_disconnect(inm);
|
||||
in6m_rele_locked(&purgeinms, inm);
|
||||
if (__predict_false(ifma6_restart)) {
|
||||
ifma6_restart = false;
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
mld_ifdetach(ifp);
|
||||
mld_ifdetach(ifp, &inmh);
|
||||
IN6_MULTI_LIST_UNLOCK();
|
||||
IN6_MULTI_UNLOCK();
|
||||
in6m_release_list_deferred(&purgeinms);
|
||||
in6m_release_list_deferred(&inmh);
|
||||
|
||||
/*
|
||||
* Make sure all multicast deletions invoking if_ioctl() are
|
||||
* completed before returning. Else we risk accessing a freed
|
||||
* ifnet structure pointer.
|
||||
*/
|
||||
in6m_release_wait();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -192,7 +192,6 @@ static SYSCTL_NODE(_net_inet6_ip6_mcast, OID_AUTO, filters,
|
||||
CTLFLAG_RD | CTLFLAG_MPSAFE, sysctl_ip6_mcast_filters,
|
||||
"Per-interface stack-wide source filters");
|
||||
|
||||
int ifma6_restart = 0;
|
||||
#ifdef KTR
|
||||
/*
|
||||
* Inline function which wraps assertions for a valid ifp.
|
||||
@ -407,6 +406,7 @@ static int
|
||||
in6_getmulti(struct ifnet *ifp, const struct in6_addr *group,
|
||||
struct in6_multi **pinm)
|
||||
{
|
||||
struct epoch_tracker et;
|
||||
struct sockaddr_in6 gsin6;
|
||||
struct ifmultiaddr *ifma;
|
||||
struct in6_multi *inm;
|
||||
@ -422,7 +422,10 @@ in6_getmulti(struct ifnet *ifp, const struct in6_addr *group,
|
||||
IN6_MULTI_LOCK_ASSERT();
|
||||
IN6_MULTI_LIST_LOCK();
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
NET_EPOCH_ENTER_ET(et);
|
||||
inm = in6m_lookup_locked(ifp, group);
|
||||
NET_EPOCH_EXIT_ET(et);
|
||||
|
||||
if (inm != NULL) {
|
||||
/*
|
||||
* If we already joined this group, just bump the
|
||||
@ -587,7 +590,15 @@ in6m_release_list_deferred(struct in6_multi_head *inmh)
|
||||
}
|
||||
|
||||
void
|
||||
in6m_disconnect(struct in6_multi *inm)
|
||||
in6m_release_wait(void)
|
||||
{
|
||||
|
||||
/* Wait for all jobs to complete. */
|
||||
gtaskqueue_drain_all(free_gtask.gt_taskqueue);
|
||||
}
|
||||
|
||||
void
|
||||
in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm)
|
||||
{
|
||||
struct ifnet *ifp;
|
||||
struct ifaddr *ifa;
|
||||
@ -595,10 +606,12 @@ in6m_disconnect(struct in6_multi *inm)
|
||||
struct in6_multi_mship *imm, *imm_tmp;
|
||||
struct ifmultiaddr *ifma, *ll_ifma;
|
||||
|
||||
ifp = inm->in6m_ifp;
|
||||
IN6_MULTI_LIST_LOCK_ASSERT();
|
||||
|
||||
ifp = inm->in6m_ifp;
|
||||
if (ifp == NULL)
|
||||
return;
|
||||
return; /* already called */
|
||||
|
||||
inm->in6m_ifp = NULL;
|
||||
IF_ADDR_WLOCK_ASSERT(ifp);
|
||||
ifma = inm->in6m_ifma;
|
||||
@ -617,7 +630,6 @@ in6m_disconnect(struct in6_multi *inm)
|
||||
MPASS(ll_ifma->ifma_llifma == NULL);
|
||||
MPASS(ll_ifma->ifma_ifp == ifp);
|
||||
if (--ll_ifma->ifma_refcount == 0) {
|
||||
ifma6_restart = true;
|
||||
if (ll_ifma->ifma_flags & IFMA_F_ENQUEUED) {
|
||||
CK_STAILQ_REMOVE(&ifp->if_multiaddrs, ll_ifma, ifmultiaddr, ifma_link);
|
||||
ll_ifma->ifma_flags &= ~IFMA_F_ENQUEUED;
|
||||
@ -635,28 +647,12 @@ in6m_disconnect(struct in6_multi *inm)
|
||||
if (inm == imm->i6mm_maddr) {
|
||||
LIST_REMOVE(imm, i6mm_chain);
|
||||
free(imm, M_IP6MADDR);
|
||||
in6m_rele_locked(inmh, inm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
in6m_release_deferred(struct in6_multi *inm)
|
||||
{
|
||||
struct in6_multi_head tmp;
|
||||
|
||||
IN6_MULTI_LIST_LOCK_ASSERT();
|
||||
KASSERT(inm->in6m_refcount > 0, ("refcount == %d inm: %p", inm->in6m_refcount, inm));
|
||||
if (--inm->in6m_refcount == 0) {
|
||||
MPASS(inm->in6m_ifp == NULL);
|
||||
SLIST_INIT(&tmp);
|
||||
inm->in6m_ifma->ifma_protospec = NULL;
|
||||
MPASS(inm->in6m_ifma->ifma_llifma == NULL);
|
||||
SLIST_INSERT_HEAD(&tmp, inm, in6m_nrele);
|
||||
in6m_release_list_deferred(&tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
in6m_release_task(void *arg __unused)
|
||||
{
|
||||
@ -1256,6 +1252,7 @@ in6_joingroup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr,
|
||||
/*const*/ struct in6_mfilter *imf, struct in6_multi **pinm,
|
||||
const int delay)
|
||||
{
|
||||
struct in6_multi_head inmh;
|
||||
struct in6_mfilter timf;
|
||||
struct in6_multi *inm;
|
||||
struct ifmultiaddr *ifma;
|
||||
@ -1317,6 +1314,7 @@ in6_joingroup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr,
|
||||
}
|
||||
|
||||
out_in6m_release:
|
||||
SLIST_INIT(&inmh);
|
||||
if (error) {
|
||||
CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm);
|
||||
IF_ADDR_RLOCK(ifp);
|
||||
@ -1326,13 +1324,14 @@ out_in6m_release:
|
||||
break;
|
||||
}
|
||||
}
|
||||
in6m_disconnect(inm);
|
||||
in6m_release_deferred(inm);
|
||||
in6m_disconnect_locked(&inmh, inm);
|
||||
in6m_rele_locked(&inmh, inm);
|
||||
IF_ADDR_RUNLOCK(ifp);
|
||||
} else {
|
||||
*pinm = inm;
|
||||
}
|
||||
IN6_MULTI_LIST_UNLOCK();
|
||||
in6m_release_list_deferred(&inmh);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1366,6 +1365,7 @@ in6_leavegroup(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
|
||||
int
|
||||
in6_leavegroup_locked(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
|
||||
{
|
||||
struct in6_multi_head inmh;
|
||||
struct in6_mfilter timf;
|
||||
struct ifnet *ifp;
|
||||
int error;
|
||||
@ -1415,13 +1415,15 @@ in6_leavegroup_locked(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
|
||||
CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm);
|
||||
if (ifp)
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
if (inm->in6m_refcount == 1 && inm->in6m_ifp != NULL)
|
||||
in6m_disconnect(inm);
|
||||
in6m_release_deferred(inm);
|
||||
|
||||
SLIST_INIT(&inmh);
|
||||
if (inm->in6m_refcount == 1)
|
||||
in6m_disconnect_locked(&inmh, inm);
|
||||
in6m_rele_locked(&inmh, inm);
|
||||
if (ifp)
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
IN6_MULTI_LIST_UNLOCK();
|
||||
|
||||
in6m_release_list_deferred(&inmh);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1935,6 +1937,7 @@ in6p_lookup_mcast_ifp(const struct inpcb *in6p,
|
||||
static int
|
||||
in6p_join_group(struct inpcb *inp, struct sockopt *sopt)
|
||||
{
|
||||
struct in6_multi_head inmh;
|
||||
struct group_source_req gsr;
|
||||
sockunion_t *gsa, *ssa;
|
||||
struct ifnet *ifp;
|
||||
@ -1945,6 +1948,7 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt)
|
||||
size_t idx;
|
||||
int error, is_new;
|
||||
|
||||
SLIST_INIT(&inmh);
|
||||
ifp = NULL;
|
||||
imf = NULL;
|
||||
lims = NULL;
|
||||
@ -2180,7 +2184,10 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt)
|
||||
IN6_MULTI_UNLOCK();
|
||||
goto out_im6o_free;
|
||||
}
|
||||
in6m_acquire(inm);
|
||||
/*
|
||||
* NOTE: Refcount from in6_joingroup_locked()
|
||||
* is protecting membership.
|
||||
*/
|
||||
imo->im6o_membership[idx] = inm;
|
||||
} else {
|
||||
CTR1(KTR_MLD, "%s: merge inm state", __func__);
|
||||
@ -2218,7 +2225,7 @@ out_im6o_free:
|
||||
inm = imo->im6o_membership[idx];
|
||||
if (inm != NULL) {
|
||||
IN6_MULTI_LIST_LOCK();
|
||||
in6m_release_deferred(inm);
|
||||
in6m_rele_locked(&inmh, inm);
|
||||
IN6_MULTI_LIST_UNLOCK();
|
||||
}
|
||||
imo->im6o_membership[idx] = NULL;
|
||||
@ -2227,6 +2234,7 @@ out_im6o_free:
|
||||
|
||||
out_in6p_locked:
|
||||
INP_WUNLOCK(inp);
|
||||
in6m_release_list_deferred(&inmh);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -2870,10 +2878,9 @@ sysctl_ip6_mcast_filters(SYSCTL_HANDLER_ARGS)
|
||||
IN6_MULTI_LIST_LOCK();
|
||||
IF_ADDR_RLOCK(ifp);
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
if (!IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, &mcaddr))
|
||||
continue;
|
||||
fmode = inm->in6m_st[1].iss_fmode;
|
||||
|
@ -645,6 +645,7 @@ struct in6_multi {
|
||||
/* New fields for MLDv2 follow. */
|
||||
struct mld_ifsoftc *in6m_mli; /* MLD info */
|
||||
SLIST_ENTRY(in6_multi) in6m_nrele; /* to-be-released by MLD */
|
||||
SLIST_ENTRY(in6_multi) in6m_defer; /* deferred MLDv1 */
|
||||
struct ip6_msource_tree in6m_srcs; /* tree of sources */
|
||||
u_long in6m_nsrc; /* # of tree entries */
|
||||
|
||||
@ -670,8 +671,8 @@ struct in6_multi {
|
||||
} in6m_st[2]; /* state at t0, t1 */
|
||||
};
|
||||
|
||||
void in6m_disconnect(struct in6_multi *inm);
|
||||
extern int ifma6_restart;
|
||||
void in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm);
|
||||
|
||||
/*
|
||||
* Helper function to derive the filter mode on a source entry
|
||||
* from its internal counters. Predicates are:
|
||||
@ -713,13 +714,23 @@ extern struct sx in6_multi_sx;
|
||||
#define IN6_MULTI_LOCK_ASSERT() sx_assert(&in6_multi_sx, SA_XLOCKED)
|
||||
#define IN6_MULTI_UNLOCK_ASSERT() sx_assert(&in6_multi_sx, SA_XUNLOCKED)
|
||||
|
||||
/*
|
||||
* Get the in6_multi pointer from a ifmultiaddr.
|
||||
* Returns NULL if ifmultiaddr is no longer valid.
|
||||
*/
|
||||
static __inline struct in6_multi *
|
||||
in6m_ifmultiaddr_get_inm(struct ifmultiaddr *ifma)
|
||||
{
|
||||
|
||||
return ((ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
(ifma->ifma_flags & IFMA_F_ENQUEUED) == 0) ? NULL :
|
||||
ifma->ifma_protospec);
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up an in6_multi record for an IPv6 multicast address
|
||||
* on the interface ifp.
|
||||
* If no record found, return NULL.
|
||||
*
|
||||
* SMPng: The IN6_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held.
|
||||
*/
|
||||
static __inline struct in6_multi *
|
||||
in6m_lookup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr)
|
||||
@ -727,18 +738,14 @@ in6m_lookup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr)
|
||||
struct ifmultiaddr *ifma;
|
||||
struct in6_multi *inm;
|
||||
|
||||
inm = NULL;
|
||||
CK_STAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family == AF_INET6) {
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
if (IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, mcaddr))
|
||||
break;
|
||||
inm = NULL;
|
||||
}
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
if (IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, mcaddr))
|
||||
return (inm);
|
||||
}
|
||||
return (inm);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -808,8 +815,8 @@ void in6m_clear_recorded(struct in6_multi *);
|
||||
void in6m_commit(struct in6_multi *);
|
||||
void in6m_print(const struct in6_multi *);
|
||||
int in6m_record_source(struct in6_multi *, const struct in6_addr *);
|
||||
void in6m_release_deferred(struct in6_multi *);
|
||||
void in6m_release_list_deferred(struct in6_multi_head *);
|
||||
void in6m_release_wait(void);
|
||||
void ip6_freemoptions(struct ip6_moptions *);
|
||||
int ip6_getmoptions(struct inpcb *, struct sockopt *);
|
||||
int ip6_setmoptions(struct inpcb *, struct sockopt *);
|
||||
|
@ -112,7 +112,7 @@ static void mli_delete_locked(const struct ifnet *);
|
||||
static void mld_dispatch_packet(struct mbuf *);
|
||||
static void mld_dispatch_queue(struct mbufq *, int);
|
||||
static void mld_final_leave(struct in6_multi *, struct mld_ifsoftc *);
|
||||
static void mld_fasttimo_vnet(void);
|
||||
static void mld_fasttimo_vnet(struct in6_multi_head *inmh);
|
||||
static int mld_handle_state_change(struct in6_multi *,
|
||||
struct mld_ifsoftc *);
|
||||
static int mld_initial_join(struct in6_multi *, struct mld_ifsoftc *,
|
||||
@ -245,6 +245,10 @@ static int mld_v1enable = 1;
|
||||
SYSCTL_INT(_net_inet6_mld, OID_AUTO, v1enable, CTLFLAG_RWTUN,
|
||||
&mld_v1enable, 0, "Enable fallback to MLDv1");
|
||||
|
||||
static int mld_v2enable = 1;
|
||||
SYSCTL_INT(_net_inet6_mld, OID_AUTO, v2enable, CTLFLAG_RWTUN,
|
||||
&mld_v2enable, 0, "Enable MLDv2");
|
||||
|
||||
static int mld_use_allow = 1;
|
||||
SYSCTL_INT(_net_inet6_mld, OID_AUTO, use_allow, CTLFLAG_RWTUN,
|
||||
&mld_use_allow, 0, "Use ALLOW/BLOCK for RFC 4604 SSM joins/leaves");
|
||||
@ -535,45 +539,48 @@ out:
|
||||
* XXX This routine is also bitten by unlocked ifma_protospec access.
|
||||
*/
|
||||
void
|
||||
mld_ifdetach(struct ifnet *ifp)
|
||||
mld_ifdetach(struct ifnet *ifp, struct in6_multi_head *inmh)
|
||||
{
|
||||
struct epoch_tracker et;
|
||||
struct mld_ifsoftc *mli;
|
||||
struct ifmultiaddr *ifma, *next;
|
||||
struct ifmultiaddr *ifma;
|
||||
struct in6_multi *inm;
|
||||
struct in6_multi_head inmh;
|
||||
|
||||
CTR3(KTR_MLD, "%s: called for ifp %p(%s)", __func__, ifp,
|
||||
if_name(ifp));
|
||||
|
||||
SLIST_INIT(&inmh);
|
||||
IN6_MULTI_LIST_LOCK_ASSERT();
|
||||
MLD_LOCK();
|
||||
|
||||
mli = MLD_IFINFO(ifp);
|
||||
if (mli->mli_version == MLD_VERSION_2) {
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
restart:
|
||||
CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
if (inm->in6m_state == MLD_LEAVING_MEMBER) {
|
||||
in6m_disconnect(inm);
|
||||
in6m_rele_locked(&inmh, inm);
|
||||
ifma->ifma_protospec = NULL;
|
||||
}
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
/*
|
||||
* Extract list of in6_multi associated with the detaching ifp
|
||||
* which the PF_INET6 layer is about to release.
|
||||
*/
|
||||
NET_EPOCH_ENTER_ET(et);
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
in6m_disconnect_locked(inmh, inm);
|
||||
|
||||
if (mli->mli_version == MLD_VERSION_2) {
|
||||
in6m_clear_recorded(inm);
|
||||
if (__predict_false(ifma6_restart)) {
|
||||
ifma6_restart = false;
|
||||
goto restart;
|
||||
|
||||
/*
|
||||
* We need to release the final reference held
|
||||
* for issuing the INCLUDE {}.
|
||||
*/
|
||||
if (inm->in6m_state == MLD_LEAVING_MEMBER) {
|
||||
inm->in6m_state = MLD_NOT_MEMBER;
|
||||
in6m_rele_locked(inmh, inm);
|
||||
}
|
||||
}
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
}
|
||||
|
||||
NET_EPOCH_EXIT_ET(et);
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
MLD_UNLOCK();
|
||||
in6m_release_list_deferred(&inmh);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -706,10 +713,9 @@ mld_v1_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6,
|
||||
CTR2(KTR_MLD, "process v1 general query on ifp %p(%s)",
|
||||
ifp, if_name(ifp));
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
mld_v1_update_group(inm, timer);
|
||||
}
|
||||
} else {
|
||||
@ -818,7 +824,12 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6,
|
||||
char ip6tbuf[INET6_ADDRSTRLEN];
|
||||
#endif
|
||||
|
||||
is_general_query = 0;
|
||||
if (!mld_v2enable) {
|
||||
CTR3(KTR_MLD, "ignore v2 query src %s on ifp %p(%s)",
|
||||
ip6_sprintf(ip6tbuf, &ip6->ip6_src),
|
||||
ifp, if_name(ifp));
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* RFC3810 Section 6.2: MLD queries must originate from
|
||||
@ -831,6 +842,8 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6,
|
||||
return (0);
|
||||
}
|
||||
|
||||
is_general_query = 0;
|
||||
|
||||
CTR2(KTR_MLD, "input v2 query on ifp %p(%s)", ifp, if_name(ifp));
|
||||
|
||||
mld = (struct mldv2_query *)(mtod(m, uint8_t *) + off);
|
||||
@ -1311,15 +1324,19 @@ mld_input(struct mbuf *m, int off, int icmp6len)
|
||||
void
|
||||
mld_fasttimo(void)
|
||||
{
|
||||
struct in6_multi_head inmh;
|
||||
VNET_ITERATOR_DECL(vnet_iter);
|
||||
|
||||
SLIST_INIT(&inmh);
|
||||
|
||||
VNET_LIST_RLOCK_NOSLEEP();
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
mld_fasttimo_vnet();
|
||||
mld_fasttimo_vnet(&inmh);
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
VNET_LIST_RUNLOCK_NOSLEEP();
|
||||
in6m_release_list_deferred(&inmh);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1328,15 +1345,15 @@ mld_fasttimo(void)
|
||||
* VIMAGE: Assume caller has set up our curvnet.
|
||||
*/
|
||||
static void
|
||||
mld_fasttimo_vnet(void)
|
||||
mld_fasttimo_vnet(struct in6_multi_head *inmh)
|
||||
{
|
||||
struct epoch_tracker et;
|
||||
struct mbufq scq; /* State-change packets */
|
||||
struct mbufq qrq; /* Query response packets */
|
||||
struct ifnet *ifp;
|
||||
struct mld_ifsoftc *mli;
|
||||
struct ifmultiaddr *ifma, *next;
|
||||
struct in6_multi *inm, *tinm;
|
||||
struct in6_multi_head inmh;
|
||||
struct ifmultiaddr *ifma;
|
||||
struct in6_multi *inm;
|
||||
int uri_fasthz;
|
||||
|
||||
uri_fasthz = 0;
|
||||
@ -1351,7 +1368,6 @@ mld_fasttimo_vnet(void)
|
||||
!V_state_change_timers_running6)
|
||||
return;
|
||||
|
||||
SLIST_INIT(&inmh);
|
||||
IN6_MULTI_LIST_LOCK();
|
||||
MLD_LOCK();
|
||||
|
||||
@ -1397,25 +1413,20 @@ mld_fasttimo_vnet(void)
|
||||
}
|
||||
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
restart:
|
||||
CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
NET_EPOCH_ENTER_ET(et);
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
switch (mli->mli_version) {
|
||||
case MLD_VERSION_1:
|
||||
mld_v1_process_group_timer(&inmh, inm);
|
||||
mld_v1_process_group_timer(inmh, inm);
|
||||
break;
|
||||
case MLD_VERSION_2:
|
||||
mld_v2_process_group_timers(&inmh, &qrq,
|
||||
mld_v2_process_group_timers(inmh, &qrq,
|
||||
&scq, inm, uri_fasthz);
|
||||
break;
|
||||
}
|
||||
if (__predict_false(ifma6_restart)) {
|
||||
ifma6_restart = false;
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
|
||||
@ -1429,9 +1440,8 @@ mld_fasttimo_vnet(void)
|
||||
* IF_ADDR_LOCK internally as well as
|
||||
* ip6_output() to transmit a packet.
|
||||
*/
|
||||
SLIST_FOREACH_SAFE(inm, &inmh, in6m_nrele, tinm) {
|
||||
SLIST_REMOVE_HEAD(&inmh,
|
||||
in6m_nrele);
|
||||
while ((inm = SLIST_FIRST(inmh)) != NULL) {
|
||||
SLIST_REMOVE_HEAD(inmh, in6m_defer);
|
||||
(void)mld_v1_transmit_report(inm,
|
||||
MLD_LISTENER_REPORT);
|
||||
}
|
||||
@ -1439,14 +1449,9 @@ mld_fasttimo_vnet(void)
|
||||
case MLD_VERSION_2:
|
||||
mld_dispatch_queue(&qrq, 0);
|
||||
mld_dispatch_queue(&scq, 0);
|
||||
|
||||
/*
|
||||
* Free the in_multi reference(s) for
|
||||
* this lifecycle.
|
||||
*/
|
||||
in6m_release_list_deferred(&inmh);
|
||||
break;
|
||||
}
|
||||
NET_EPOCH_EXIT_ET(et);
|
||||
}
|
||||
|
||||
out_locked:
|
||||
@ -1486,8 +1491,7 @@ mld_v1_process_group_timer(struct in6_multi_head *inmh, struct in6_multi *inm)
|
||||
case MLD_REPORTING_MEMBER:
|
||||
if (report_timer_expired) {
|
||||
inm->in6m_state = MLD_IDLE_MEMBER;
|
||||
in6m_disconnect(inm);
|
||||
in6m_rele_locked(inmh, inm);
|
||||
SLIST_INSERT_HEAD(inmh, inm, in6m_defer);
|
||||
}
|
||||
break;
|
||||
case MLD_G_QUERY_PENDING_MEMBER:
|
||||
@ -1611,7 +1615,7 @@ mld_v2_process_group_timers(struct in6_multi_head *inmh,
|
||||
if (inm->in6m_state == MLD_LEAVING_MEMBER &&
|
||||
inm->in6m_scrv == 0) {
|
||||
inm->in6m_state = MLD_NOT_MEMBER;
|
||||
in6m_disconnect(inm);
|
||||
in6m_disconnect_locked(inmh, inm);
|
||||
in6m_rele_locked(inmh, inm);
|
||||
}
|
||||
}
|
||||
@ -1656,10 +1660,11 @@ mld_set_version(struct mld_ifsoftc *mli, const int version)
|
||||
static void
|
||||
mld_v2_cancel_link_timers(struct mld_ifsoftc *mli)
|
||||
{
|
||||
struct ifmultiaddr *ifma, *next;
|
||||
struct epoch_tracker et;
|
||||
struct in6_multi_head inmh;
|
||||
struct ifmultiaddr *ifma;
|
||||
struct ifnet *ifp;
|
||||
struct in6_multi *inm;
|
||||
struct in6_multi_head inmh;
|
||||
|
||||
CTR3(KTR_MLD, "%s: cancel v2 timers on ifp %p(%s)", __func__,
|
||||
mli->mli_ifp, if_name(mli->mli_ifp));
|
||||
@ -1682,12 +1687,11 @@ mld_v2_cancel_link_timers(struct mld_ifsoftc *mli)
|
||||
ifp = mli->mli_ifp;
|
||||
|
||||
IF_ADDR_WLOCK(ifp);
|
||||
restart:
|
||||
CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
NET_EPOCH_ENTER_ET(et);
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
switch (inm->in6m_state) {
|
||||
case MLD_NOT_MEMBER:
|
||||
case MLD_SILENT_MEMBER:
|
||||
@ -1702,9 +1706,7 @@ mld_v2_cancel_link_timers(struct mld_ifsoftc *mli)
|
||||
* version, we need to release the final
|
||||
* reference held for issuing the INCLUDE {}.
|
||||
*/
|
||||
in6m_disconnect(inm);
|
||||
in6m_rele_locked(&inmh, inm);
|
||||
ifma->ifma_protospec = NULL;
|
||||
/* FALLTHROUGH */
|
||||
case MLD_G_QUERY_PENDING_MEMBER:
|
||||
case MLD_SG_QUERY_PENDING_MEMBER:
|
||||
@ -1720,11 +1722,8 @@ mld_v2_cancel_link_timers(struct mld_ifsoftc *mli)
|
||||
mbufq_drain(&inm->in6m_scq);
|
||||
break;
|
||||
}
|
||||
if (__predict_false(ifma6_restart)) {
|
||||
ifma6_restart = false;
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
NET_EPOCH_EXIT_ET(et);
|
||||
IF_ADDR_WUNLOCK(ifp);
|
||||
in6m_release_list_deferred(&inmh);
|
||||
}
|
||||
@ -1896,6 +1895,14 @@ mld_change_state(struct in6_multi *inm, const int delay)
|
||||
|
||||
error = 0;
|
||||
|
||||
/*
|
||||
* Check if the in6_multi has already been disconnected.
|
||||
*/
|
||||
if (inm->in6m_ifp == NULL) {
|
||||
CTR1(KTR_MLD, "%s: inm is disconnected", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to detect if the upper layer just asked us to change state
|
||||
* for an interface which has now gone away.
|
||||
@ -2006,6 +2013,7 @@ mld_initial_join(struct in6_multi *inm, struct mld_ifsoftc *mli,
|
||||
if (mli->mli_version == MLD_VERSION_2 &&
|
||||
inm->in6m_state == MLD_LEAVING_MEMBER) {
|
||||
inm->in6m_refcount--;
|
||||
MPASS(inm->in6m_refcount > 0);
|
||||
}
|
||||
inm->in6m_state = MLD_REPORTING_MEMBER;
|
||||
|
||||
@ -3009,11 +3017,9 @@ mld_v2_dispatch_general_query(struct mld_ifsoftc *mli)
|
||||
|
||||
IF_ADDR_RLOCK(ifp);
|
||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6 ||
|
||||
ifma->ifma_protospec == NULL)
|
||||
inm = in6m_ifmultiaddr_get_inm(ifma);
|
||||
if (inm == NULL)
|
||||
continue;
|
||||
|
||||
inm = (struct in6_multi *)ifma->ifma_protospec;
|
||||
KASSERT(ifp == inm->in6m_ifp,
|
||||
("%s: inconsistent ifp", __func__));
|
||||
|
||||
|
@ -160,12 +160,13 @@ struct mld_ifsoftc {
|
||||
#define MLD_IFINFO(ifp) \
|
||||
(((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->mld_ifinfo)
|
||||
|
||||
struct in6_multi_head;
|
||||
int mld_change_state(struct in6_multi *, const int);
|
||||
struct mld_ifsoftc *
|
||||
mld_domifattach(struct ifnet *);
|
||||
void mld_domifdetach(struct ifnet *);
|
||||
void mld_fasttimo(void);
|
||||
void mld_ifdetach(struct ifnet *);
|
||||
void mld_ifdetach(struct ifnet *, struct in6_multi_head *);
|
||||
int mld_input(struct mbuf *, int, int);
|
||||
void mld_slowtimo(void);
|
||||
|
||||
|
@ -146,6 +146,9 @@ enum {
|
||||
/*
|
||||
* Function definitions.
|
||||
*/
|
||||
int ipfw_chk(struct ip_fw_args *args);
|
||||
struct mbuf *ipfw_send_pkt(struct mbuf *, struct ipfw_flow_id *,
|
||||
u_int32_t, u_int32_t, int);
|
||||
|
||||
/* attach (arg = 1) or detach (arg = 0) hooks */
|
||||
int ipfw_attach_hooks(int);
|
||||
@ -156,6 +159,7 @@ void ipfw_nat_destroy(void);
|
||||
/* In ip_fw_log.c */
|
||||
struct ip;
|
||||
struct ip_fw_chain;
|
||||
|
||||
void ipfw_bpf_init(int);
|
||||
void ipfw_bpf_uninit(int);
|
||||
void ipfw_bpf_mtap2(void *, u_int, struct mbuf *);
|
||||
@ -168,6 +172,7 @@ VNET_DECLARE(int, verbose_limit);
|
||||
#define V_verbose_limit VNET(verbose_limit)
|
||||
|
||||
/* In ip_fw_dynamic.c */
|
||||
struct sockopt_data;
|
||||
|
||||
enum { /* result for matching dynamic rules */
|
||||
MATCH_REVERSE = 0,
|
||||
@ -176,19 +181,6 @@ enum { /* result for matching dynamic rules */
|
||||
MATCH_UNKNOWN,
|
||||
};
|
||||
|
||||
/*
|
||||
* The lock for dynamic rules is only used once outside the file,
|
||||
* and only to release the result of lookup_dyn_rule().
|
||||
* Eventually we may implement it with a callback on the function.
|
||||
*/
|
||||
struct ip_fw_chain;
|
||||
struct sockopt_data;
|
||||
int ipfw_is_dyn_rule(struct ip_fw *rule);
|
||||
void ipfw_expire_dyn_states(struct ip_fw_chain *, ipfw_range_tlv *);
|
||||
|
||||
struct tcphdr;
|
||||
struct mbuf *ipfw_send_pkt(struct mbuf *, struct ipfw_flow_id *,
|
||||
u_int32_t, u_int32_t, int);
|
||||
/*
|
||||
* Macro to determine that we need to do or redo dynamic state lookup.
|
||||
* direction == MATCH_UNKNOWN means that this is first lookup, then we need
|
||||
@ -219,13 +211,17 @@ struct ip_fw *ipfw_dyn_lookup_state(const struct ip_fw_args *args,
|
||||
const void *ulp, int pktlen, const ipfw_insn *cmd,
|
||||
struct ipfw_dyn_info *info);
|
||||
|
||||
int ipfw_is_dyn_rule(struct ip_fw *rule);
|
||||
void ipfw_expire_dyn_states(struct ip_fw_chain *, ipfw_range_tlv *);
|
||||
void ipfw_get_dynamic(struct ip_fw_chain *chain, char **bp, const char *ep);
|
||||
int ipfw_dump_states(struct ip_fw_chain *chain, struct sockopt_data *sd);
|
||||
|
||||
void ipfw_dyn_init(struct ip_fw_chain *); /* per-vnet initialization */
|
||||
void ipfw_dyn_uninit(int); /* per-vnet deinitialization */
|
||||
int ipfw_dyn_len(void);
|
||||
uint32_t ipfw_dyn_get_count(void);
|
||||
uint32_t ipfw_dyn_get_count(uint32_t *, int *);
|
||||
void ipfw_dyn_reset_eaction(struct ip_fw_chain *ch, uint16_t eaction_id,
|
||||
uint16_t default_id, uint16_t instance_id);
|
||||
|
||||
/* common variables */
|
||||
VNET_DECLARE(int, fw_one_pass);
|
||||
@ -280,7 +276,9 @@ struct ip_fw {
|
||||
uint32_t id; /* rule id */
|
||||
uint32_t cached_id; /* used by jump_fast */
|
||||
uint32_t cached_pos; /* used by jump_fast */
|
||||
uint32_t refcnt; /* number of references */
|
||||
|
||||
struct ip_fw *next; /* linked list of deleted rules */
|
||||
ipfw_insn cmd[1]; /* storage for commands */
|
||||
};
|
||||
|
||||
@ -650,7 +648,6 @@ void ipfw_init_skipto_cache(struct ip_fw_chain *chain);
|
||||
void ipfw_destroy_skipto_cache(struct ip_fw_chain *chain);
|
||||
int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id);
|
||||
int ipfw_ctl3(struct sockopt *sopt);
|
||||
int ipfw_chk(struct ip_fw_args *args);
|
||||
int ipfw_add_protected_rule(struct ip_fw_chain *chain, struct ip_fw *rule,
|
||||
int locked);
|
||||
void ipfw_reap_add(struct ip_fw_chain *chain, struct ip_fw **head,
|
||||
@ -659,7 +656,9 @@ void ipfw_reap_rules(struct ip_fw *head);
|
||||
void ipfw_init_counters(void);
|
||||
void ipfw_destroy_counters(void);
|
||||
struct ip_fw *ipfw_alloc_rule(struct ip_fw_chain *chain, size_t rulesize);
|
||||
void ipfw_free_rule(struct ip_fw *rule);
|
||||
int ipfw_match_range(struct ip_fw *rule, ipfw_range_tlv *rt);
|
||||
int ipfw_mark_object_kidx(uint32_t *bmask, uint16_t etlv, uint16_t kidx);
|
||||
|
||||
typedef int (sopt_handler_f)(struct ip_fw_chain *ch,
|
||||
ip_fw3_opheader *op3, struct sockopt_data *sd);
|
||||
@ -758,6 +757,10 @@ uint16_t ipfw_add_eaction(struct ip_fw_chain *ch, ipfw_eaction_t handler,
|
||||
int ipfw_del_eaction(struct ip_fw_chain *ch, uint16_t eaction_id);
|
||||
int ipfw_run_eaction(struct ip_fw_chain *ch, struct ip_fw_args *args,
|
||||
ipfw_insn *cmd, int *done);
|
||||
int ipfw_reset_eaction(struct ip_fw_chain *ch, struct ip_fw *rule,
|
||||
uint16_t eaction_id, uint16_t default_id, uint16_t instance_id);
|
||||
int ipfw_reset_eaction_instance(struct ip_fw_chain *ch, uint16_t eaction_id,
|
||||
uint16_t instance_id);
|
||||
|
||||
/* In ip_fw_table.c */
|
||||
struct table_info;
|
||||
|
@ -3589,14 +3589,18 @@ DIOCCHANGEADDR_error:
|
||||
struct pf_src_node *n, *p, *pstore;
|
||||
uint32_t i, nr = 0;
|
||||
|
||||
for (i = 0, sh = V_pf_srchash; i <= pf_srchashmask;
|
||||
i++, sh++) {
|
||||
PF_HASHROW_LOCK(sh);
|
||||
LIST_FOREACH(n, &sh->nodes, entry)
|
||||
nr++;
|
||||
PF_HASHROW_UNLOCK(sh);
|
||||
}
|
||||
|
||||
psn->psn_len = min(psn->psn_len,
|
||||
sizeof(struct pf_src_node) * nr);
|
||||
|
||||
if (psn->psn_len == 0) {
|
||||
for (i = 0, sh = V_pf_srchash; i <= pf_srchashmask;
|
||||
i++, sh++) {
|
||||
PF_HASHROW_LOCK(sh);
|
||||
LIST_FOREACH(n, &sh->nodes, entry)
|
||||
nr++;
|
||||
PF_HASHROW_UNLOCK(sh);
|
||||
}
|
||||
psn->psn_len = sizeof(struct pf_src_node) * nr;
|
||||
break;
|
||||
}
|
||||
@ -3997,20 +4001,6 @@ shutdown_pf(void)
|
||||
|
||||
/* status does not use malloced mem so no need to cleanup */
|
||||
/* fingerprints and interfaces have their own cleanup code */
|
||||
|
||||
/* Free counters last as we updated them during shutdown. */
|
||||
counter_u64_free(V_pf_default_rule.states_cur);
|
||||
counter_u64_free(V_pf_default_rule.states_tot);
|
||||
counter_u64_free(V_pf_default_rule.src_nodes);
|
||||
|
||||
for (int i = 0; i < PFRES_MAX; i++)
|
||||
counter_u64_free(V_pf_status.counters[i]);
|
||||
for (int i = 0; i < LCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.lcounters[i]);
|
||||
for (int i = 0; i < FCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.fcounters[i]);
|
||||
for (int i = 0; i < SCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.scounters[i]);
|
||||
} while(0);
|
||||
|
||||
return (error);
|
||||
@ -4240,6 +4230,20 @@ pf_unload_vnet(void)
|
||||
pf_cleanup();
|
||||
if (IS_DEFAULT_VNET(curvnet))
|
||||
pf_mtag_cleanup();
|
||||
|
||||
/* Free counters last as we updated them during shutdown. */
|
||||
counter_u64_free(V_pf_default_rule.states_cur);
|
||||
counter_u64_free(V_pf_default_rule.states_tot);
|
||||
counter_u64_free(V_pf_default_rule.src_nodes);
|
||||
|
||||
for (int i = 0; i < PFRES_MAX; i++)
|
||||
counter_u64_free(V_pf_status.counters[i]);
|
||||
for (int i = 0; i < LCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.lcounters[i]);
|
||||
for (int i = 0; i < FCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.fcounters[i]);
|
||||
for (int i = 0; i < SCNT_MAX; i++)
|
||||
counter_u64_free(V_pf_status.scounters[i]);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -286,7 +286,7 @@ static void page_free(void *, vm_size_t, uint8_t);
|
||||
#ifndef __rtems__
|
||||
static void pcpu_page_free(void *, vm_size_t, uint8_t);
|
||||
#endif /* __rtems__ */
|
||||
static uma_slab_t keg_alloc_slab(uma_keg_t, uma_zone_t, int, int);
|
||||
static uma_slab_t keg_alloc_slab(uma_keg_t, uma_zone_t, int, int, int);
|
||||
static void cache_drain(uma_zone_t);
|
||||
static void bucket_drain(uma_zone_t, uma_bucket_t);
|
||||
static void bucket_cache_drain(uma_zone_t zone);
|
||||
@ -1120,20 +1120,22 @@ zone_drain(uma_zone_t zone)
|
||||
* otherwise the keg will be left unlocked.
|
||||
*
|
||||
* Arguments:
|
||||
* wait Shall we wait?
|
||||
* flags Wait flags for the item initialization routine
|
||||
* aflags Wait flags for the slab allocation
|
||||
*
|
||||
* Returns:
|
||||
* The slab that was allocated or NULL if there is no memory and the
|
||||
* caller specified M_NOWAIT.
|
||||
*/
|
||||
static uma_slab_t
|
||||
keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int wait)
|
||||
keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int flags,
|
||||
int aflags)
|
||||
{
|
||||
uma_alloc allocf;
|
||||
uma_slab_t slab;
|
||||
unsigned long size;
|
||||
uint8_t *mem;
|
||||
uint8_t flags;
|
||||
uint8_t sflags;
|
||||
int i;
|
||||
|
||||
KASSERT(domain >= 0 && domain < vm_ndomains,
|
||||
@ -1146,7 +1148,7 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int wait)
|
||||
slab = NULL;
|
||||
mem = NULL;
|
||||
if (keg->uk_flags & UMA_ZONE_OFFPAGE) {
|
||||
slab = zone_alloc_item(keg->uk_slabzone, NULL, domain, wait);
|
||||
slab = zone_alloc_item(keg->uk_slabzone, NULL, domain, aflags);
|
||||
if (slab == NULL)
|
||||
goto out;
|
||||
}
|
||||
@ -1159,16 +1161,16 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int wait)
|
||||
*/
|
||||
|
||||
if ((keg->uk_flags & UMA_ZONE_MALLOC) == 0)
|
||||
wait |= M_ZERO;
|
||||
aflags |= M_ZERO;
|
||||
else
|
||||
wait &= ~M_ZERO;
|
||||
aflags &= ~M_ZERO;
|
||||
|
||||
if (keg->uk_flags & UMA_ZONE_NODUMP)
|
||||
wait |= M_NODUMP;
|
||||
aflags |= M_NODUMP;
|
||||
|
||||
/* zone is passed for legacy reasons. */
|
||||
size = keg->uk_ppera * PAGE_SIZE;
|
||||
mem = allocf(zone, size, domain, &flags, wait);
|
||||
mem = allocf(zone, size, domain, &sflags, aflags);
|
||||
if (mem == NULL) {
|
||||
if (keg->uk_flags & UMA_ZONE_OFFPAGE)
|
||||
zone_free_item(keg->uk_slabzone, slab, NULL, SKIP_NONE);
|
||||
@ -1188,7 +1190,7 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int wait)
|
||||
slab->us_keg = keg;
|
||||
slab->us_data = mem;
|
||||
slab->us_freecount = keg->uk_ipers;
|
||||
slab->us_flags = flags;
|
||||
slab->us_flags = sflags;
|
||||
slab->us_domain = domain;
|
||||
BIT_FILL(SLAB_SETSIZE, &slab->us_free);
|
||||
#ifdef INVARIANTS
|
||||
@ -1198,7 +1200,7 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t zone, int domain, int wait)
|
||||
if (keg->uk_init != NULL) {
|
||||
for (i = 0; i < keg->uk_ipers; i++)
|
||||
if (keg->uk_init(slab->us_data + (keg->uk_rsize * i),
|
||||
keg->uk_size, wait) != 0)
|
||||
keg->uk_size, flags) != 0)
|
||||
break;
|
||||
if (i != keg->uk_ipers) {
|
||||
keg_free_slab(keg, slab, i);
|
||||
@ -2939,7 +2941,7 @@ restart:
|
||||
msleep(keg, &keg->uk_lock, PVM, "keglimit", 0);
|
||||
continue;
|
||||
}
|
||||
slab = keg_alloc_slab(keg, zone, domain, aflags);
|
||||
slab = keg_alloc_slab(keg, zone, domain, flags, aflags);
|
||||
/*
|
||||
* If we got a slab here it's safe to mark it partially used
|
||||
* and return. We assume that the caller is going to remove
|
||||
@ -3866,7 +3868,7 @@ uma_prealloc(uma_zone_t zone, int items)
|
||||
uma_domain_t dom;
|
||||
uma_slab_t slab;
|
||||
uma_keg_t keg;
|
||||
int domain, flags, slabs;
|
||||
int aflags, domain, slabs;
|
||||
|
||||
keg = zone_first_keg(zone);
|
||||
if (keg == NULL)
|
||||
@ -3875,17 +3877,27 @@ uma_prealloc(uma_zone_t zone, int items)
|
||||
slabs = items / keg->uk_ipers;
|
||||
if (slabs * keg->uk_ipers < items)
|
||||
slabs++;
|
||||
flags = M_WAITOK;
|
||||
vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain, &flags);
|
||||
while (slabs-- > 0) {
|
||||
slab = keg_alloc_slab(keg, zone, domain, flags);
|
||||
if (slab == NULL)
|
||||
return;
|
||||
MPASS(slab->us_keg == keg);
|
||||
dom = &keg->uk_domain[slab->us_domain];
|
||||
LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
|
||||
if (vm_domainset_iter_policy(&di, &domain) != 0)
|
||||
break;
|
||||
aflags = M_NOWAIT;
|
||||
vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
|
||||
&aflags);
|
||||
for (;;) {
|
||||
slab = keg_alloc_slab(keg, zone, domain, M_WAITOK,
|
||||
aflags);
|
||||
if (slab != NULL) {
|
||||
MPASS(slab->us_keg == keg);
|
||||
dom = &keg->uk_domain[slab->us_domain];
|
||||
LIST_INSERT_HEAD(&dom->ud_free_slab, slab,
|
||||
us_link);
|
||||
break;
|
||||
}
|
||||
KEG_LOCK(keg);
|
||||
if (vm_domainset_iter_policy(&di, &domain) != 0) {
|
||||
KEG_UNLOCK(keg);
|
||||
vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask);
|
||||
KEG_LOCK(keg);
|
||||
}
|
||||
}
|
||||
}
|
||||
KEG_UNLOCK(keg);
|
||||
}
|
||||
|
@ -145,6 +145,7 @@
|
||||
#define USB_VENDOR_SEAGATE 0x0477 /* Seagate */
|
||||
#define USB_VENDOR_CONNECTIX 0x0478 /* Connectix */
|
||||
#define USB_VENDOR_SEMTECH 0x047a /* Semtech */
|
||||
#define USB_VENDOR_DELL2 0x047c /* Dell */
|
||||
#define USB_VENDOR_KENSINGTON 0x047d /* Kensington */
|
||||
#define USB_VENDOR_LUCENT 0x047e /* Lucent */
|
||||
#define USB_VENDOR_PLANTRONICS 0x047f /* Plantronics */
|
||||
@ -559,6 +560,7 @@
|
||||
#define USB_VENDOR_CMEDIA 0x0d8c /* CMEDIA */
|
||||
#define USB_VENDOR_CONCEPTRONIC 0x0d8e /* Conceptronic */
|
||||
#define USB_VENDOR_SKANHEX 0x0d96 /* Skanhex Technology, Inc. */
|
||||
#define USB_VENDOR_POWERCOM 0x0d9f /* PowerCOM */
|
||||
#define USB_VENDOR_MSI 0x0db0 /* Micro Star International */
|
||||
#define USB_VENDOR_ELCON 0x0db7 /* ELCON Systemtechnik */
|
||||
#define USB_VENDOR_UNKNOWN4 0x0dcd /* Unknown vendor */
|
||||
@ -566,6 +568,7 @@
|
||||
#define USB_VENDOR_SITECOMEU 0x0df6 /* Sitecom Europe */
|
||||
#define USB_VENDOR_MOBILEACTION 0x0df7 /* Mobile Action */
|
||||
#define USB_VENDOR_AMIGO 0x0e0b /* Amigo Technology */
|
||||
#define USB_VENDOR_SMART2 0x0e39 /* Smart Modular Technologies */
|
||||
#define USB_VENDOR_SPEEDDRAGON 0x0e55 /* Speed Dragon Multimedia */
|
||||
#define USB_VENDOR_HAWKING 0x0e66 /* Hawking */
|
||||
#define USB_VENDOR_FOSSIL 0x0e67 /* Fossil, Inc */
|
||||
@ -1370,8 +1373,16 @@
|
||||
#define USB_PRODUCT_BELKIN_F5U208 0x0208 /* F5U208 VideoBus II */
|
||||
#define USB_PRODUCT_BELKIN_F5U237 0x0237 /* F5U237 USB 2.0 7-Port Hub */
|
||||
#define USB_PRODUCT_BELKIN_F5U257 0x0257 /* F5U257 Serial */
|
||||
#define USB_PRODUCT_BELKIN_F6H375USB 0x0375 /* F6H375-USB */
|
||||
#define USB_PRODUCT_BELKIN_F5U409 0x0409 /* F5U409 Serial */
|
||||
#define USB_PRODUCT_BELKIN_F6C550AVR 0x0551 /* F6C550-AVR UPS */
|
||||
#define USB_PRODUCT_BELKIN_F6C1250TWRK 0x0750 /* F6C1250-TW-RK */
|
||||
#define USB_PRODUCT_BELKIN_F6C1500TWRK 0x0751 /* F6C1500-TW-RK */
|
||||
#define USB_PRODUCT_BELKIN_F6C900UNV 0x0900 /* F6C900-UNV */
|
||||
#define USB_PRODUCT_BELKIN_F6C100UNV 0x0910 /* F6C100-UNV */
|
||||
#define USB_PRODUCT_BELKIN_F6C120UNV 0x0912 /* F6C120-UNV UPS */
|
||||
#define USB_PRODUCT_BELKIN_F6C800UNV 0x0980 /* F6C800-UNV */
|
||||
#define USB_PRODUCT_BELKIN_F6C1100UNV 0x1100 /* F6C1100-UNV, F6C1200-UNV */
|
||||
#define USB_PRODUCT_BELKIN_F5U120 0x1203 /* F5U120-PC Hub */
|
||||
#define USB_PRODUCT_BELKIN_RTL8188CU 0x1102 /* RTL8188CU Wireless Adapter */
|
||||
#define USB_PRODUCT_BELKIN_F9L1103 0x1103 /* F9L1103 Wireless Adapter */
|
||||
@ -1575,9 +1586,11 @@
|
||||
|
||||
/* Corsair products */
|
||||
#define USB_PRODUCT_CORSAIR_K60 0x0a60 /* Corsair Vengeance K60 keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_K68 0x1b3f /* Corsair Gaming K68 keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_K70 0x1b09 /* Corsair Vengeance K70 keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_K70_RGB 0x1b13 /* Corsair K70 RGB Keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_STRAFE 0x1b15 /* Cossair STRAFE Gaming keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_STRAFE 0x1b15 /* Corsair STRAFE Gaming keyboard */
|
||||
#define USB_PRODUCT_CORSAIR_STRAFE2 0x1b44 /* Corsair STRAFE Gaming keyboard */
|
||||
|
||||
/* Creative products */
|
||||
#define USB_PRODUCT_CREATIVE_NOMAD_II 0x1002 /* Nomad II MP3 player */
|
||||
@ -1605,7 +1618,9 @@
|
||||
#define USB_PRODUCT_CURITEL_UM175 0x3714 /* EVDO modem */
|
||||
|
||||
/* CyberPower products */
|
||||
#define USB_PRODUCT_CYBERPOWER_BC900D 0x0005 /* 900AVR/BC900D, CP1200AVR/BC1200D */
|
||||
#define USB_PRODUCT_CYBERPOWER_1500CAVRLCD 0x0501 /* 1500CAVRLCD */
|
||||
#define USB_PRODUCT_CYBERPOWER_OR2200LCDRM2U 0x0601 /* OR2200LCDRM2U */
|
||||
|
||||
/* CyberTAN Technology products */
|
||||
#define USB_PRODUCT_CYBERTAN_TG54USB 0x1666 /* TG54USB */
|
||||
@ -1657,6 +1672,7 @@
|
||||
#define USB_PRODUCT_DELL_U5730_2 0x8181 /* Dell 5730 3G */
|
||||
#define USB_PRODUCT_DELL_U5730_3 0x8182 /* Dell 5730 3G */
|
||||
#define USB_PRODUCT_DELL_DW700 0x9500 /* Dell DW700 GPS */
|
||||
#define USB_PRODUCT_DELL2_VARIOUS_UPS 0xffff /* Various UPS Models */
|
||||
|
||||
/* Delorme Paublishing products */
|
||||
#define USB_PRODUCT_DELORME_EARTHMATE 0x0100 /* Earthmate GPS */
|
||||
@ -2405,6 +2421,8 @@
|
||||
#define USB_PRODUCT_HP3_RTL8188CU 0x1629 /* RTL8188CU */
|
||||
#define USB_PRODUCT_HP_P2000U 0x1801 /* Inkjet P-2000U */
|
||||
#define USB_PRODUCT_HP_HS2300 0x1e1d /* HS2300 HSDPA (aka MC8775) */
|
||||
#define USB_PRODUCT_HP_T500 0x1f01 /* T500 */
|
||||
#define USB_PRODUCT_HP_T750 0x1f02 /* T750 */
|
||||
#define USB_PRODUCT_HP_640C 0x2004 /* DeskJet 640c */
|
||||
#define USB_PRODUCT_HP_4670V 0x3005 /* ScanJet 4670v */
|
||||
#define USB_PRODUCT_HP_P1100 0x3102 /* Photosmart P1100 */
|
||||
@ -2779,6 +2797,7 @@
|
||||
|
||||
/* Liebert products */
|
||||
#define USB_PRODUCT_LIEBERT_POWERSURE_PXT 0xffff /* PowerSure Personal XT */
|
||||
#define USB_PRODUCT_LIEBERT2_POWERSURE_PSA 0x0001 /* PowerSure PSA UPS */
|
||||
#define USB_PRODUCT_LIEBERT2_PSI1000 0x0004 /* UPS PSI 1000 FW:08 */
|
||||
|
||||
/* Link Instruments Inc. products */
|
||||
@ -2828,6 +2847,7 @@
|
||||
#define USB_PRODUCT_LOGITECH_UN53B 0xc032 /* iFeel MouseMan */
|
||||
#define USB_PRODUCT_LOGITECH_WMPAD 0xc208 /* WingMan GamePad Extreme */
|
||||
#define USB_PRODUCT_LOGITECH_WMRPAD 0xc20a /* WingMan RumblePad */
|
||||
#define USB_PRODUCT_LOGITECH_G510S 0xc22d /* G510s Keyboard */
|
||||
#define USB_PRODUCT_LOGITECH_WMJOY 0xc281 /* WingMan Force joystick */
|
||||
#define USB_PRODUCT_LOGITECH_BB13 0xc401 /* USB-PS/2 Trackball */
|
||||
#define USB_PRODUCT_LOGITECH_RK53 0xc501 /* Cordless mouse */
|
||||
@ -3704,6 +3724,13 @@
|
||||
#define USB_PRODUCT_PLX_TESTBOARD 0x9060 /* test board */
|
||||
#define USB_PRODUCT_PLX_CA42 0xac70 /* CA-42 */
|
||||
|
||||
/* PowerCOM products */
|
||||
#define USB_PRODUCT_POWERCOM_IMPERIAL_SERIES 0x00a2 /* IMPERIAL Series */
|
||||
#define USB_PRODUCT_POWERCOM_SMART_KING_PRO 0x00a3 /* Smart KING Pro */
|
||||
#define USB_PRODUCT_POWERCOM_WOW 0x00a4 /* WOW */
|
||||
#define USB_PRODUCT_POWERCOM_VANGUARD 0x00a5 /* Vanguard */
|
||||
#define USB_PRODUCT_POWERCOM_BLACK_KNIGHT_PRO 0x00a6 /* Black Knight Pro */
|
||||
|
||||
/* PNY products */
|
||||
#define USB_PRODUCT_PNY_ATTACHE2 0x0010 /* USB 2.0 Flash Drive */
|
||||
|
||||
@ -3930,6 +3957,7 @@
|
||||
#define USB_PRODUCT_REALTEK_USB20CRW 0x0158 /* USB20CRW Card Reader */
|
||||
#define USB_PRODUCT_REALTEK_RTL8188ETV 0x0179 /* RTL8188ETV */
|
||||
#define USB_PRODUCT_REALTEK_RTL8188CTV 0x018a /* RTL8188CTV */
|
||||
#define USB_PRODUCT_REALTEK_RTL8821AU_2 0x0811 /* RTL8821AU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8188RU_2 0x317f /* RTL8188RU */
|
||||
#define USB_PRODUCT_REALTEK_USBKR100 0x8150 /* USBKR100 USB Ethernet */
|
||||
#define USB_PRODUCT_REALTEK_RTL8152 0x8152 /* RTL8152 USB Ethernet */
|
||||
@ -3960,7 +3988,7 @@
|
||||
#define USB_PRODUCT_REALTEK_RTL8712 0x8712 /* RTL8712 */
|
||||
#define USB_PRODUCT_REALTEK_RTL8713 0x8713 /* RTL8713 */
|
||||
#define USB_PRODUCT_REALTEK_RTL8188CU_COMBO 0x8754 /* RTL8188CU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8821AU 0xa811 /* RTL8821AU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8821AU_1 0xa811 /* RTL8821AU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8723BU 0xb720 /* RTL8723BU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8192SU 0xc512 /* RTL8192SU */
|
||||
#define USB_PRODUCT_REALTEK_RTL8812AU 0x8812 /* RTL8812AU Wireless Adapter */
|
||||
@ -4374,6 +4402,9 @@
|
||||
/* Smart Technologies products */
|
||||
#define USB_PRODUCT_SMART_PL2303 0x2303 /* Serial adapter */
|
||||
|
||||
/* Smart Modular Technologies products */
|
||||
#define USB_PRODUCT_SMART2_G2MEMKEY 0x1700 /* G2 Memory Key */
|
||||
|
||||
/* SmartBridges products */
|
||||
#define USB_PRODUCT_SMARTBRIDGES_SMARTLINK 0x0001 /* SmartLink USB Ethernet */
|
||||
#define USB_PRODUCT_SMARTBRIDGES_SMARTNIC 0x0003 /* smartNIC 2 PnP Ethernet */
|
||||
@ -4640,6 +4671,19 @@
|
||||
|
||||
/* Tripp-Lite products */
|
||||
#define USB_PRODUCT_TRIPPLITE_U209 0x2008 /* Serial */
|
||||
#define USB_PRODUCT_TRIPPLITE2_OMNIVS1000 0x0001 /* OMNIVS1000, SMART550USB */
|
||||
#define USB_PRODUCT_TRIPPLITE2_AVR550U 0x1003 /* AVR550U */
|
||||
#define USB_PRODUCT_TRIPPLITE2_AVR750U 0x1007 /* AVR750U */
|
||||
#define USB_PRODUCT_TRIPPLITE2_ECO550UPS 0x1008 /* ECO550UPS */
|
||||
#define USB_PRODUCT_TRIPPLITE2_T750_INTL 0x1f06 /* T750 INTL */
|
||||
#define USB_PRODUCT_TRIPPLITE2_RT_2200_INTL 0x1f0a /* R/T 2200 INTL */
|
||||
#define USB_PRODUCT_TRIPPLITE2_OMNI1000LCD 0x2005 /* OMNI1000LCD */
|
||||
#define USB_PRODUCT_TRIPPLITE2_OMNI900LCD 0x2007 /* OMNI900LCD */
|
||||
#define USB_PRODUCT_TRIPPLITE2_SMART_2200RMXL2U 0x3012 /* smart2200RMXL2U */
|
||||
#define USB_PRODUCT_TRIPPLITE2_UPS_3014 0x3014 /* Unknown UPS */
|
||||
#define USB_PRODUCT_TRIPPLITE2_SU1500RTXL2UA 0x4001 /* SmartOnline SU1500RTXL2UA */
|
||||
#define USB_PRODUCT_TRIPPLITE2_SU6000RT4U 0x4002 /* SmartOnline SU6000RT4U */
|
||||
#define USB_PRODUCT_TRIPPLITE2_SU1500RTXL2UA_2 0x4003 /* SmartOnline SU1500RTXL2UA */
|
||||
|
||||
/* Trumpion products */
|
||||
#define USB_PRODUCT_TRUMPION_T33520 0x1001 /* T33520 USB Flash Card Controller */
|
||||
|
@ -2287,6 +2287,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Belkin Components",
|
||||
"F5U257 Serial",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6H375USB,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6H375-USB",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U409,
|
||||
0,
|
||||
@ -2299,6 +2305,48 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Belkin Components",
|
||||
"F6C550-AVR UPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C1250TWRK,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C1250-TW-RK",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C1500TWRK,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C1500-TW-RK",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C900UNV,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C900-UNV",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C100UNV,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C100-UNV",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C120UNV,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C120-UNV UPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C800UNV,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C800-UNV",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C1100UNV,
|
||||
0,
|
||||
"Belkin Components",
|
||||
"F6C1100-UNV, F6C1200-UNV",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U120,
|
||||
0,
|
||||
@ -3205,6 +3253,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Corsair",
|
||||
"Corsair Vengeance K60 keyboard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CORSAIR, USB_PRODUCT_CORSAIR_K68,
|
||||
0,
|
||||
"Corsair",
|
||||
"Corsair Gaming K68 keyboard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CORSAIR, USB_PRODUCT_CORSAIR_K70,
|
||||
0,
|
||||
@ -3221,7 +3275,13 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
USB_VENDOR_CORSAIR, USB_PRODUCT_CORSAIR_STRAFE,
|
||||
0,
|
||||
"Corsair",
|
||||
"Cossair STRAFE Gaming keyboard",
|
||||
"Corsair STRAFE Gaming keyboard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CORSAIR, USB_PRODUCT_CORSAIR_STRAFE2,
|
||||
0,
|
||||
"Corsair",
|
||||
"Corsair STRAFE Gaming keyboard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CREATIVE, USB_PRODUCT_CREATIVE_NOMAD_II,
|
||||
@ -3313,12 +3373,24 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Curitel Communications Inc",
|
||||
"EVDO modem",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CYBERPOWER, USB_PRODUCT_CYBERPOWER_BC900D,
|
||||
0,
|
||||
"Cyber Power Systems, Inc.",
|
||||
"900AVR/BC900D, CP1200AVR/BC1200D",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CYBERPOWER, USB_PRODUCT_CYBERPOWER_1500CAVRLCD,
|
||||
0,
|
||||
"Cyber Power Systems, Inc.",
|
||||
"1500CAVRLCD",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CYBERPOWER, USB_PRODUCT_CYBERPOWER_OR2200LCDRM2U,
|
||||
0,
|
||||
"Cyber Power Systems, Inc.",
|
||||
"OR2200LCDRM2U",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_CYBERTAN, USB_PRODUCT_CYBERTAN_TG54USB,
|
||||
0,
|
||||
@ -3547,6 +3619,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Dell",
|
||||
"Dell DW700 GPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_DELL2, USB_PRODUCT_DELL2_VARIOUS_UPS,
|
||||
0,
|
||||
"Dell",
|
||||
"Various UPS Models",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE,
|
||||
0,
|
||||
@ -7123,6 +7201,18 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Hewlett Packard",
|
||||
"HS2300 HSDPA (aka MC8775)",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_HP, USB_PRODUCT_HP_T500,
|
||||
0,
|
||||
"Hewlett Packard",
|
||||
"T500",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_HP, USB_PRODUCT_HP_T750,
|
||||
0,
|
||||
"Hewlett Packard",
|
||||
"T750",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_HP, USB_PRODUCT_HP_640C,
|
||||
0,
|
||||
@ -8791,6 +8881,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Liebert",
|
||||
"PowerSure Personal XT",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_LIEBERT2, USB_PRODUCT_LIEBERT2_POWERSURE_PSA,
|
||||
0,
|
||||
"Liebert",
|
||||
"PowerSure PSA UPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_LIEBERT2, USB_PRODUCT_LIEBERT2_PSI1000,
|
||||
0,
|
||||
@ -9037,6 +9133,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Logitech",
|
||||
"WingMan RumblePad",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_G510S,
|
||||
0,
|
||||
"Logitech",
|
||||
"G510s Keyboard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_WMJOY,
|
||||
0,
|
||||
@ -13297,6 +13399,36 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"PLX",
|
||||
"CA-42",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, USB_PRODUCT_POWERCOM_IMPERIAL_SERIES,
|
||||
0,
|
||||
"PowerCOM",
|
||||
"IMPERIAL Series",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, USB_PRODUCT_POWERCOM_SMART_KING_PRO,
|
||||
0,
|
||||
"PowerCOM",
|
||||
"Smart KING Pro",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, USB_PRODUCT_POWERCOM_WOW,
|
||||
0,
|
||||
"PowerCOM",
|
||||
"WOW",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, USB_PRODUCT_POWERCOM_VANGUARD,
|
||||
0,
|
||||
"PowerCOM",
|
||||
"Vanguard",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, USB_PRODUCT_POWERCOM_BLACK_KNIGHT_PRO,
|
||||
0,
|
||||
"PowerCOM",
|
||||
"Black Knight Pro",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_PNY, USB_PRODUCT_PNY_ATTACHE2,
|
||||
0,
|
||||
@ -14413,6 +14545,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Realtek",
|
||||
"RTL8188CTV",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8821AU_2,
|
||||
0,
|
||||
"Realtek",
|
||||
"RTL8821AU",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8188RU_2,
|
||||
0,
|
||||
@ -14594,7 +14732,7 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"RTL8188CU",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8821AU,
|
||||
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8821AU_1,
|
||||
0,
|
||||
"Realtek",
|
||||
"RTL8821AU",
|
||||
@ -16657,6 +16795,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Smart Technologies",
|
||||
"Serial adapter",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_SMART2, USB_PRODUCT_SMART2_G2MEMKEY,
|
||||
0,
|
||||
"Smart Modular Technologies",
|
||||
"G2 Memory Key",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_SMARTBRIDGES, USB_PRODUCT_SMARTBRIDGES_SMARTLINK,
|
||||
0,
|
||||
@ -17689,6 +17833,84 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Tripp-Lite",
|
||||
"Serial",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_OMNIVS1000,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"OMNIVS1000, SMART550USB",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_AVR550U,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"AVR550U",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_AVR750U,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"AVR750U",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_ECO550UPS,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"ECO550UPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_T750_INTL,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"T750 INTL",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_RT_2200_INTL,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"R/T 2200 INTL",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_OMNI1000LCD,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"OMNI1000LCD",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_OMNI900LCD,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"OMNI900LCD",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_SMART_2200RMXL2U,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"smart2200RMXL2U",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_UPS_3014,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"Unknown UPS",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_SU1500RTXL2UA,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"SmartOnline SU1500RTXL2UA",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_SU6000RT4U,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"SmartOnline SU6000RT4U",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_SU1500RTXL2UA_2,
|
||||
0,
|
||||
"Tripp Lite",
|
||||
"SmartOnline SU1500RTXL2UA",
|
||||
},
|
||||
{
|
||||
USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_T33520,
|
||||
0,
|
||||
@ -19279,6 +19501,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Semtech",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_DELL2, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
"Dell",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_KENSINGTON, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
@ -21763,6 +21991,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Skanhex Technology, Inc.",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_POWERCOM, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
"PowerCOM",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_MSI, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
@ -21805,6 +22039,12 @@ const struct usb_knowndev usb_knowndevs[] = {
|
||||
"Amigo Technology",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_SMART2, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
"Smart Modular Technologies",
|
||||
NULL,
|
||||
},
|
||||
{
|
||||
USB_VENDOR_SPEEDDRAGON, 0,
|
||||
USB_KNOWNDEV_NOPROD,
|
||||
|
Loading…
x
Reference in New Issue
Block a user