1/*
2 * Copyright (c) 2002-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 165 unchanged lines hidden (view full) ---

174
175class IpPtr
176{
177 protected:
178 friend class TcpPtr;
179 friend class UdpPtr;
180 EthPacketPtr p;
181
182 const IpHdr *h() const
183 { return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
184 IpHdr *h() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
185
182 void set(const EthPacketPtr &ptr)
183 {
188 EthHdr *eth = (EthHdr *)ptr->data;
189 if (eth->type() == ETH_TYPE_IP)
190 p = ptr;
191 else
192 p = 0;
184 p = 0;
185
186 if (ptr) {
187 EthHdr *eth = (EthHdr *)ptr->data;
188 if (eth->type() == ETH_TYPE_IP)
189 p = ptr;
190 }
191 }
192
193 public:
196 IpPtr() {}
197 IpPtr(const EthPacketPtr &ptr) { set(ptr); }
198 IpPtr(const EthPtr &ptr) { set(ptr.p); }
194 IpPtr() : p(0) {}
195 IpPtr(const EthPacketPtr &ptr) : p(0) { set(ptr); }
196 IpPtr(const EthPtr &ptr) : p(0) { set(ptr.p); }
197 IpPtr(const IpPtr &ptr) : p(ptr.p) { }
198
201 IpHdr *operator->() { return h(); }
202 IpHdr &operator*() { return *h(); }
203 operator IpHdr *() { return h(); }
199 IpHdr *get() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
200 IpHdr *operator->() { return get(); }
201 IpHdr &operator*() { return *get(); }
202
205 const IpHdr *operator->() const { return h(); }
206 const IpHdr &operator*() const { return *h(); }
207 operator const IpHdr *() const { return h(); }
203 const IpHdr *get() const
204 { return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
205 const IpHdr *operator->() const { return get(); }
206 const IpHdr &operator*() const { return *get(); }
207
208 const IpPtr &operator=(const EthPacketPtr &ptr) { set(ptr); return *this; }
209 const IpPtr &operator=(const EthPtr &ptr) { set(ptr.p); return *this; }
210 const IpPtr &operator=(const IpPtr &ptr) { p = ptr.p; return *this; }
211
212 const EthPacketPtr packet() const { return p; }
213 EthPacketPtr packet() { return p; }
214 bool operator!() const { return !p; }
215 operator bool() const { return p; }
217 operator bool() { return p; }
216};
217
218uint16_t cksum(const IpPtr &ptr);
219
220struct IpOpt : public ip_opt
221{
222 uint8_t type() const { return opt_type; }
223 uint8_t typeNumber() const { return IP_OPT_NUMBER(opt_type); }

--- 47 unchanged lines hidden (view full) ---

271};
272
273class TcpPtr
274{
275 protected:
276 EthPacketPtr p;
277 int off;
278
281 const TcpHdr *h() const { return (const TcpHdr *)(p->data + off); }
282 TcpHdr *h() { return (TcpHdr *)(p->data + off); }
283
279 void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
280 void set(const IpPtr &ptr)
281 {
287 if (ptr->proto() == IP_PROTO_TCP)
282 if (ptr && ptr->proto() == IP_PROTO_TCP)
283 set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
284 else
285 set(0, 0);
286 }
287
288 public:
294 TcpPtr() {}
295 TcpPtr(const IpPtr &ptr) { set(ptr); }
289 TcpPtr() : p(0), off(0) {}
290 TcpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
291 TcpPtr(const TcpPtr &ptr) : p(ptr.p), off(ptr.off) {}
292
298 TcpHdr *operator->() { return h(); }
299 TcpHdr &operator*() { return *h(); }
300 operator TcpHdr *() { return h(); }
293 TcpHdr *get() { return (TcpHdr *)(p->data + off); }
294 TcpHdr *operator->() { return get(); }
295 TcpHdr &operator*() { return *get(); }
296
302 const TcpHdr *operator->() const { return h(); }
303 const TcpHdr &operator*() const { return *h(); }
304 operator const TcpHdr *() const { return h(); }
297 const TcpHdr *get() const { return (const TcpHdr *)(p->data + off); }
298 const TcpHdr *operator->() const { return get(); }
299 const TcpHdr &operator*() const { return *get(); }
300
301 const TcpPtr &operator=(const IpPtr &i) { set(i); return *this; }
302 const TcpPtr &operator=(const TcpPtr &t) { set(t.p, t.off); return *this; }
303
304 const EthPacketPtr packet() const { return p; }
305 EthPacketPtr packet() { return p; }
306 bool operator!() const { return !p; }
307 operator bool() const { return p; }
313 operator bool() { return p; }
308};
309
310uint16_t cksum(const TcpPtr &ptr);
311
312typedef Range<uint16_t> SackRange;
313
314struct TcpOpt : public tcp_opt
315{

--- 41 unchanged lines hidden (view full) ---

357};
358
359class UdpPtr
360{
361 protected:
362 EthPacketPtr p;
363 int off;
364
371 const UdpHdr *h() const { return (const UdpHdr *)(p->data + off); }
372 UdpHdr *h() { return (UdpHdr *)(p->data + off); }
373
365 void set(const EthPacketPtr &ptr, int offset) { p = ptr; off = offset; }
366 void set(const IpPtr &ptr)
367 {
377 if (ptr->proto() == IP_PROTO_UDP)
368 if (ptr && ptr->proto() == IP_PROTO_UDP)
369 set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
370 else
371 set(0, 0);
372 }
373
374 public:
384 UdpPtr() {}
385 UdpPtr(const IpPtr &ptr) { set(ptr); }
375 UdpPtr() : p(0), off(0) {}
376 UdpPtr(const IpPtr &ptr) : p(0), off(0) { set(ptr); }
377 UdpPtr(const UdpPtr &ptr) : p(ptr.p), off(ptr.off) {}
378
388 UdpHdr *operator->() { return h(); }
389 UdpHdr &operator*() { return *h(); }
390 operator UdpHdr *() { return h(); }
379 UdpHdr *get() { return (UdpHdr *)(p->data + off); }
380 UdpHdr *operator->() { return get(); }
381 UdpHdr &operator*() { return *get(); }
382
392 const UdpHdr *operator->() const { return h(); }
393 const UdpHdr &operator*() const { return *h(); }
394 operator const UdpHdr *() const { return h(); }
383 const UdpHdr *get() const { return (const UdpHdr *)(p->data + off); }
384 const UdpHdr *operator->() const { return get(); }
385 const UdpHdr &operator*() const { return *get(); }
386
387 const UdpPtr &operator=(const IpPtr &i) { set(i); return *this; }
388 const UdpPtr &operator=(const UdpPtr &t) { set(t.p, t.off); return *this; }
389
390 const EthPacketPtr packet() const { return p; }
391 EthPacketPtr packet() { return p; }
392 bool operator!() const { return !p; }
393 operator bool() const { return p; }
403 operator bool() { return p; }
394};
395
396uint16_t cksum(const UdpPtr &ptr);
397
398/* namespace Net */ }
399
400#endif // __BASE_INET_HH__