author | mickeyl <mickeyl> | 2003-10-04 01:34:13 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-10-04 01:34:13 (UTC) |
commit | a4793f5226e9eb5c8a718cca9335c23530e08b08 (patch) (unidiff) | |
tree | 9e18d900f9c0a96170c8221ba4e60e7b7937cf39 | |
parent | e2716e3862915582d0ce48aaacc967f5b0cf6550 (diff) | |
download | opie-a4793f5226e9eb5c8a718cca9335c23530e08b08.zip opie-a4793f5226e9eb5c8a718cca9335c23530e08b08.tar.gz opie-a4793f5226e9eb5c8a718cca9335c23530e08b08.tar.bz2 |
Although not yet complete, the DHCP decoding is now usable
-rw-r--r-- | libopie2/opienet/opcap.cpp | 82 | ||||
-rw-r--r-- | libopie2/opienet/opcap.h | 10 |
2 files changed, 92 insertions, 0 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp index f1f2b4b..7a6f61b 100644 --- a/libopie2/opienet/opcap.cpp +++ b/libopie2/opienet/opcap.cpp | |||
@@ -396,40 +396,122 @@ int OUDPPacket::length() const | |||
396 | int OUDPPacket::checksum() const | 396 | int OUDPPacket::checksum() const |
397 | { | 397 | { |
398 | return EXTRACT_16BITS( &_udphdr->check ); | 398 | return EXTRACT_16BITS( &_udphdr->check ); |
399 | } | 399 | } |
400 | 400 | ||
401 | 401 | ||
402 | /*====================================================================================== | 402 | /*====================================================================================== |
403 | * ODHCPPacket | 403 | * ODHCPPacket |
404 | *======================================================================================*/ | 404 | *======================================================================================*/ |
405 | 405 | ||
406 | 406 | ||
407 | ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) | 407 | ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) |
408 | :QObject( parent, "DHCP" ), _dhcphdr( data ) | 408 | :QObject( parent, "DHCP" ), _dhcphdr( data ) |
409 | 409 | ||
410 | { | 410 | { |
411 | qDebug( "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." ); | 411 | qDebug( "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." ); |
412 | qDebug( "DHCP opcode seems to be %02d - '%s'", _dhcphdr->op, isRequest() ? "REQUEST" : "REPLY" ); | ||
413 | qDebug( "clientAddress: %s", (const char*) clientAddress().toString() ); | ||
414 | qDebug( " yourAddress: %s", (const char*) yourAddress().toString() ); | ||
415 | qDebug( "serverAddress: %s", (const char*) serverAddress().toString() ); | ||
416 | qDebug( " relayAddress: %s", (const char*) relayAddress().toString() ); | ||
417 | qDebug( "parsing DHCP options..." ); | ||
418 | |||
419 | _type = 0; | ||
420 | |||
421 | const unsigned char* option = &_dhcphdr->options[4]; | ||
422 | char tag = -1; | ||
423 | char len = -1; | ||
424 | |||
425 | while ( ( tag = *option++ ) != -1 /* end of option field */ ) | ||
426 | { | ||
427 | len = *option++; | ||
428 | qDebug( "recognized DHCP option #%d, length %d", tag, len ); | ||
429 | |||
430 | if ( tag == DHO_DHCP_MESSAGE_TYPE ) | ||
431 | _type = *option; | ||
432 | |||
433 | option += len; | ||
434 | if ( option >= end ) | ||
435 | { | ||
436 | qWarning( "DHCP parsing ERROR: sanity check says the packet is at its end!" ); | ||
437 | break; | ||
438 | } | ||
439 | } | ||
440 | |||
441 | qDebug( "DHCP type seems to be '%s'", (const char*) type() ); | ||
412 | } | 442 | } |
413 | 443 | ||
414 | 444 | ||
415 | ODHCPPacket::~ODHCPPacket() | 445 | ODHCPPacket::~ODHCPPacket() |
416 | { | 446 | { |
417 | } | 447 | } |
418 | 448 | ||
419 | 449 | ||
450 | bool ODHCPPacket::isRequest() const | ||
451 | { | ||
452 | return ( _dhcphdr->op == 01 ); | ||
453 | } | ||
454 | |||
455 | |||
456 | bool ODHCPPacket::isReply() const | ||
457 | { | ||
458 | return ( _dhcphdr->op == 02 ); | ||
459 | } | ||
460 | |||
461 | |||
462 | QString ODHCPPacket::type() const | ||
463 | { | ||
464 | switch ( _type ) | ||
465 | { | ||
466 | case 1: return "DISCOVER"; | ||
467 | case 2: return "OFFER"; | ||
468 | case 3: return "REQUEST"; | ||
469 | case 4: return "DECLINE"; | ||
470 | case 5: return "ACK"; | ||
471 | case 6: return "NAK"; | ||
472 | case 7: return "RELEASE"; | ||
473 | case 8: return "INFORM"; | ||
474 | default: qWarning( "ODHCPPacket::type(): invalid DHCP type (%d) !", _dhcphdr->op ); return "<unknown>"; | ||
475 | } | ||
476 | } | ||
477 | |||
478 | |||
479 | QHostAddress ODHCPPacket::clientAddress() const | ||
480 | { | ||
481 | return EXTRACT_32BITS( &_dhcphdr->ciaddr ); | ||
482 | } | ||
483 | |||
484 | |||
485 | QHostAddress ODHCPPacket::yourAddress() const | ||
486 | { | ||
487 | return EXTRACT_32BITS( &_dhcphdr->yiaddr ); | ||
488 | } | ||
489 | |||
490 | |||
491 | QHostAddress ODHCPPacket::serverAddress() const | ||
492 | { | ||
493 | return EXTRACT_32BITS( &_dhcphdr->siaddr ); | ||
494 | } | ||
495 | |||
496 | |||
497 | QHostAddress ODHCPPacket::relayAddress() const | ||
498 | { | ||
499 | return EXTRACT_32BITS( &_dhcphdr->giaddr ); | ||
500 | } | ||
501 | |||
420 | /*====================================================================================== | 502 | /*====================================================================================== |
421 | * OTCPPacket | 503 | * OTCPPacket |
422 | *======================================================================================*/ | 504 | *======================================================================================*/ |
423 | 505 | ||
424 | 506 | ||
425 | OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) | 507 | OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) |
426 | :QObject( parent, "TCP" ), _tcphdr( data ) | 508 | :QObject( parent, "TCP" ), _tcphdr( data ) |
427 | 509 | ||
428 | { | 510 | { |
429 | qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); | 511 | qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); |
430 | } | 512 | } |
431 | 513 | ||
432 | 514 | ||
433 | OTCPPacket::~OTCPPacket() | 515 | OTCPPacket::~OTCPPacket() |
434 | { | 516 | { |
435 | } | 517 | } |
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h index 0c9e7da..a031dd1 100644 --- a/libopie2/opienet/opcap.h +++ b/libopie2/opienet/opcap.h | |||
@@ -486,34 +486,44 @@ class OUDPPacket : public QObject | |||
486 | private: | 486 | private: |
487 | const struct udphdr* _udphdr; | 487 | const struct udphdr* _udphdr; |
488 | }; | 488 | }; |
489 | 489 | ||
490 | /*====================================================================================== | 490 | /*====================================================================================== |
491 | * ODHCPPacket | 491 | * ODHCPPacket |
492 | *======================================================================================*/ | 492 | *======================================================================================*/ |
493 | 493 | ||
494 | class ODHCPPacket : public QObject | 494 | class ODHCPPacket : public QObject |
495 | { | 495 | { |
496 | Q_OBJECT | 496 | Q_OBJECT |
497 | 497 | ||
498 | public: | 498 | public: |
499 | ODHCPPacket( const unsigned char*, const struct dhcp_packet*, QObject* parent = 0 ); | 499 | ODHCPPacket( const unsigned char*, const struct dhcp_packet*, QObject* parent = 0 ); |
500 | virtual ~ODHCPPacket(); | 500 | virtual ~ODHCPPacket(); |
501 | 501 | ||
502 | QHostAddress clientAddress() const; | ||
503 | QHostAddress yourAddress() const; | ||
504 | QHostAddress serverAddress() const; | ||
505 | QHostAddress relayAddress() const; | ||
506 | |||
507 | bool isRequest() const; | ||
508 | bool isReply() const; | ||
509 | QString type() const; | ||
510 | |||
502 | private: | 511 | private: |
503 | const struct dhcp_packet* _dhcphdr; | 512 | const struct dhcp_packet* _dhcphdr; |
513 | unsigned char _type; | ||
504 | }; | 514 | }; |
505 | 515 | ||
506 | /*====================================================================================== | 516 | /*====================================================================================== |
507 | * OTCPPacket | 517 | * OTCPPacket |
508 | *======================================================================================*/ | 518 | *======================================================================================*/ |
509 | 519 | ||
510 | class OTCPPacket : public QObject | 520 | class OTCPPacket : public QObject |
511 | { | 521 | { |
512 | Q_OBJECT | 522 | Q_OBJECT |
513 | 523 | ||
514 | public: | 524 | public: |
515 | OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 ); | 525 | OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 ); |
516 | virtual ~OTCPPacket(); | 526 | virtual ~OTCPPacket(); |
517 | 527 | ||
518 | int fromPort() const; | 528 | int fromPort() const; |
519 | int toPort() const; | 529 | int toPort() const; |