-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 | |||
@@ -406,20 +406,102 @@ int OUDPPacket::checksum() const | |||
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 ) |
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 | |||
@@ -496,14 +496,24 @@ class ODHCPPacket : public QObject | |||
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 | ||