-
Notifications
You must be signed in to change notification settings - Fork 0
/
iputils.py
34 lines (28 loc) · 1.19 KB
/
iputils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Você pode usar tudo que está definido neste arquivo na sua implementação de IP,
# porém NÃO EDITE este arquivo. Se você editá-lo, ele será ignorado pelo robô de
# correção do Autolab, pois os testes dependem das definições aqui realizadas.
import struct
# Funções que foram usadas no TCP e também são úteis
# para a implementação do protocolo IP
from tcputils import str2addr, addr2str, calc_checksum
IPPROTO_ICMP = 1
IPPROTO_TCP = 6
def read_ipv4_header(datagram, verify_checksum=False):
# https://en.wikipedia.org/wiki/IPv4#Header
vihl, dscpecn, total_len, identification, flagsfrag, ttl, proto, \
checksum, src_addr, dest_addr = \
struct.unpack('!BBHHHBBHII', datagram[:20])
version = vihl >> 4
ihl = vihl & 0xf
assert version == 4
dscp = dscpecn >> 2
ecn = dscpecn & 0b11
flags = flagsfrag >> 13
frag_offset = flagsfrag & 0x1fff
src_addr = addr2str(datagram[12:16])
dst_addr = addr2str(datagram[16:20])
if verify_checksum:
assert calc_checksum(datagram[:4*ihl]) == 0
payload = datagram[4*ihl:total_len]
return dscp, ecn, identification, flags, frag_offset, ttl, proto, \
src_addr, dst_addr, payload