Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1204)

Side by Side Diff: net/spdy/spdy_framer.cc

Issue 9716020: Add base::HostToNetXX() & NetToHostXX(), and use them to replace htonX() & ntohX() in Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Switch a few remaining call-sites. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 }; 46 };
47 47
48 // Adler ID for the SPDY header compressor dictionaries. Note that they are 48 // Adler ID for the SPDY header compressor dictionaries. Note that they are
49 // initialized lazily to avoid static initializers. 49 // initialized lazily to avoid static initializers.
50 base::LazyInstance<DictionaryIds>::Leaky g_dictionary_ids; 50 base::LazyInstance<DictionaryIds>::Leaky g_dictionary_ids;
51 51
52 // Creates a FlagsAndLength. 52 // Creates a FlagsAndLength.
53 FlagsAndLength CreateFlagsAndLength(SpdyControlFlags flags, size_t length) { 53 FlagsAndLength CreateFlagsAndLength(SpdyControlFlags flags, size_t length) {
54 DCHECK_EQ(0u, length & ~static_cast<size_t>(kLengthMask)); 54 DCHECK_EQ(0u, length & ~static_cast<size_t>(kLengthMask));
55 FlagsAndLength flags_length; 55 FlagsAndLength flags_length;
56 flags_length.length_ = htonl(static_cast<uint32>(length)); 56 flags_length.length_ = base::HostToNet32(static_cast<uint32>(length));
57 DCHECK_EQ(0, flags & ~kControlFlagsMask); 57 DCHECK_EQ(0, flags & ~kControlFlagsMask);
58 flags_length.flags_[0] = flags; 58 flags_length.flags_[0] = flags;
59 return flags_length; 59 return flags_length;
60 } 60 }
61 61
62 // By default is compression on or off. 62 // By default is compression on or off.
63 bool SpdyFramer::compression_default_ = true; 63 bool SpdyFramer::compression_default_ = true;
64 64
65 // The initial size of the control frame buffer; this is used internally 65 // The initial size of the control frame buffer; this is used internally
66 // as we parse through control frames. (It is exposed here for unit test 66 // as we parse through control frames. (It is exposed here for unit test
(...skipping 29 matching lines...) Expand all
96 } 96 }
97 #else 97 #else
98 #define CHANGE_STATE(newstate) (state_ = newstate) 98 #define CHANGE_STATE(newstate) (state_ = newstate)
99 #endif 99 #endif
100 100
101 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat(int version, 101 SettingsFlagsAndId SettingsFlagsAndId::FromWireFormat(int version,
102 uint32 wire) { 102 uint32 wire) {
103 if (version < 3) { 103 if (version < 3) {
104 ConvertFlagsAndIdForSpdy2(&wire); 104 ConvertFlagsAndIdForSpdy2(&wire);
105 } 105 }
106 return SettingsFlagsAndId(ntohl(wire) >> 24, ntohl(wire) & 0x00ffffff); 106 return SettingsFlagsAndId(base::NetToHost32(wire) >> 24,
107 base::NetToHost32(wire) & 0x00ffffff);
107 } 108 }
108 109
109 SettingsFlagsAndId::SettingsFlagsAndId(uint8 flags, uint32 id) 110 SettingsFlagsAndId::SettingsFlagsAndId(uint8 flags, uint32 id)
110 : flags_(flags), id_(id & 0x00ffffff) { 111 : flags_(flags), id_(id & 0x00ffffff) {
111 DCHECK_GT(static_cast<uint32>(1 << 24), id); 112 DCHECK_GT(static_cast<uint32>(1 << 24), id);
112 } 113 }
113 114
114 uint32 SettingsFlagsAndId::GetWireFormat(int version) const { 115 uint32 SettingsFlagsAndId::GetWireFormat(int version) const {
115 uint32 wire = htonl(id_ & 0x00ffffff) | htonl(flags_ << 24); 116 uint32 wire =
117 base::HostToNet32(id_ & 0x00ffffff) | base::HostToNet32(flags_ << 24);
116 if (version < 3) { 118 if (version < 3) {
117 ConvertFlagsAndIdForSpdy2(&wire); 119 ConvertFlagsAndIdForSpdy2(&wire);
118 } 120 }
119 return wire; 121 return wire;
120 } 122 }
121 123
122 // SPDY 2 had a bug in it with respect to byte ordering of id/flags field. 124 // SPDY 2 had a bug in it with respect to byte ordering of id/flags field.
123 // This method is used to preserve buggy behavior and works on both 125 // This method is used to preserve buggy behavior and works on both
124 // little-endian and big-endian hosts. 126 // little-endian and big-endian hosts.
125 // This method is also bidirectional (can be used to translate SPDY 2 to SPDY 3 127 // This method is also bidirectional (can be used to translate SPDY 2 to SPDY 3
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 return processed_bytes; 785 return processed_bytes;
784 } 786 }
785 787
786 bool SpdyFramer::ProcessSetting(const char* data) { 788 bool SpdyFramer::ProcessSetting(const char* data) {
787 // Extract fields. 789 // Extract fields.
788 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id. 790 // Maintain behavior of old SPDY 2 bug with byte ordering of flags/id.
789 const uint32 id_and_flags_wire = *(reinterpret_cast<const uint32*>(data)); 791 const uint32 id_and_flags_wire = *(reinterpret_cast<const uint32*>(data));
790 SettingsFlagsAndId id_and_flags = 792 SettingsFlagsAndId id_and_flags =
791 SettingsFlagsAndId::FromWireFormat(spdy_version_, id_and_flags_wire); 793 SettingsFlagsAndId::FromWireFormat(spdy_version_, id_and_flags_wire);
792 uint8 flags = id_and_flags.flags(); 794 uint8 flags = id_and_flags.flags();
793 uint32 value = ntohl(*(reinterpret_cast<const uint32*>(data + 4))); 795 uint32 value =
796 base::NetToHost32(*(reinterpret_cast<const uint32*>(data + 4)));
794 797
795 // Validate id. 798 // Validate id.
796 switch (id_and_flags.id()) { 799 switch (id_and_flags.id()) {
797 case SETTINGS_UPLOAD_BANDWIDTH: 800 case SETTINGS_UPLOAD_BANDWIDTH:
798 case SETTINGS_DOWNLOAD_BANDWIDTH: 801 case SETTINGS_DOWNLOAD_BANDWIDTH:
799 case SETTINGS_ROUND_TRIP_TIME: 802 case SETTINGS_ROUND_TRIP_TIME:
800 case SETTINGS_MAX_CONCURRENT_STREAMS: 803 case SETTINGS_MAX_CONCURRENT_STREAMS:
801 case SETTINGS_CURRENT_CWND: 804 case SETTINGS_CURRENT_CWND:
802 case SETTINGS_DOWNLOAD_RETRANS_RATE: 805 case SETTINGS_DOWNLOAD_RETRANS_RATE:
803 case SETTINGS_INITIAL_WINDOW_SIZE: 806 case SETTINGS_INITIAL_WINDOW_SIZE:
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 bool SpdyFramer::ParseSettings(const SpdySettingsControlFrame* frame, 1001 bool SpdyFramer::ParseSettings(const SpdySettingsControlFrame* frame,
999 SpdySettings* settings) { 1002 SpdySettings* settings) {
1000 DCHECK_EQ(frame->type(), SETTINGS); 1003 DCHECK_EQ(frame->type(), SETTINGS);
1001 DCHECK(settings); 1004 DCHECK(settings);
1002 1005
1003 SpdyFrameReader parser(frame->header_block(), frame->header_block_len()); 1006 SpdyFrameReader parser(frame->header_block(), frame->header_block_len());
1004 for (size_t index = 0; index < frame->num_entries(); ++index) { 1007 for (size_t index = 0; index < frame->num_entries(); ++index) {
1005 uint32 id_and_flags_wire; 1008 uint32 id_and_flags_wire;
1006 uint32 value; 1009 uint32 value;
1007 // SettingsFlagsAndId accepts off-the-wire (network byte order) data, so we 1010 // SettingsFlagsAndId accepts off-the-wire (network byte order) data, so we
1008 // use ReadBytes() instead of ReadUInt32() as the latter calls ntohl(). 1011 // use ReadBytes() instead of ReadUInt32(), which calls base::NetToHost32().
1009 if (!parser.ReadBytes(&id_and_flags_wire, 4)) { 1012 if (!parser.ReadBytes(&id_and_flags_wire, 4)) {
1010 return false; 1013 return false;
1011 } 1014 }
1012 if (!parser.ReadUInt32(&value)) 1015 if (!parser.ReadUInt32(&value))
1013 return false; 1016 return false;
1014 SettingsFlagsAndId id_and_flags = 1017 SettingsFlagsAndId id_and_flags =
1015 SettingsFlagsAndId::FromWireFormat(frame->version(), id_and_flags_wire); 1018 SettingsFlagsAndId::FromWireFormat(frame->version(), id_and_flags_wire);
1016 settings->insert(settings->end(), std::make_pair(id_and_flags, value)); 1019 settings->insert(settings->end(), std::make_pair(id_and_flags, value));
1017 } 1020 }
1018 return true; 1021 return true;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 frame.WriteUInt16(SYN_STREAM); 1072 frame.WriteUInt16(SYN_STREAM);
1070 frame.WriteBytes(&flags_length, sizeof(flags_length)); 1073 frame.WriteBytes(&flags_length, sizeof(flags_length));
1071 frame.WriteUInt32(stream_id); 1074 frame.WriteUInt32(stream_id);
1072 frame.WriteUInt32(associated_stream_id); 1075 frame.WriteUInt32(associated_stream_id);
1073 // Cap as appropriate. 1076 // Cap as appropriate.
1074 if (priority > GetLowestPriority()) { 1077 if (priority > GetLowestPriority()) {
1075 DLOG(ERROR) << "Priority out-of-bounds."; 1078 DLOG(ERROR) << "Priority out-of-bounds.";
1076 priority = GetLowestPriority(); 1079 priority = GetLowestPriority();
1077 } 1080 }
1078 // Priority is 2 bits for <spdy3, 3 bits otherwise. 1081 // Priority is 2 bits for <spdy3, 3 bits otherwise.
1079 frame.WriteUInt16(ntohs(priority) << (spdy_version_ < 3 ? 6 : 5)); 1082 frame.WriteUInt16(base::NetToHost16(priority) << (spdy_version_ < 3 ? 6 : 5));
1080 WriteHeaderBlock(&frame, headers); 1083 WriteHeaderBlock(&frame, headers);
1081 1084
1082 scoped_ptr<SpdySynStreamControlFrame> syn_frame( 1085 scoped_ptr<SpdySynStreamControlFrame> syn_frame(
1083 reinterpret_cast<SpdySynStreamControlFrame*>(frame.take())); 1086 reinterpret_cast<SpdySynStreamControlFrame*>(frame.take()));
1084 if (compressed) { 1087 if (compressed) {
1085 return reinterpret_cast<SpdySynStreamControlFrame*>( 1088 return reinterpret_cast<SpdySynStreamControlFrame*>(
1086 CompressControlFrame(*syn_frame.get())); 1089 CompressControlFrame(*syn_frame.get()));
1087 } 1090 }
1088 return syn_frame.release(); 1091 return syn_frame.release();
1089 } 1092 }
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 SpdyDataFrame* SpdyFramer::CreateDataFrame(SpdyStreamId stream_id, 1291 SpdyDataFrame* SpdyFramer::CreateDataFrame(SpdyStreamId stream_id,
1289 const char* data, 1292 const char* data,
1290 uint32 len, SpdyDataFlags flags) { 1293 uint32 len, SpdyDataFlags flags) {
1291 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); 1294 DCHECK_EQ(0u, stream_id & ~kStreamIdMask);
1292 1295
1293 SpdyFrameBuilder frame(SpdyDataFrame::size() + len); 1296 SpdyFrameBuilder frame(SpdyDataFrame::size() + len);
1294 frame.WriteUInt32(stream_id); 1297 frame.WriteUInt32(stream_id);
1295 1298
1296 DCHECK_EQ(0u, len & ~static_cast<size_t>(kLengthMask)); 1299 DCHECK_EQ(0u, len & ~static_cast<size_t>(kLengthMask));
1297 FlagsAndLength flags_length; 1300 FlagsAndLength flags_length;
1298 flags_length.length_ = htonl(len); 1301 flags_length.length_ = base::HostToNet32(len);
1299 DCHECK_EQ(0, flags & ~kDataFlagsMask); 1302 DCHECK_EQ(0, flags & ~kDataFlagsMask);
1300 flags_length.flags_[0] = flags; 1303 flags_length.flags_[0] = flags;
1301 frame.WriteBytes(&flags_length, sizeof(flags_length)); 1304 frame.WriteBytes(&flags_length, sizeof(flags_length));
1302 1305
1303 frame.WriteBytes(data, len); 1306 frame.WriteBytes(data, len);
1304 scoped_ptr<SpdyFrame> data_frame(frame.take()); 1307 scoped_ptr<SpdyFrame> data_frame(frame.take());
1305 SpdyDataFrame* rv; 1308 SpdyDataFrame* rv;
1306 if (flags & DATA_FLAG_COMPRESSED) { 1309 if (flags & DATA_FLAG_COMPRESSED) {
1307 LOG(DFATAL) << "DATA_FLAG_COMPRESSED invalid for " << display_protocol_ 1310 LOG(DFATAL) << "DATA_FLAG_COMPRESSED invalid for " << display_protocol_
1308 << "."; 1311 << ".";
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
1768 1771
1769 void SpdyFramer::set_validate_control_frame_sizes(bool value) { 1772 void SpdyFramer::set_validate_control_frame_sizes(bool value) {
1770 validate_control_frame_sizes_ = value; 1773 validate_control_frame_sizes_ = value;
1771 } 1774 }
1772 1775
1773 void SpdyFramer::set_enable_compression_default(bool value) { 1776 void SpdyFramer::set_enable_compression_default(bool value) {
1774 compression_default_ = value; 1777 compression_default_ = value;
1775 } 1778 }
1776 1779
1777 } // namespace spdy 1780 } // namespace spdy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698