Page MenuHomeFreeBSD

D48602.diff
No OneTemporary

D48602.diff

diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -5949,7 +5949,8 @@
#ifdef LINUXKPI_DEBUG_80211
int old_rate;
- old_rate = ni->ni_vap->iv_bss->ni_txrate;
+ old_rate =
+ ieee80211_node_get_txrate_dot11rate(ni->ni_vap->iv_bss);
#endif
txs.pktlen = skb->len;
txs.flags |= IEEE80211_RATECTL_STATUS_PKTLEN;
@@ -5975,7 +5976,8 @@
if (linuxkpi_debug_80211 & D80211_TRACE_TX) {
printf("TX-RATE: %s: old %d new %d ridx %d, "
"long_retries %d\n", __func__,
- old_rate, ni->ni_vap->iv_bss->ni_txrate,
+ old_rate,
+ ieee80211_node_get_txrate_dot11rate(ni->ni_vap->iv_bss),
ridx, txs.long_retries);
}
#endif
diff --git a/sys/dev/ath/ath_rate/amrr/amrr.c b/sys/dev/ath/ath_rate/amrr/amrr.c
--- a/sys/dev/ath/ath_rate/amrr/amrr.c
+++ b/sys/dev/ath/ath_rate/amrr/amrr.c
@@ -245,8 +245,11 @@
* lowest hardware rate.
*/
if (ni->ni_rates.rs_nrates > 0) {
- ni->ni_txrate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
- amn->amn_tx_rix0 = sc->sc_rixmap[ni->ni_txrate];
+ uint8_t dot11rate;
+
+ dot11rate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
+ amn->amn_tx_rix0 = sc->sc_rixmap[dot11rate];
+ ieee80211_node_set_txrate_dot11rate(ni, dot11rate);
amn->amn_tx_rate0 = rt->info[amn->amn_tx_rix0].rateCode;
amn->amn_tx_rate0sp = amn->amn_tx_rate0 |
rt->info[amn->amn_tx_rix0].shortPreamble;
diff --git a/sys/dev/ath/ath_rate/onoe/onoe.c b/sys/dev/ath/ath_rate/onoe/onoe.c
--- a/sys/dev/ath/ath_rate/onoe/onoe.c
+++ b/sys/dev/ath/ath_rate/onoe/onoe.c
@@ -203,6 +203,7 @@
struct ieee80211vap *vap = ni->ni_vap;
const HAL_RATE_TABLE *rt = sc->sc_currates;
u_int8_t rix;
+ uint8_t dot11rate;
KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
@@ -221,8 +222,9 @@
if (ni->ni_rates.rs_nrates == 0)
goto done;
on->on_rix = rate;
- ni->ni_txrate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
- on->on_tx_rix0 = sc->sc_rixmap[ni->ni_txrate];
+ dot11rate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
+ ieee80211_node_set_txrate_dot11rate(ni, dot11rate);
+ on->on_tx_rix0 = sc->sc_rixmap[dot11rate];
on->on_tx_rate0 = rt->info[on->on_tx_rix0].rateCode;
on->on_tx_rate0sp = on->on_tx_rate0 |
@@ -389,7 +391,7 @@
if (nrate != on->on_rix) {
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"%s: %dM -> %dM (%d ok, %d err, %d retr)", __func__,
- ni->ni_txrate / 2,
+ ieee80211_node_get_txrate_kbit(ni) / 1000,
(rs->rs_rates[nrate] & IEEE80211_RATE_VAL) / 2,
on->on_tx_ok, on->on_tx_err, on->on_tx_retr);
ath_rate_update(sc, ni, nrate);
diff --git a/sys/dev/ath/ath_rate/sample/sample.c b/sys/dev/ath/ath_rate/sample/sample.c
--- a/sys/dev/ath/ath_rate/sample/sample.c
+++ b/sys/dev/ath/ath_rate/sample/sample.c
@@ -855,9 +855,13 @@
/*
* Set the visible txrate for this node.
*/
- an->an_node.ni_txrate =
- (rt->info[best_rix].phy == IEEE80211_T_HT) ?
- MCS(best_rix) : DOT11RATE(best_rix);
+ if (rt->info[best_rix].phy == IEEE80211_T_HT)
+ ieee80211_node_set_txrate_ht_mcsrate(
+ &an->an_node, MCS(best_rix));
+ else
+ ieee80211_node_set_txrate_dot11rate(
+ &an->an_node,
+ DOT11RATE(best_rix));
}
rix = sn->current_rix[size_bin];
sn->packets_since_switch[size_bin]++;
@@ -1409,9 +1413,10 @@
#endif
/* set the visible bit-rate */
if (sn->static_rix != -1)
- ni->ni_txrate = DOT11RATE(sn->static_rix);
+ ieee80211_node_set_txrate_dot11rate(ni,
+ DOT11RATE(sn->static_rix));
else
- ni->ni_txrate = RATE(0);
+ ieee80211_node_set_txrate_dot11rate(ni, RATE(0));
#undef RATE
#undef DOT11RATE
}
diff --git a/sys/dev/bwi/if_bwi.c b/sys/dev/bwi/if_bwi.c
--- a/sys/dev/bwi/if_bwi.c
+++ b/sys/dev/bwi/if_bwi.c
@@ -2944,7 +2944,7 @@
rate = rate_fb = tp->ucastrate;
} else {
rix = ieee80211_ratectl_rate(ni, NULL, pkt_len);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
if (rix > 0) {
rate_fb = ni->ni_rates.rs_rates[rix-1] &
diff --git a/sys/dev/bwn/if_bwn.c b/sys/dev/bwn/if_bwn.c
--- a/sys/dev/bwn/if_bwn.c
+++ b/sys/dev/bwn/if_bwn.c
@@ -6421,7 +6421,7 @@
rate = rate_fb = tp->ucastrate;
else {
rix = ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
if (rix > 0)
rate_fb = ni->ni_rates.rs_rates[rix - 1] &
diff --git a/sys/dev/ipw/if_ipw.c b/sys/dev/ipw/if_ipw.c
--- a/sys/dev/ipw/if_ipw.c
+++ b/sys/dev/ipw/if_ipw.c
@@ -838,8 +838,8 @@
struct ipw_softc *sc = ic->ic_softc;
/* read current transmission rate from adapter */
- vap->iv_bss->ni_txrate = ipw_cvtrate(
- ipw_read_table1(sc, IPW_INFO_CURRENT_TX_RATE) & 0xf);
+ ieee80211_node_set_txrate_dot11rate(vap->iv_bss,
+ ipw_cvtrate(ipw_read_table1(sc, IPW_INFO_CURRENT_TX_RATE) & 0xf));
ieee80211_media_status(ifp, imr);
}
diff --git a/sys/dev/iwi/if_iwi.c b/sys/dev/iwi/if_iwi.c
--- a/sys/dev/iwi/if_iwi.c
+++ b/sys/dev/iwi/if_iwi.c
@@ -927,8 +927,8 @@
/* read current transmission rate from adapter */
ni = ieee80211_ref_node(vap->iv_bss);
- ni->ni_txrate =
- iwi_cvtrate(CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE));
+ ieee80211_node_set_txrate_dot11rate(ni,
+ iwi_cvtrate(CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE)));
ieee80211_free_node(ni);
ieee80211_media_status(ifp, imr);
}
diff --git a/sys/dev/iwm/if_iwm.c b/sys/dev/iwm/if_iwm.c
--- a/sys/dev/iwm/if_iwm.c
+++ b/sys/dev/iwm/if_iwm.c
@@ -3445,7 +3445,7 @@
struct ieee80211_node *ni = &in->in_ni;
struct ieee80211vap *vap = ni->ni_vap;
int status = le16toh(tx_resp->status.status) & IWM_TX_STATUS_MSK;
- int new_rate, cur_rate = vap->iv_bss->ni_txrate;
+ int new_rate, cur_rate;
boolean_t rate_matched;
uint8_t tx_resp_rate;
@@ -3463,6 +3463,7 @@
le32toh(tx_resp->initial_rate),
(int) le16toh(tx_resp->wireless_media_time));
+ cur_rate = ieee80211_node_get_txrate_dot11rate(vap->iv_bss);
tx_resp_rate = iwm_rate_from_ucode_rate(le32toh(tx_resp->initial_rate));
/* For rate control, ignore frames sent at different initial rate */
@@ -3502,7 +3503,7 @@
ieee80211_ratectl_tx_complete(ni, txs);
int rix = ieee80211_ratectl_rate(vap->iv_bss, NULL, 0);
- new_rate = vap->iv_bss->ni_txrate;
+ new_rate = ieee80211_node_get_txrate_dot11rate(vap->iv_bss);
if (new_rate != 0 && new_rate != cur_rate) {
struct iwm_node *in = IWM_NODE(vap->iv_bss);
iwm_setrates(sc, in, rix);
@@ -3695,7 +3696,8 @@
} else {
/* for data frames, use RS table */
IWM_DPRINTF(sc, IWM_DEBUG_TXRATE, "%s: DATA\n", __func__);
- ridx = iwm_rate2ridx(sc, ni->ni_txrate);
+ ridx = iwm_rate2ridx(sc,
+ ieee80211_node_get_txrate_dot11rate(ni));
if (ridx == -1)
ridx = 0;
diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c
--- a/sys/dev/iwn/if_iwn.c
+++ b/sys/dev/iwn/if_iwn.c
@@ -4570,7 +4570,7 @@
else {
/* XXX pass pktlen */
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
/*
diff --git a/sys/dev/malo/if_malo.c b/sys/dev/malo/if_malo.c
--- a/sys/dev/malo/if_malo.c
+++ b/sys/dev/malo/if_malo.c
@@ -898,7 +898,7 @@
static const int ieeerates[] =
{ 2, 4, 11, 22, 44, 12, 18, 24, 36, 48, 96, 108 };
if (rix < nitems(ieeerates))
- ni->ni_txrate = ieeerates[rix];
+ ieee80211_node_set_txrate_dot11rate(ni, ieeerates[rix]);
}
static int
diff --git a/sys/dev/mwl/if_mwl.c b/sys/dev/mwl/if_mwl.c
--- a/sys/dev/mwl/if_mwl.c
+++ b/sys/dev/mwl/if_mwl.c
@@ -3344,6 +3344,7 @@
ni = bf->bf_node;
if (ni != NULL) {
status = le32toh(ds->Status);
+ int rate;
if (status & EAGLE_TXD_STATUS_OK) {
uint16_t Format = le16toh(ds->Format);
uint8_t txant = _IEEE80211_MASKSHIFT(Format,
@@ -3356,14 +3357,14 @@
sc->sc_stats.mst_tx_mretries++;
if (txq->qnum >= MWL_WME_AC_VO)
ic->ic_wme.wme_hipri_traffic++;
- ni->ni_txrate = _IEEE80211_MASKSHIFT(Format,
+ rate = _IEEE80211_MASKSHIFT(Format,
EAGLE_TXD_RATE);
if ((Format & EAGLE_TXD_FORMAT_HT) == 0) {
- ni->ni_txrate = mwl_cvtlegacyrix(
- ni->ni_txrate);
+ rate = mwl_cvtlegacyrix(rate);
} else
- ni->ni_txrate |= IEEE80211_RATE_MCS;
- sc->sc_stats.mst_tx_rate = ni->ni_txrate;
+ rate |= IEEE80211_RATE_MCS;
+ sc->sc_stats.mst_tx_rate = rate;
+ ieee80211_node_set_txrate_dot11rate(ni, rate);
} else {
if (status & EAGLE_TXD_STATUS_FAILED_LINK_ERROR)
sc->sc_stats.mst_tx_linkerror++;
diff --git a/sys/dev/otus/if_otus.c b/sys/dev/otus/if_otus.c
--- a/sys/dev/otus/if_otus.c
+++ b/sys/dev/otus/if_otus.c
@@ -2281,7 +2281,8 @@
rate = otus_rate_to_hw_rate(sc, tp->ucastrate);
else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = otus_rate_to_hw_rate(sc, ni->ni_txrate);
+ rate = otus_rate_to_hw_rate(sc,
+ ieee80211_node_get_txrate_dot11rate(ni));
}
phyctl = 0;
@@ -2346,9 +2347,11 @@
data->m = m;
OTUS_DPRINTF(sc, OTUS_DEBUG_XMIT,
- "%s: tx: m=%p; data=%p; len=%d mac=0x%04x phy=0x%08x rate=0x%02x, ni_txrate=%d\n",
+ "%s: tx: m=%p; data=%p; len=%d mac=0x%04x phy=0x%08x "
+ "rate=0x%02x, dot11rate=%d\n",
__func__, m, data, le16toh(head->len), macctl, phyctl,
- (int) rate, (int) ni->ni_txrate);
+ (int) rate,
+ (int) ieee80211_node_get_txrate_dot11rate(ni));
/* Submit transfer */
STAILQ_INSERT_TAIL(&sc->sc_tx_pending[OTUS_BULK_TX], data, next);
diff --git a/sys/dev/ral/rt2560.c b/sys/dev/ral/rt2560.c
--- a/sys/dev/ral/rt2560.c
+++ b/sys/dev/ral/rt2560.c
@@ -1740,7 +1740,7 @@
rate = tp->ucastrate;
} else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
@@ -1821,7 +1821,7 @@
/* remember link conditions for rate adaptation algorithm */
if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
- data->rix = ni->ni_txrate;
+ data->rix = ieee80211_node_get_txrate_dot11rate(ni);
/* XXX probably need last rssi value and not avg */
data->rssi = ic->ic_node_getrssi(ni);
} else
diff --git a/sys/dev/ral/rt2661.c b/sys/dev/ral/rt2661.c
--- a/sys/dev/ral/rt2661.c
+++ b/sys/dev/ral/rt2661.c
@@ -1431,7 +1431,7 @@
rate = tp->ucastrate;
} else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
rate &= IEEE80211_RATE_VAL;
@@ -1515,7 +1515,7 @@
/* remember link conditions for rate adaptation algorithm */
if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
- data->rix = ni->ni_txrate;
+ data->rix = ieee80211_node_get_txrate_dot11rate(ni);
/* XXX probably need last rssi value and not avg */
data->rssi = ic->ic_node_getrssi(ni);
} else
diff --git a/sys/dev/ral/rt2860.c b/sys/dev/ral/rt2860.c
--- a/sys/dev/ral/rt2860.c
+++ b/sys/dev/ral/rt2860.c
@@ -1493,7 +1493,7 @@
rate = tp->ucastrate;
} else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
rate &= IEEE80211_RATE_VAL;
diff --git a/sys/dev/rtwn/if_rtwn_tx.c b/sys/dev/rtwn/if_rtwn_tx.c
--- a/sys/dev/rtwn/if_rtwn_tx.c
+++ b/sys/dev/rtwn/if_rtwn_tx.c
@@ -143,7 +143,7 @@
if (sc->sc_ratectl == RTWN_RATECTL_NET80211) {
/* XXX pass pktlen */
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
} else {
if (ni->ni_flags & IEEE80211_NODE_HT)
rate = IEEE80211_RATE_MCS | 0x4; /* MCS4 */
diff --git a/sys/dev/usb/wlan/if_mtw.c b/sys/dev/usb/wlan/if_mtw.c
--- a/sys/dev/usb/wlan/if_mtw.c
+++ b/sys/dev/usb/wlan/if_mtw.c
@@ -2155,7 +2155,7 @@
uint32_t sta[3];
uint16_t(*wstat)[3];
int error, ridx;
-
+ uint8_t txrate = 0;
/* Check for special case */
if (sc->rvp_cnt <= 1 && vap->iv_opmode == IEEE80211_M_STA &&
@@ -2208,11 +2208,13 @@
ieee80211_ratectl_tx_update(vap, txs);
ieee80211_ratectl_rate(ni, NULL, 0);
+ txrate = ieee80211_node_get_txrate_dot11rate(ni);
+
/* XXX TODO: methodize with MCS rates */
for (ridx = 0; ridx < MTW_RIDX_MAX; ridx++) {
MTW_DPRINTF(sc, MTW_DEBUG_RATE, "ni_txrate=0x%x\n",
- ni->ni_txrate);
- if (rt2860_rates[ridx].rate == ni->ni_txrate) {
+ txrate);
+ if (rt2860_rates[ridx].rate == txrate) {
break;
}
}
@@ -2221,7 +2223,7 @@
MTW_UNLOCK(sc);
MTW_DPRINTF(sc, MTW_DEBUG_RATE, "rate=%d, ridx=%d\n",
- ni->ni_txrate, rn->amrr_ridx);
+ txrate, rn->amrr_ridx);
}
static void
diff --git a/sys/dev/usb/wlan/if_rsu.c b/sys/dev/usb/wlan/if_rsu.c
--- a/sys/dev/usb/wlan/if_rsu.c
+++ b/sys/dev/usb/wlan/if_rsu.c
@@ -1500,7 +1500,8 @@
ni = ieee80211_ref_node(vap->iv_bss);
rs = &ni->ni_rates;
/* Indicate highest supported rate. */
- ni->ni_txrate = rs->rs_rates[rs->rs_nrates - 1];
+ ieee80211_node_set_txrate_dot11rate(ni,
+ rs->rs_rates[rs->rs_nrates - 1]);
(void) rsu_set_fw_power_state(sc, RSU_PWR_SLEEP);
ieee80211_free_node(ni);
startcal = 1;
diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c
--- a/sys/dev/usb/wlan/if_rum.c
+++ b/sys/dev/usb/wlan/if_rum.c
@@ -1646,7 +1646,7 @@
rate = tp->ucastrate;
else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c
--- a/sys/dev/usb/wlan/if_run.c
+++ b/sys/dev/usb/wlan/if_run.c
@@ -2685,6 +2685,7 @@
union run_stats sta[2];
uint16_t (*wstat)[3];
int error, ridx;
+ uint8_t dot11rate;
RUN_LOCK(sc);
@@ -2737,15 +2738,17 @@
ieee80211_ratectl_tx_update(vap, txs);
ieee80211_ratectl_rate(ni, NULL, 0);
/* XXX TODO: methodize with MCS rates */
+ dot11rate = ieee80211_node_get_txrate_dot11rate(ni);
for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
- if (rt2860_rates[ridx].rate == ni->ni_txrate)
+ if (rt2860_rates[ridx].rate == dot11rate)
break;
rn->amrr_ridx = ridx;
fail:
RUN_UNLOCK(sc);
- RUN_DPRINTF(sc, RUN_DEBUG_RATE, "rate=%d, ridx=%d\n", ni->ni_txrate, rn->amrr_ridx);
+ RUN_DPRINTF(sc, RUN_DEBUG_RATE, "rate=0x%02x, ridx=%d\n",
+ ieee80211_node_get_txrate_dot11rate(ni), rn->amrr_ridx);
}
static void
diff --git a/sys/dev/usb/wlan/if_uath.c b/sys/dev/usb/wlan/if_uath.c
--- a/sys/dev/usb/wlan/if_uath.c
+++ b/sys/dev/usb/wlan/if_uath.c
@@ -2058,7 +2058,8 @@
* Tx rate is controlled by firmware, report the maximum
* negotiated rate in ifconfig output.
*/
- ni->ni_txrate = ni->ni_rates.rs_rates[ni->ni_rates.rs_nrates-1];
+ ieee80211_node_set_txrate_dot11rate(ni,
+ ni->ni_rates.rs_rates[ni->ni_rates.rs_nrates-1]);
if (uath_write_associd(sc) != 0) {
device_printf(sc->sc_dev,
diff --git a/sys/dev/usb/wlan/if_ural.c b/sys/dev/usb/wlan/if_ural.c
--- a/sys/dev/usb/wlan/if_ural.c
+++ b/sys/dev/usb/wlan/if_ural.c
@@ -1227,7 +1227,7 @@
rate = tp->ucastrate;
else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
diff --git a/sys/dev/usb/wlan/if_zyd.c b/sys/dev/usb/wlan/if_zyd.c
--- a/sys/dev/usb/wlan/if_zyd.c
+++ b/sys/dev/usb/wlan/if_zyd.c
@@ -2460,7 +2460,7 @@
rate = tp->ucastrate;
else {
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
}
diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c
--- a/sys/dev/wpi/if_wpi.c
+++ b/sys/dev/wpi/if_wpi.c
@@ -2821,7 +2821,7 @@
else {
/* XXX pass pktlen */
(void) ieee80211_ratectl_rate(ni, NULL, 0);
- rate = ni->ni_txrate;
+ rate = ieee80211_node_get_txrate_dot11rate(ni);
}
/* Encrypt the frame if need be. */
diff --git a/sys/dev/wtap/if_wtap.c b/sys/dev/wtap/if_wtap.c
--- a/sys/dev/wtap/if_wtap.c
+++ b/sys/dev/wtap/if_wtap.c
@@ -401,7 +401,7 @@
/* TODO this is a hack to force it to choose the rate we want */
ni = ieee80211_ref_node(vap->iv_bss);
- ni->ni_txrate = 130;
+ ieee80211_node_set_txrate_ht_mcsrate(ni, 2);
ieee80211_free_node(ni);
return vap;
}
@@ -617,8 +617,7 @@
M_NOWAIT|M_ZERO);
if (ni == NULL)
return (NULL);
-
- ni->ni_txrate = 130;
+ ieee80211_node_set_txrate_ht_mcsrate(ni, 2);
return ni;
}

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 5, 11:48 PM (18 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17398563
Default Alt Text
D48602.diff (16 KB)

Event Timeline