91 uint8_t buf[12]; |
91 uint8_t buf[12]; |
92 source.Serialize (buf); |
92 source.Serialize (buf); |
93 destination.Serialize (buf+4); |
93 destination.Serialize (buf+4); |
94 buf[8] = 0; |
94 buf[8] = 0; |
95 buf[9] = protocol; |
95 buf[9] = protocol; |
96 uint16_t udpLength = m_payloadSize + GetSize (); |
96 uint16_t udpLength = m_payloadSize + GetSerializedSize (); |
97 buf[10] = udpLength >> 8; |
97 buf[10] = udpLength >> 8; |
98 buf[11] = udpLength & 0xff; |
98 buf[11] = udpLength & 0xff; |
99 |
99 |
100 m_initialChecksum = Ipv4ChecksumCalculate (0, buf, 12); |
100 m_initialChecksum = Ipv4ChecksumCalculate (0, buf, 12); |
101 } |
101 } |
102 |
102 |
103 std::string |
103 std::string |
104 UdpHeader::DoGetName (void) const |
104 UdpHeader::GetName (void) const |
105 { |
105 { |
106 return "UDP"; |
106 return "UDP"; |
107 } |
107 } |
108 |
108 |
109 void |
109 void |
110 UdpHeader::PrintTo (std::ostream &os) const |
110 UdpHeader::Print (std::ostream &os) const |
111 { |
111 { |
112 os << "(" |
112 os << "(" |
113 << "length: " << m_payloadSize + GetSize () |
113 << "length: " << m_payloadSize + GetSerializedSize () |
114 << ") " |
114 << ") " |
115 << m_sourcePort << " > " << m_destinationPort |
115 << m_sourcePort << " > " << m_destinationPort |
116 ; |
116 ; |
117 } |
117 } |
118 |
118 |
121 { |
121 { |
122 return 8; |
122 return 8; |
123 } |
123 } |
124 |
124 |
125 void |
125 void |
126 UdpHeader::SerializeTo (Buffer::Iterator start) const |
126 UdpHeader::Serialize (Buffer::Iterator start) const |
127 { |
127 { |
128 Buffer::Iterator i = start; |
128 Buffer::Iterator i = start; |
129 i.WriteHtonU16 (m_sourcePort); |
129 i.WriteHtonU16 (m_sourcePort); |
130 i.WriteHtonU16 (m_destinationPort); |
130 i.WriteHtonU16 (m_destinationPort); |
131 i.WriteHtonU16 (m_payloadSize + GetSize ()); |
131 i.WriteHtonU16 (m_payloadSize + GetSerializedSize ()); |
132 i.WriteU16 (0); |
132 i.WriteU16 (0); |
133 |
133 |
134 if (m_calcChecksum) |
134 if (m_calcChecksum) |
135 { |
135 { |
136 #if 0 |
136 #if 0 |
137 //XXXX |
137 //XXXX |
138 uint16_t checksum = Ipv4ChecksumCalculate (m_initialChecksum, |
138 uint16_t checksum = Ipv4ChecksumCalculate (m_initialChecksum, |
139 buffer->PeekData (), |
139 buffer->PeekData (), |
140 GetSize () + m_payloadSize); |
140 GetSerializedSize () + m_payloadSize); |
141 checksum = Ipv4ChecksumComplete (checksum); |
141 checksum = Ipv4ChecksumComplete (checksum); |
142 i = buffer->Begin (); |
142 i = buffer->Begin (); |
143 i.Next (6); |
143 i.Next (6); |
144 i.WriteU16 (checksum); |
144 i.WriteU16 (checksum); |
145 #endif |
145 #endif |
146 } |
146 } |
147 } |
147 } |
148 uint32_t |
148 uint32_t |
149 UdpHeader::DeserializeFrom (Buffer::Iterator start) |
149 UdpHeader::Deserialize (Buffer::Iterator start) |
150 { |
150 { |
151 Buffer::Iterator i = start; |
151 Buffer::Iterator i = start; |
152 m_sourcePort = i.ReadNtohU16 (); |
152 m_sourcePort = i.ReadNtohU16 (); |
153 m_destinationPort = i.ReadNtohU16 (); |
153 m_destinationPort = i.ReadNtohU16 (); |
154 m_payloadSize = i.ReadNtohU16 () - GetSize (); |
154 m_payloadSize = i.ReadNtohU16 () - GetSerializedSize (); |
155 if (m_calcChecksum) |
155 if (m_calcChecksum) |
156 { |
156 { |
157 // XXX verify checksum. |
157 // XXX verify checksum. |
158 } |
158 } |
159 return GetSerializedSize (); |
159 return GetSerializedSize (); |