void IpAnalysis::analyzeProtocol(ProtocolStack &pstack, size_t *bytes) { if(_bufsize < sizeof(_iphdr)) { bzero(&_iphdr, sizeof(_iphdr)); return; } memcpy(&_iphdr, _buffer, sizeof(_iphdr)); _iphdr.tot_len = ntohs(_iphdr.tot_len); _iphdr.check = ntohs(_iphdr.check); if(bytes != NULL) *bytes += _iphdr.tot_len; pstack.push_back(this); Analysis *child = _getChild(_iphdr.protocol); if(child != NULL) { child->setBuffer(_buffer + getHeaderLen(), _bufsize - getHeaderLen()); child->analyzeProtocol(pstack, NULL); } }
void UdpAnalysis::analyzeProtocol(ProtocolStack &pstack, size_t *bytes) { if(_bufsize < sizeof(_udphdr)) { bzero(&_udphdr, sizeof(_udphdr)); return; } memcpy(&_udphdr, _buffer, sizeof(_udphdr)); _udphdr.source = ntohs(_udphdr.source); _udphdr.dest = ntohs(_udphdr.dest); _udphdr.len = ntohs(_udphdr.len); _udphdr.check = ntohs(_udphdr.check); if(bytes != NULL) *bytes += _udphdr.len; pstack.push_back(this); int port = _udphdr.source < _udphdr.dest ? _udphdr.source:_udphdr.dest; Analysis *child = _getChild(port); if(child != NULL) { child->setBuffer(_buffer + 8, _bufsize - 8); child->analyzeProtocol(pstack, NULL); } }