Fragment a big IP datagram
(pkt, fragsize=1480)
| 1391 | |
| 1392 | @conf.commands.register |
| 1393 | def fragment(pkt, fragsize=1480): |
| 1394 | """Fragment a big IP datagram""" |
| 1395 | if fragsize < 8: |
| 1396 | warning("fragsize cannot be lower than 8") |
| 1397 | fragsize = max(fragsize, 8) |
| 1398 | lastfragsz = fragsize |
| 1399 | fragsize -= fragsize % 8 |
| 1400 | lst = [] |
| 1401 | for p in pkt: |
| 1402 | s = raw(p[IP].payload) |
| 1403 | nb = (len(s) - lastfragsz + fragsize - 1) // fragsize + 1 |
| 1404 | for i in range(nb): |
| 1405 | q = p.copy() |
| 1406 | del q[IP].payload |
| 1407 | del q[IP].chksum |
| 1408 | del q[IP].len |
| 1409 | if i != nb - 1: |
| 1410 | q[IP].flags |= 1 |
| 1411 | fragend = (i + 1) * fragsize |
| 1412 | else: |
| 1413 | fragend = i * fragsize + lastfragsz |
| 1414 | q[IP].frag += i * fragsize // 8 |
| 1415 | r = conf.raw_layer(load=s[i * fragsize:fragend]) |
| 1416 | r.overload_fields = p[IP].payload.overload_fields.copy() |
| 1417 | q.add_payload(r) |
| 1418 | lst.append(q) |
| 1419 | return lst |
| 1420 | |
| 1421 | |
| 1422 | @conf.commands.register |
no test coverage detected