summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-04 14:56:37 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-04 15:12:50 +0100
commit4a8bc9e5fa8ad765e05f16258a35b6a6d1842a3f (patch)
tree4c1708a617ad95150950e5efa31a33b13549a516
parentUpdate to FreeBSD stable/12 2019-01-29 (diff)
downloadrtems-libbsd-4a8bc9e5fa8ad765e05f16258a35b6a6d1842a3f.tar.bz2
Update to FreeBSD stable/12 2019-02-04
Git mirror commit 50f507fe430c8041715f649f179f4b0a431dd7ff.
m---------freebsd-org0
-rw-r--r--freebsd/sys/dev/led/led.c2
-rw-r--r--freebsd/sys/dev/rtwn/usb/rtwn_usb_attach.h3
-rw-r--r--freebsd/sys/dev/usb/quirk/usb_quirk.c34
-rw-r--r--freebsd/sys/dev/usb/wlan/if_rsu.c31
-rw-r--r--freebsd/sys/dev/usb/wlan/if_rsureg.h7
-rw-r--r--freebsd/sys/net/if.c12
-rw-r--r--freebsd/sys/netinet/ip_fw.h4
-rw-r--r--freebsd/sys/netinet6/in6_ifattach.c36
-rw-r--r--freebsd/sys/netinet6/in6_mcast.c73
-rw-r--r--freebsd/sys/netinet6/in6_var.h39
-rw-r--r--freebsd/sys/netinet6/mld6.c154
-rw-r--r--freebsd/sys/netinet6/mld6_var.h3
-rw-r--r--freebsd/sys/netpfil/ipfw/ip_fw_private.h33
-rw-r--r--freebsd/sys/netpfil/pf/pf_ioctl.c46
-rw-r--r--freebsd/sys/vm/uma_core.c58
-rw-r--r--rtemsbsd/include/rtems/bsd/local/usbdevs.h48
-rw-r--r--rtemsbsd/include/rtems/bsd/local/usbdevs_data.h244
18 files changed, 603 insertions, 224 deletions
diff --git a/freebsd-org b/freebsd-org
-Subproject 7005c2e76a6bfb359bf2f1acb8382c0b7a01f4b
+Subproject 50f507fe430c8041715f649f179f4b0a431dd7f
diff --git a/freebsd/sys/dev/led/led.c b/freebsd/sys/dev/led/led.c
index 70de95bb..abd90787 100644
--- a/freebsd/sys/dev/led/led.c
+++ b/freebsd/sys/dev/led/led.c
@@ -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 = {
diff --git a/freebsd/sys/dev/rtwn/usb/rtwn_usb_attach.h b/freebsd/sys/dev/rtwn/usb/rtwn_usb_attach.h
index 1b54e540..a22c39ad 100644
--- a/freebsd/sys/dev/rtwn/usb/rtwn_usb_attach.h
+++ b/freebsd/sys/dev/rtwn/usb/rtwn_usb_attach.h
@@ -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
};
diff --git a/freebsd/sys/dev/usb/quirk/usb_quirk.c b/freebsd/sys/dev/usb/quirk/usb_quirk.c
index 0fb1f56f..946ec7e4 100644
--- a/freebsd/sys/dev/usb/quirk/usb_quirk.c
+++ b/freebsd/sys/dev/usb/quirk/usb_quirk.c
@@ -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),
diff --git a/freebsd/sys/dev/usb/wlan/if_rsu.c b/freebsd/sys/dev/usb/wlan/if_rsu.c
index b730ce59..457c5616 100644
--- a/freebsd/sys/dev/usb/wlan/if_rsu.c
+++ b/freebsd/sys/dev/usb/wlan/if_rsu.c
@@ -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.
diff --git a/freebsd/sys/dev/usb/wlan/if_rsureg.h b/freebsd/sys/dev/usb/wlan/if_rsureg.h
index 973280cf..b1cd36ea 100644
--- a/freebsd/sys/dev/usb/wlan/if_rsureg.h
+++ b/freebsd/sys/dev/usb/wlan/if_rsureg.h
@@ -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;
diff --git a/freebsd/sys/net/if.c b/freebsd/sys/net/if.c
index e62553cf..588753f9 100644
--- a/freebsd/sys/net/if.c
+++ b/freebsd/sys/net/if.c
@@ -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;
diff --git a/freebsd/sys/netinet/ip_fw.h b/freebsd/sys/netinet/ip_fw.h
index e49b9ad9..41351215 100644
--- a/freebsd/sys/netinet/ip_fw.h
+++ b/freebsd/sys/netinet/ip_fw.h
@@ -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 */
diff --git a/freebsd/sys/netinet6/in6_ifattach.c b/freebsd/sys/netinet6/in6_ifattach.c
index 6af4b557..5f1128d4 100644
--- a/freebsd/sys/netinet6/in6_ifattach.c
+++ b/freebsd/sys/netinet6/in6_ifattach.c
@@ -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
diff --git a/freebsd/sys/netinet6/in6_mcast.c b/freebsd/sys/netinet6/in6_mcast.c
index 3824645d..ceeca992 100644
--- a/freebsd/sys/netinet6/in6_mcast.c
+++ b/freebsd/sys/netinet6/in6_mcast.c
@@ -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;
diff --git a/freebsd/sys/netinet6/in6_var.h b/freebsd/sys/netinet6/in6_var.h
index 5ed0ae90..f80b34f2 100644
--- a/freebsd/sys/netinet6/in6_var.h
+++ b/freebsd/sys/netinet6/in6_var.h
@@ -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 *);
diff --git a/freebsd/sys/netinet6/mld6.c b/freebsd/sys/netinet6/mld6.c
index b00f03ef..3b1d1afa 100644
--- a/freebsd/sys/netinet6/mld6.c
+++ b/freebsd/sys/netinet6/mld6.c
@@ -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);
}
@@ -1897,6 +1896,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__));
diff --git a/freebsd/sys/netinet6/mld6_var.h b/freebsd/sys/netinet6/mld6_var.h
index 166c2055..8dc2ffa4 100644
--- a/freebsd/sys/netinet6/mld6_var.h
+++ b/freebsd/sys/netinet6/mld6_var.h
@@ -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);
diff --git a/freebsd/sys/netpfil/ipfw/ip_fw_private.h b/freebsd/sys/netpfil/ipfw/ip_fw_private.h
index c389e01a..7e966d0a 100644
--- a/freebsd/sys/netpfil/ipfw/ip_fw_private.h
+++ b/freebsd/sys/netpfil/ipfw/ip_fw_private.h
@@ -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,
@@ -177,19 +182,6 @@ enum { /* result for matching dynamic rules */
};
/*
- * 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
* to do lookup.
@@ -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;
diff --git a/freebsd/sys/netpfil/pf/pf_ioctl.c b/freebsd/sys/netpfil/pf/pf_ioctl.c
index 3f732d62..695e8382 100644
--- a/freebsd/sys/netpfil/pf/pf_ioctl.c
+++ b/freebsd/sys/netpfil/pf/pf_ioctl.c
@@ -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
diff --git a/freebsd/sys/vm/uma_core.c b/freebsd/sys/vm/uma_core.c
index effc64ad..bad12385 100644
--- a/freebsd/sys/vm/uma_core.c
+++ b/freebsd/sys/vm/uma_core.c
@@ -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);
}
diff --git a/rtemsbsd/include/rtems/bsd/local/usbdevs.h b/rtemsbsd/include/rtems/bsd/local/usbdevs.h
index 709219c8..9cf84327 100644
--- a/rtemsbsd/include/rtems/bsd/local/usbdevs.h
+++ b/rtemsbsd/include/rtems/bsd/local/usbdevs.h
@@ -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 */
diff --git a/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h b/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
index cbde06a5..9262659b 100644
--- a/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
+++ b/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
@@ -2288,6 +2288,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"F5U257 Serial",
},
{
+ USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6H375USB,
+ 0,
+ "Belkin Components",
+ "F6H375-USB",
+ },
+ {
USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U409,
0,
"Belkin Components",
@@ -2300,6 +2306,48 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Belkin Components",
@@ -3206,6 +3254,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Corsair",
@@ -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,
@@ -3314,12 +3374,24 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"CyberTAN Technology",
@@ -3548,6 +3620,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Dell DW700 GPS",
},
{
+ USB_VENDOR_DELL2, USB_PRODUCT_DELL2_VARIOUS_UPS,
+ 0,
+ "Dell",
+ "Various UPS Models",
+ },
+ {
USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE,
0,
"DeLorme",
@@ -7124,6 +7202,18 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Hewlett Packard",
@@ -8792,6 +8882,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"PowerSure Personal XT",
},
{
+ USB_VENDOR_LIEBERT2, USB_PRODUCT_LIEBERT2_POWERSURE_PSA,
+ 0,
+ "Liebert",
+ "PowerSure PSA UPS",
+ },
+ {
USB_VENDOR_LIEBERT2, USB_PRODUCT_LIEBERT2_PSI1000,
0,
"Liebert",
@@ -9038,6 +9134,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"WingMan RumblePad",
},
{
+ USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_G510S,
+ 0,
+ "Logitech",
+ "G510s Keyboard",
+ },
+ {
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_WMJOY,
0,
"Logitech",
@@ -13298,6 +13400,36 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"PNY",
@@ -14414,6 +14546,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"RTL8188CTV",
},
{
+ USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8821AU_2,
+ 0,
+ "Realtek",
+ "RTL8821AU",
+ },
+ {
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8188RU_2,
0,
"Realtek",
@@ -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",
@@ -16658,6 +16796,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Serial adapter",
},
{
+ USB_VENDOR_SMART2, USB_PRODUCT_SMART2_G2MEMKEY,
+ 0,
+ "Smart Modular Technologies",
+ "G2 Memory Key",
+ },
+ {
USB_VENDOR_SMARTBRIDGES, USB_PRODUCT_SMARTBRIDGES_SMARTLINK,
0,
"SmartBridges",
@@ -17690,6 +17834,84 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Trumpion Microelectronics",
@@ -19280,6 +19502,12 @@ const struct usb_knowndev usb_knowndevs[] = {
NULL,
},
{
+ USB_VENDOR_DELL2, 0,
+ USB_KNOWNDEV_NOPROD,
+ "Dell",
+ NULL,
+ },
+ {
USB_VENDOR_KENSINGTON, 0,
USB_KNOWNDEV_NOPROD,
"Kensington",
@@ -21764,6 +21992,12 @@ const struct usb_knowndev usb_knowndevs[] = {
NULL,
},
{
+ USB_VENDOR_POWERCOM, 0,
+ USB_KNOWNDEV_NOPROD,
+ "PowerCOM",
+ NULL,
+ },
+ {
USB_VENDOR_MSI, 0,
USB_KNOWNDEV_NOPROD,
"Micro Star International",
@@ -21806,6 +22040,12 @@ const struct usb_knowndev usb_knowndevs[] = {
NULL,
},
{
+ USB_VENDOR_SMART2, 0,
+ USB_KNOWNDEV_NOPROD,
+ "Smart Modular Technologies",
+ NULL,
+ },
+ {
USB_VENDOR_SPEEDDRAGON, 0,
USB_KNOWNDEV_NOPROD,
"Speed Dragon Multimedia",