| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't | 5 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't |
| 6 // constantly adding and subtracting header sizes; this is ugly and error- | 6 // constantly adding and subtracting header sizes; this is ugly and error- |
| 7 // prone. | 7 // prone. |
| 8 | 8 |
| 9 #include "net/spdy/spdy_framer.h" | 9 #include "net/spdy/spdy_framer.h" |
| 10 | 10 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat(int version, | 83 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat(int version, |
| 84 uint32 wire) { | 84 uint32 wire) { |
| 85 if (version < 3) { | 85 if (version < 3) { |
| 86 ConvertFlagsAndIdForSpdy2(&wire); | 86 ConvertFlagsAndIdForSpdy2(&wire); |
| 87 } | 87 } |
| 88 return SettingsFlagsAndId(ntohl(wire) >> 24, ntohl(wire) & 0x00ffffff); | 88 return SettingsFlagsAndId(ntohl(wire) >> 24, ntohl(wire) & 0x00ffffff); |
| 89 } | 89 } |
| 90 | 90 |
| 91 SettingsFlagsAndId::SettingsFlagsAndId(uint8 flags, uint32 id) | 91 SettingsFlagsAndId::SettingsFlagsAndId(uint8 flags, uint32 id) |
| 92 : flags_(flags), id_(id & 0x00ffffff) { | 92 : flags_(flags), id_(id & 0x00ffffff) { |
| 93 LOG_IF(DFATAL, id > (1u << 24)) << "SPDY setting ID too large."; | 93 LOG_IF(DFATAL, id > (1u << 24)) << "SPDY setting ID too large: " << id; |
| 94 } | 94 } |
| 95 | 95 |
| 96 uint32 SettingsFlagsAndId::GetWireFormat(int version) const { | 96 uint32 SettingsFlagsAndId::GetWireFormat(int version) const { |
| 97 uint32 wire = htonl(id_ & 0x00ffffff) | htonl(flags_ << 24); | 97 uint32 wire = htonl(id_ & 0x00ffffff) | htonl(flags_ << 24); |
| 98 if (version < 3) { | 98 if (version < 3) { |
| 99 ConvertFlagsAndIdForSpdy2(&wire); | 99 ConvertFlagsAndIdForSpdy2(&wire); |
| 100 } | 100 } |
| 101 return wire; | 101 return wire; |
| 102 } | 102 } |
| 103 | 103 |
| (...skipping 1496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1600 GetSerializedLength(protocol_version(), &block)); | 1600 GetSerializedLength(protocol_version(), &block)); |
| 1601 | 1601 |
| 1602 SerializeNameValueBlockWithoutCompression(&builder, block); | 1602 SerializeNameValueBlockWithoutCompression(&builder, block); |
| 1603 scoped_ptr<SpdyFrame> frame(builder.take()); | 1603 scoped_ptr<SpdyFrame> frame(builder.take()); |
| 1604 | 1604 |
| 1605 remaining_data_length_ = frame->size(); | 1605 remaining_data_length_ = frame->size(); |
| 1606 ProcessControlFrameHeaderBlock(frame->data(), frame->size(), false); | 1606 ProcessControlFrameHeaderBlock(frame->data(), frame->size(), false); |
| 1607 } | 1607 } |
| 1608 | 1608 |
| 1609 bool SpdyFramer::ProcessSetting(const char* data) { | 1609 bool SpdyFramer::ProcessSetting(const char* data) { |
| 1610 int id_field; |
| 1610 SpdySettingsIds id; | 1611 SpdySettingsIds id; |
| 1611 uint8 flags = 0; | 1612 uint8 flags = 0; |
| 1612 uint32 value; | 1613 uint32 value; |
| 1613 | 1614 |
| 1614 // Extract fields. | 1615 // Extract fields. |
| 1615 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id. | 1616 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id. |
| 1616 if (protocol_version() <= SPDY3) { | 1617 if (protocol_version() <= SPDY3) { |
| 1617 const uint32 id_and_flags_wire = *(reinterpret_cast<const uint32*>(data)); | 1618 const uint32 id_and_flags_wire = *(reinterpret_cast<const uint32*>(data)); |
| 1618 SettingsFlagsAndId id_and_flags = | 1619 SettingsFlagsAndId id_and_flags = |
| 1619 SettingsFlagsAndId::FromWireFormat(protocol_version(), id_and_flags_wire); | 1620 SettingsFlagsAndId::FromWireFormat(protocol_version(), id_and_flags_wire); |
| 1620 id = static_cast<SpdySettingsIds>(id_and_flags.id()); | 1621 id_field = id_and_flags.id(); |
| 1621 flags = id_and_flags.flags(); | 1622 flags = id_and_flags.flags(); |
| 1622 value = ntohl(*(reinterpret_cast<const uint32*>(data + 4))); | 1623 value = ntohl(*(reinterpret_cast<const uint32*>(data + 4))); |
| 1623 } else { | 1624 } else { |
| 1624 id = static_cast<SpdySettingsIds>(*(reinterpret_cast<const uint8*>(data))); | 1625 id_field = *(reinterpret_cast<const uint8*>(data)); |
| 1625 value = ntohl(*(reinterpret_cast<const uint32*>(data + 1))); | 1626 value = ntohl(*(reinterpret_cast<const uint32*>(data + 1))); |
| 1626 } | 1627 } |
| 1627 | 1628 |
| 1628 // Validate id. | 1629 // Validate id. |
| 1629 switch (id) { | 1630 if (!SpdyConstants::IsValidSettingId(protocol_version(), id_field)) { |
| 1630 case SETTINGS_UPLOAD_BANDWIDTH: | 1631 DLOG(WARNING) << "Unknown SETTINGS ID: " << id_field; |
| 1631 case SETTINGS_DOWNLOAD_BANDWIDTH: | 1632 return false; |
| 1632 case SETTINGS_ROUND_TRIP_TIME: | |
| 1633 case SETTINGS_MAX_CONCURRENT_STREAMS: | |
| 1634 case SETTINGS_CURRENT_CWND: | |
| 1635 case SETTINGS_DOWNLOAD_RETRANS_RATE: | |
| 1636 case SETTINGS_INITIAL_WINDOW_SIZE: | |
| 1637 // Valid values. | |
| 1638 break; | |
| 1639 default: | |
| 1640 DLOG(WARNING) << "Unknown SETTINGS ID: " << id; | |
| 1641 return false; | |
| 1642 } | 1633 } |
| 1634 id = SpdyConstants::ParseSettingId(protocol_version(), id_field); |
| 1643 | 1635 |
| 1644 if (protocol_version() <= SPDY3) { | 1636 if (protocol_version() <= SPDY3) { |
| 1645 // Detect duplicates. | 1637 // Detect duplicates. |
| 1646 if (static_cast<uint32>(id) <= settings_scratch_.last_setting_id) { | 1638 if (id <= settings_scratch_.last_setting_id) { |
| 1647 DLOG(WARNING) << "Duplicate entry or invalid ordering for id " << id | 1639 DLOG(WARNING) << "Duplicate entry or invalid ordering for id " << id |
| 1648 << " in " << display_protocol_ << " SETTINGS frame " | 1640 << " in " << display_protocol_ << " SETTINGS frame " |
| 1649 << "(last setting id was " | 1641 << "(last setting id was " |
| 1650 << settings_scratch_.last_setting_id << ")."; | 1642 << settings_scratch_.last_setting_id << ")."; |
| 1651 return false; | 1643 return false; |
| 1652 } | 1644 } |
| 1653 settings_scratch_.last_setting_id = id; | 1645 settings_scratch_.last_setting_id = id; |
| 1654 | 1646 |
| 1655 // Validate flags. | 1647 // Validate flags. |
| 1656 uint8 kFlagsMask = SETTINGS_FLAG_PLEASE_PERSIST | SETTINGS_FLAG_PERSISTED; | 1648 uint8 kFlagsMask = SETTINGS_FLAG_PLEASE_PERSIST | SETTINGS_FLAG_PERSISTED; |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2287 it != values->end(); | 2279 it != values->end(); |
| 2288 ++it) { | 2280 ++it) { |
| 2289 if (protocol_version() <= SPDY3) { | 2281 if (protocol_version() <= SPDY3) { |
| 2290 uint8 setting_flags = 0; | 2282 uint8 setting_flags = 0; |
| 2291 if (it->second.persist_value) { | 2283 if (it->second.persist_value) { |
| 2292 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; | 2284 setting_flags |= SETTINGS_FLAG_PLEASE_PERSIST; |
| 2293 } | 2285 } |
| 2294 if (it->second.persisted) { | 2286 if (it->second.persisted) { |
| 2295 setting_flags |= SETTINGS_FLAG_PERSISTED; | 2287 setting_flags |= SETTINGS_FLAG_PERSISTED; |
| 2296 } | 2288 } |
| 2297 SettingsFlagsAndId flags_and_id(setting_flags, it->first); | 2289 SettingsFlagsAndId flags_and_id( |
| 2290 setting_flags, |
| 2291 SpdyConstants::SerializeSettingId(protocol_version(), it->first)); |
| 2298 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); | 2292 uint32 id_and_flags_wire = flags_and_id.GetWireFormat(protocol_version()); |
| 2299 builder.WriteBytes(&id_and_flags_wire, 4); | 2293 builder.WriteBytes(&id_and_flags_wire, 4); |
| 2300 } else { | 2294 } else { |
| 2301 builder.WriteUInt8(static_cast<uint8>(it->first)); | 2295 builder.WriteUInt8(SpdyConstants::SerializeSettingId(protocol_version(), |
| 2296 it->first)); |
| 2302 } | 2297 } |
| 2303 builder.WriteUInt32(it->second.value); | 2298 builder.WriteUInt32(it->second.value); |
| 2304 } | 2299 } |
| 2305 DCHECK_EQ(size, builder.length()); | 2300 DCHECK_EQ(size, builder.length()); |
| 2306 return builder.take(); | 2301 return builder.take(); |
| 2307 } | 2302 } |
| 2308 | 2303 |
| 2309 SpdyFrame* SpdyFramer::SerializeBlocked(const SpdyBlockedIR& blocked) const { | 2304 SpdyFrame* SpdyFramer::SerializeBlocked(const SpdyBlockedIR& blocked) const { |
| 2310 DCHECK_LT(SPDY3, protocol_version()); | 2305 DCHECK_LT(SPDY3, protocol_version()); |
| 2311 SpdyFrameBuilder builder(GetBlockedSize()); | 2306 SpdyFrameBuilder builder(GetBlockedSize()); |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2846 builder->Seek(compressed_size); | 2841 builder->Seek(compressed_size); |
| 2847 builder->RewriteLength(*this); | 2842 builder->RewriteLength(*this); |
| 2848 | 2843 |
| 2849 pre_compress_bytes.Add(uncompressed_len); | 2844 pre_compress_bytes.Add(uncompressed_len); |
| 2850 post_compress_bytes.Add(compressed_size); | 2845 post_compress_bytes.Add(compressed_size); |
| 2851 | 2846 |
| 2852 compressed_frames.Increment(); | 2847 compressed_frames.Increment(); |
| 2853 } | 2848 } |
| 2854 | 2849 |
| 2855 } // namespace net | 2850 } // namespace net |
| OLD | NEW |