1# SPDX-License-Identifier: GPL-2.0-only
2# This file is part of Scapy
3# See https://scapy.net/ for more information
4# Copyright (C) Philippe Biondi <phil@secdev.org>
5
6"""
7Mobile IP.
8"""
9
10from scapy.fields import ByteEnumField, ByteField, IPField, LongField, \
11 ShortField, XByteField
12from scapy.packet import Packet, bind_layers, bind_bottom_up
13from scapy.layers.inet import IP, UDP
14
15
16class MobileIP(Packet):
17 name = "Mobile IP (RFC3344)"
18 fields_desc = [ByteEnumField("type", 1, {1: "RRQ", 3: "RRP"})]
19
20
21class MobileIPRRQ(Packet):
22 name = "Mobile IP Registration Request (RFC3344)"
23 fields_desc = [XByteField("flags", 0),
24 ShortField("lifetime", 180),
25 IPField("homeaddr", "0.0.0.0"),
26 IPField("haaddr", "0.0.0.0"),
27 IPField("coaddr", "0.0.0.0"),
28 LongField("id", 0), ]
29
30
31class MobileIPRRP(Packet):
32 name = "Mobile IP Registration Reply (RFC3344)"
33 fields_desc = [ByteField("code", 0),
34 ShortField("lifetime", 180),
35 IPField("homeaddr", "0.0.0.0"),
36 IPField("haaddr", "0.0.0.0"),
37 LongField("id", 0), ]
38
39
40class MobileIPTunnelData(Packet):
41 name = "Mobile IP Tunnel Data Message (RFC3519)"
42 fields_desc = [ByteField("nexthdr", 4),
43 ShortField("res", 0)]
44
45
46bind_bottom_up(UDP, MobileIP, dport=434)
47bind_bottom_up(UDP, MobileIP, sport=434)
48bind_layers(UDP, MobileIP, sport=434, dport=434)
49bind_layers(MobileIP, MobileIPRRQ, type=1)
50bind_layers(MobileIP, MobileIPRRP, type=3)
51bind_layers(MobileIP, MobileIPTunnelData, type=4)
52bind_layers(MobileIPTunnelData, IP, nexthdr=4)