aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ieee80211-radio.c
AgeCommit message (Collapse)AuthorFilesLines
2021-11-01802.11 Radio: Add null pointer checks.Gerald Combs1-27/+29
Fixes #17704.
2021-06-08ieee80211_radio: Clarify Aggregate duration field description.Simon Barber1-3/+3
Change-Id: Ieaff474e4be59b5b41a8262431dbfbc6995579c9
2021-06-02ieee80211_radio: Use calculated bitrate if not suppliedSimon Barber1-8/+2
For 802.11n if the bitrate is not supplied then the calculated bitrate is used. This change does the same for 11ac and 11ax. Sniffer traces taken on recent versions of Macos no longer supply the bitrate for 11ac frames in the RADIOTAP header, this change allows the wireless timeline to work with these traces. Fixes #17419.
2021-03-08radiotap, wlancap, wiretap: make the "phy" reflect the packet modulation.Guy Harris1-7/+0
Do more fixups of the "phy" based on the data rate, so that it reflects the modulation used for the packet. Note, in comments, why we're doing this, and that there's no reiable way, in radiotap, to determine the type of channel on which capturing is being done, as some packet providers use the channel field to indicate the channel type and others use it to indicate the modulation. Only provide the "short preamble" for "11b", as that's now being used to mean "DSSS modulation" - packets on an 11g channel will be marked as "11g" if they're OFDM or "11b" if they're DSSS. Make some other cleanups while we're at it.
2020-05-27ieee80211: Add datarate for 802.11AX packetsGlenden Lee1-0/+275
Bug: 16255 - support HE MCS to rate conversion Change-Id: I4a4a6c3d62c167b654d150c397047a55f287e6c8 Reviewed-on: https://code.wireshark.org/review/37255 Petri-Dish: Guy Harris <gharris@sonic.net> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <gharris@sonic.net>
2019-11-27Annnnnd fix another typo.Guy Harris1-1/+1
Change-Id: Ida3a64adf6507f00f18cb78a1635dad34893a621 Reviewed-on: https://code.wireshark.org/review/35231 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2019-11-27Add short descriptions of the PHYs other than the legacy PHYs.Guy Harris1-8/+8
Put short descriptions after the amendment name, in parentheses. Fix a typo in the 802.11d entry while we're at it. Change-Id: I87d84678f30abe40c4b130cf0a9355bb5da99df4 Reviewed-on: https://code.wireshark.org/review/35229 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2019-11-27Add entries for 802.11ad and 802.11ah PHY values.Guy Harris1-0/+2
Change-Id: Ib8c2f196af2bba32004a66a7b2414b493023edbb Reviewed-on: https://code.wireshark.org/review/35228 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2019-11-27Add more support for the 802.11ax PHY.Guy Harris1-0/+1
Set it as the PHY type if we see the HE field in a radiotap header, and report that PHY type as "802.11ax" in the generic radio metadata dissector. Change-Id: I181d2717d82bdca73e04b6111b2483ca099d48bb Ping-Bug: 13207 Reviewed-on: https://code.wireshark.org/review/35227 Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
2019-07-19Provide only one data rate per user for VHT frames.Guy Harris1-8/+0
Don't provide an extra not-per-user data rate equal to the data rate for the highest user number; that makes no sense. Bug: 15928 Change-Id: Ie6bf5853d630bbf33afd423dc7a8eca26abdf83a Reviewed-on: https://code.wireshark.org/review/34018 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
2019-04-04epan: Convert our PROTO_ITEM_ macros to inline functions.Gerald Combs1-7/+7
Convert our various PROTO_ITEM_ macros to inline functions and document them. Change-Id: I070b15d4f70d2189217a177ee8ba2740be36327c Reviewed-on: https://code.wireshark.org/review/32706 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
2018-12-27Try to squeeze some bytes out of the frame_data structure.Guy Harris1-3/+3
Make the time stamp precision a 4-bit bitfield, so, when combined with the other bitfields, we have 32 bits. That means we put the flags at the same structure level as the time stamp precision, so they can be combined; that gets rid of an extra "flags." for references to the flags. Put the two pointers next to each other, and after a multiple of 8 bytes worth of other fields, so that there's no padding before or between them. It's still not down to 64 bytes, which is the next lower power of 2, so there's more work to do. Change-Id: I6f3e9d9f6f48137bbee8f100c152d2c42adb8fbe Reviewed-on: https://code.wireshark.org/review/31213 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-31Make the SNR a 32-bit field.Guy Harris1-1/+1
The difference between two 8-bit signed values may be < -128 or > 127. Change-Id: Ic930c65462b3d31591af2e206fb7ccbd4e509358 Reviewed-on: https://code.wireshark.org/review/30450 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-31Fix copy-and-pasteo.Guy Harris1-1/+1
Give the SNR field an appropriate name. Change-Id: I4625b86dffa523da9771d9b220577182329fe27a Reviewed-on: https://code.wireshark.org/review/30448 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-30Add a tap for the radio dissector that passes the pseudo-header.Guy Harris1-1/+9
That's what tap listeners that want radio information should use. (If they need additional radio information, they should expand the pseudo-header structure and have *all* the libwiretap readers and radio-metadata dissectors that fill in that structure fill it in - or not mark it as present if there's nothing to fill it in with.) Also, note that the "nav" field appears to be the duration field from the frame header. Change-Id: Ia09c69f6463371c880f2bddfc58760699b796049 Reviewed-on: https://code.wireshark.org/review/30414 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-29The signal strength and noise in dB from an arbitrary reference are unsigned.Guy Harris1-5/+5
The radiotap spec says "dB antenna signal" and "dB antenna noise" are unsigned. Make it universally so. Change-Id: Iea2c5360d7352ca5e84862ea338d1fc689272191 Reviewed-on: https://code.wireshark.org/review/30410 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-29Calculate the signal/noise ratio.Guy Harris1-2/+16
If we have signal and noise in dBm, the difference between them is the SNR, in dB. Bug: 15243 Change-Id: Iaa17ef9ac39e18eccb7d1f75367fde24abab0180 Reviewed-on: https://code.wireshark.org/review/30408 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-10-29Handle signal/noise in dB from an arbitrary point in the 802.11 radio dissector.Guy Harris1-6/+19
While we're at it, only set the RSSI column once - no need to do it at the beginning and later when we're setting fields. Change-Id: Ia729019e5e6dfbe1cdad61f1f8397b0a3a171996 Reviewed-on: https://code.wireshark.org/review/30405 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-08-09Pass zero-length PSDU type information to the radio dissector.Guy Harris1-5/+27
We call that dissector even for zero-length PSDUs, so the radio information is shown. We also show the zero-length PSDU type. We don't call the 802.11 dissector for zero-length PSDU frames. That way, you don't have to open up the radiotap information to find out about zero-length PSDU frames, we can support zero-length PSDU information for other pseudo-headers and file types if they support it, and taps using the radio information can get zero-length PSDU frame information. Change-Id: I7d5da4ea978d8ca4889fc76160f11e3416b4d036 Reviewed-on: https://code.wireshark.org/review/29034 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2018-02-20ieee80211: Remove obsolete assignmentsStig Bjørlykke1-4/+1
Change-Id: If1de0970e4baf49419238553ba93ab13ad5b94cc Reviewed-on: https://code.wireshark.org/review/25926 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
2018-02-20ieee80211: fix preamble duration calculationNeil Ostroff1-5/+0
Preamble duration calculation duplicated the number of HT-LTF symbols resulting in an incorrect preamble calculation. This fix removes the duplicated code in file: epan/dissectors/packet-ieee80211-radio.c. Bug: 14439 Change-Id: I550066a41c24948e16da6a43cf403cf206b7f32d Reviewed-on: https://code.wireshark.org/review/25903 Reviewed-by: Simon Barber <simon.barber@meraki.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann <mmann78@netscape.net>
2018-02-12dissectors: use SPDX identifiers.Dario Lombardo1-13/+1
Change-Id: I92c94448e6641716d03158a5f332c8b53709423a Reviewed-on: https://code.wireshark.org/review/25756 Petri-Dish: Dario Lombardo <lomato@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
2017-11-29Use a separate Boolean to indicate whether we have a duration.Guy Harris1-3/+10
Reserved values are a bit of a hack. (If this were Swift....) Change-Id: I243e8f497345f44d94af6106287556b8831fba92 Reviewed-on: https://code.wireshark.org/review/24633 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-09-15wireless-timeline: handle generators that report incorrect MCS for some framesSimon Barber1-6/+32
Macbook and QCA generators sometimes report the minimum MCS for subframes in an aggregate that have FCS errors. Change-Id: I77d1a81f5b3d0e3d0755adcb889f1237b0257814 Reviewed-on: https://code.wireshark.org/review/23521 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2017-07-08ieee80211: disable wireless timeline by defaultPeter Wu1-1/+8
As the wireless timeline is not fully finished and undocumented, disable this GUI feature for now. This should avoid some user confusion when opening an 802.11 trace. For experimental and development purposes, the feature can be enabled via the preferences (right-click on the "802.11 radio information" layer, Protocol Preferences, Enable Wireless Timeline (experimental)"). Change-Id: Ieb529ccc0f23a051bcaba21ad18ac3c1d63b850e Ping-Bug: 13769 Reviewed-on: https://code.wireshark.org/review/22558 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Reviewed-by: Simon Barber <simon.barber@meraki.net> Reviewed-by: Peter Wu <peter@lekensteyn.nl>
2017-06-20ieee80211-radio: allow 0 duration and handle missing phy typeSimon Barber1-4/+14
Allows duration to be calculated to 0 Handles generators where PHY type is not reported, but it can be determined from the rate. Change-Id: Ic0b9e1b0e3e51f4d5b670d25fea064daf250a55f Reviewed-on: https://code.wireshark.org/review/22261 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2017-06-09ieee80211-radio: Fix calculation of frame start timeSimon Barber1-1/+1
With captures where TSF indicates the end of the frame the preamble was being counted twice in the calculation of the start. Change-Id: I3d042d8ea3bc46a833438cb3d2f75e3499a7711d Reviewed-on: https://code.wireshark.org/review/22020 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
2017-06-07ieee80211-radio: Fix description of packet start and end time fieldsSimon Barber1-2/+2
Change-Id: I8b0acaa689c468b6da553d47a15a9d47fe9d45a6 Reviewed-on: https://code.wireshark.org/review/22021 Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
2017-06-07ieee80211: Explain TSF in wlan_radio.timestamp blurbStig Bjørlykke1-4/+4
Also exchange 0xFFFFFFFFFFFFFFFF with G_MAXUINT64. Change-Id: Ie9ecca6268afc1788ce79015295b706350490476 Reviewed-on: https://code.wireshark.org/review/21990 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
2017-06-05Add a timeline view for packets, with the timing data used to generate the ↵Simon Barber1-26/+21
display taken from the timing analysis done in the wlan_radio dissector. QT only. The timeline background is light gray, white for packets displayed in the packetlist, and blue for the currently selected packet. Packets are coloured according to the colouring rules foreground colour. The timeline can be zoomed with controls on the toolbar. At higher zoom levels the duration (NAV) field is plotted as a horizontal line to the right of a packet. The height of a packet in the timeline is proportional to the RSSI. The bottom half of the packet is only shown if it matches the display filter. Todo: Auto detect TSF timing reference point (start/end of packet) Add a scrollbar Add a ruler showing time Improve handling of focus. Do not display NAV for packets with bad FCS. Show related packets graphically Different Y axis modes - bandwidth/channel use display - different transmitters per line - background color from coloring rules Live capture support Change-Id: Ic31fffb0d6854966361ade7abb5c0be50db9a247 Reviewed-on: https://code.wireshark.org/review/20043 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2017-05-15Add a null pointer check.Guy Harris1-2/+3
While we're at it, fix a typo in a comment. Bug: 13711 Change-Id: Ie1e4aa9243ccb10621bf181b232e177c2a7f867c Reviewed-on: https://code.wireshark.org/review/21676 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-05-13IEEE80211-radio: Fix divide by zeroBjörn Ruytenberg1-1/+1
Perform sanity check on parsed data rate. Data rate of zero results in a division by zero in calculate_llac_duration. Do not use data rate if zero. Bug: 13706 Change-Id: I7883e1052a0965f7927d3a478c0aa992693f7fe1 Reviewed-on: https://code.wireshark.org/review/21626 Reviewed-by: Peter Wu <peter@lekensteyn.nl> Petri-Dish: Peter Wu <peter@lekensteyn.nl> Reviewed-by: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2017-05-12Adds aggregate detection, calculation of frame start and end time, and IFSSimon Barber1-22/+342
Change-Id: I3a9cddd9c6e47a5c5c48e2e02a32a71413bcf799 Reviewed-on: https://code.wireshark.org/review/13590 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2017-04-30Remove a now-unused table.Guy Harris1-10/+0
Change-Id: Ibb04201bd2acd5fa6cbcd7837504b10d1d5174c4 Reviewed-on: https://code.wireshark.org/review/21430 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-04-30packet-ieee80211-radio.c: Minor refactor and whitespace cleanupSimon Barber1-316/+306
Change-Id: Idad8f7eeed968eeed9f553fef98d58453f328afb Reviewed-on: https://code.wireshark.org/review/21421 Petri-Dish: Michael Mann <mmann78@netscape.net> Reviewed-by: Michael Mann <mmann78@netscape.net> Tested-by: Michael Mann <mmann78@netscape.net>
2017-03-14ieee80211-radio: fix this condition has identical branches ↵Alexis La Goutte1-19/+8
[-Werror=duplicated-branches] found by gcc7 Change-Id: I7f5f25b0afd30612d9e20e52585c7cad70bc1f59 Reviewed-on: https://code.wireshark.org/review/20468 Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Peter Wu <peter@lekensteyn.nl>
2016-12-16Adjust proto_tree_add_xxx_format_value calls to use unit stringMichael Mann1-10/+4
proto_tree_add_uint_format_value had the most use of unit strings, this patch handles all of the other proto_tree_add_xxx_format_value calls that could be better served using BASE_UNIT_STRING with a "unit string" in hf_ field. Added more "common" unit string values to unit_strings.[ch] Change-Id: I0fb680be781e10037eb7bd40dd21a9ee20c1fb1c Reviewed-on: https://code.wireshark.org/review/19288 Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-12-13Adjust proto_tree_add_uint_format_value calls to use unit stringMichael Mann1-21/+9
Several calls to proto_tree_add_uint_format_value could be better served using BASE_UNIT_STRING with a "unit string" in hf_ field. There also a few cases where proto_tree_add_uint_format_value could just be proto_tree_add_uint. Added a few more "common" unit string values to unit_strings.[ch] Change-Id: Iaedff82c515269c9c31ab9100dff19f5563c932d Reviewed-on: https://code.wireshark.org/review/19242 Petri-Dish: Michael Mann <mmann78@netscape.net> Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-11-06Add wlan_radio preference to assume 802.11 preamble is short for durationSimon Barber1-1/+15
calculations. Change-Id: Ie314f7caee067b16da8dcb2a45cb1395ce0cb266 Reviewed-on: https://code.wireshark.org/review/17719 Petri-Dish: Michael Mann <mmann78@netscape.net> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-07-14Fix VHT valid checks.Guy Harris1-2/+2
The valid array in a struct mcs_vht_valid is indexed by the bandwidth and the NSS-1; use the NSS-1, not the NSS, as the index. The maximum possible value of the NSS is MAX_VHT_NSS, so allow a value of MAX_VHT_NSS. Change-Id: I49585f217f3e70356c1dd1ba32b6c714ce202236 Reviewed-on: https://code.wireshark.org/review/16426 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-07-14packet-ieee80211-radio.c: Prevent array overflow.Michael Mann1-1/+1
Found by VS Code Analysis. Change-Id: Idab6cb5496749ebff47466b20a9a665b1574565d Reviewed-on: https://code.wireshark.org/review/16421 Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-06-30802.11 radio: fix an out of bounds accessPascal Quantin1-1/+1
Bug: 12571 Change-Id: I4dafdd9bdec5acddf346fd2db6a06d9dfabcbb2e Reviewed-on: https://code.wireshark.org/review/16228 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com> Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-06-26Check for an invalid 11ac MCS/bandwidth/NSS combination.Guy Harris1-1/+92
A few of the combinations are marked as "Not valid" in 802.11ac-2013. Ping-Bug: 12558 Change-Id: I18b78ebb84ab32a6fc53c6d634ef07ae87fb4866 Reviewed-on: https://code.wireshark.org/review/16153 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-05-20Cisco WIDS wlan frames as sent by standalone APs do not include the QoS controlJoerg Mayer1-4/+30
stuff. Bug: 12421 Change-Id: Idc56bd573b72465e36c8141d3c0736b286ff220a Reviewed-on: https://code.wireshark.org/review/15448 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Jörg Mayer <jmayer@loplof.de>
2016-03-20Manually add protocol dependencies derived from find_dissector.Michael Mann1-1/+1
Started by grepping call_dissector_with_data, call_dissector_only and call_dissector and traced the handles passed into them to a find_dissector within the dissector. Then replaced find_dissector with find_dissector_add_dependency and added the protocol id from the dissector. "data" dissector was not considered to be a dependency. Change-Id: I15d0d77301306587ef8e7af5876e74231816890d Reviewed-on: https://code.wireshark.org/review/14509 Petri-Dish: Michael Mann <mmann78@netscape.net> Reviewed-by: Michael Mann <mmann78@netscape.net>
2016-02-09And we need to check Nsts as well.Guy Harris1-1/+5
The check against 0 isn't really necessary, as stbc_streams >= 0 and ieee80211_ht_streams[info_n->mcs_index] >= 1, but, what the heck. Make stbc_streams unsigned, as the value assigned to it is unsigned. Bug: 12085 Change-Id: I98e0edb718f62ee07bbe56b9d15859c68b7d2e43 Reviewed-on: https://code.wireshark.org/review/13844 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-02-07Check whether Ness is valid as well.Guy Harris1-1/+5
It's also used as an array index, and it also is no guaranteed to be in the proper range in all capture files, so bounds-check it. Make the variable's type match that of the field in the radio metadata. (It's never negative, so it's unsigned.) This appears to be the last of the unchecked array references from bug 12085. Bug: 12085 Change-Id: I3e5b821a9b70dfd520d01036f6f7d02008aca200 Reviewed-on: https://code.wireshark.org/review/13806 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-02-07MAX_MCS_INDEX is a valid array index.Guy Harris1-1/+1
The arrays have MAX_MCS_INDEX+1 entries; valid indices to from 0 to MAX_MCX_INDEX. Change-Id: Ibbd30d36cc16143482b34212b1c6ce8df9e555ab Ping-Bug: 12085 Reviewed-on: https://code.wireshark.org/review/13805 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-02-07MAX_MCS_INDEX is a valid array index.Guy Harris1-1/+1
The arrays have MAX_MCS_INDEX+1 entries; valid indices to from 0 to MAX_MCX_INDEX. Change-Id: Ib8b939e687a00505cab5e5f9b3b6dce34e9d0b47 Reviewed-on: https://code.wireshark.org/review/13803 Reviewed-by: Guy Harris <guy@alum.mit.edu>
2016-02-06Check whether mcs_index is sane, not just whether it's set.Guy Harris1-1/+3
Don't just check whether we *have* the MCS index, check whether it's a valid MCS index, before we use it in calculations. Otherwise, we'll make out-of-bounds array accesses. (May or may not fix bug 12085, so just Ping-Bug for now. It's necessary in any case.) Change-Id: I7119366397b260089aea35ae9fcd5ad9ec6b06f2 Ping-Bug: 12085 Reviewed-on: https://code.wireshark.org/review/13790 Reviewed-by: Guy Harris <guy@alum.mit.edu>