예제 #1
0
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);
	}

}
예제 #2
0
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);
	}
}