-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 @@ -404,24 +404,106 @@ int OUDPPacket::checksum() const *======================================================================================*/ ODHCPPacket::ODHCPPacket( const unsigned char* end, const struct dhcp_packet* data, QObject* parent ) :QObject( parent, "DHCP" ), _dhcphdr( data ) { qDebug( "ODHCPPacket::ODHCPPacket(): decoding DHCP information..." ); + qDebug( "DHCP opcode seems to be %02d - '%s'", _dhcphdr->op, isRequest() ? "REQUEST" : "REPLY" ); + qDebug( "clientAddress: %s", (const char*) clientAddress().toString() ); + qDebug( " yourAddress: %s", (const char*) yourAddress().toString() ); + qDebug( "serverAddress: %s", (const char*) serverAddress().toString() ); + qDebug( " relayAddress: %s", (const char*) relayAddress().toString() ); + qDebug( "parsing DHCP options..." ); + + _type = 0; + + const unsigned char* option = &_dhcphdr->options[4]; + char tag = -1; + char len = -1; + + while ( ( tag = *option++ ) != -1 /* end of option field */ ) + { + len = *option++; + qDebug( "recognized DHCP option #%d, length %d", tag, len ); + + if ( tag == DHO_DHCP_MESSAGE_TYPE ) + _type = *option; + + option += len; + if ( option >= end ) + { + qWarning( "DHCP parsing ERROR: sanity check says the packet is at its end!" ); + break; + } + } + + qDebug( "DHCP type seems to be '%s'", (const char*) type() ); } ODHCPPacket::~ODHCPPacket() { } +bool ODHCPPacket::isRequest() const +{ + return ( _dhcphdr->op == 01 ); +} + + +bool ODHCPPacket::isReply() const +{ + return ( _dhcphdr->op == 02 ); +} + + +QString ODHCPPacket::type() const +{ + switch ( _type ) + { + case 1: return "DISCOVER"; + case 2: return "OFFER"; + case 3: return "REQUEST"; + case 4: return "DECLINE"; + case 5: return "ACK"; + case 6: return "NAK"; + case 7: return "RELEASE"; + case 8: return "INFORM"; + default: qWarning( "ODHCPPacket::type(): invalid DHCP type (%d) !", _dhcphdr->op ); return "<unknown>"; + } +} + + +QHostAddress ODHCPPacket::clientAddress() const +{ + return EXTRACT_32BITS( &_dhcphdr->ciaddr ); +} + + +QHostAddress ODHCPPacket::yourAddress() const +{ + return EXTRACT_32BITS( &_dhcphdr->yiaddr ); +} + + +QHostAddress ODHCPPacket::serverAddress() const +{ + return EXTRACT_32BITS( &_dhcphdr->siaddr ); +} + + +QHostAddress ODHCPPacket::relayAddress() const +{ + return EXTRACT_32BITS( &_dhcphdr->giaddr ); +} + /*====================================================================================== * OTCPPacket *======================================================================================*/ OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) :QObject( parent, "TCP" ), _tcphdr( data ) 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 @@ -494,18 +494,28 @@ class OUDPPacket : public QObject class ODHCPPacket : public QObject { Q_OBJECT public: ODHCPPacket( const unsigned char*, const struct dhcp_packet*, QObject* parent = 0 ); virtual ~ODHCPPacket(); + QHostAddress clientAddress() const; + QHostAddress yourAddress() const; + QHostAddress serverAddress() const; + QHostAddress relayAddress() const; + + bool isRequest() const; + bool isReply() const; + QString type() const; + private: const struct dhcp_packet* _dhcphdr; + unsigned char _type; }; /*====================================================================================== * OTCPPacket *======================================================================================*/ class OTCPPacket : public QObject { |