调整项目结构、尝试支持安卓
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
pub mod packet;
|
||||
pub mod protocol;
|
||||
@@ -0,0 +1,250 @@
|
||||
use std::fmt;
|
||||
use std::net::Ipv4Addr;
|
||||
|
||||
use byteorder::{BigEndian, ReadBytesExt};
|
||||
|
||||
use crate::cal_checksum;
|
||||
use crate::error::*;
|
||||
use crate::ip::ipv4::protocol::Protocol;
|
||||
|
||||
/// ip协议
|
||||
/*
|
||||
RFC: 791 https://www.ietf.org/rfc/rfc791.txt
|
||||
|
||||
0 15 31
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 版本(4) | 头部长度(4) | 服务类型(8) | 总字节数(16) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 标识(16) | 标志(3) | 片偏移(13) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 生存时间(8) | 协议(8) | 头部校验和(16) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 源ip地址(32) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 目的ip地址(32) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| 选项 + 填充 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
数据体
|
||||
注:头部长度单位是4字节,所以ip头最长60字节,选项最长40字节,选项填充按4字节对齐
|
||||
*/
|
||||
|
||||
pub struct IpV4Packet<B> {
|
||||
pub buffer: B,
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]>> IpV4Packet<B> {
|
||||
pub fn unchecked(buffer: B) -> Self {
|
||||
Self { buffer }
|
||||
}
|
||||
pub fn new(buffer: B) -> Result<Self> {
|
||||
if buffer.as_ref()[0] >> 4 != 4 {
|
||||
Err(Error::Unimplemented)?
|
||||
}
|
||||
if buffer.as_ref().len() < 20 {
|
||||
Err(Error::SmallBuffer)?
|
||||
}
|
||||
let packet = Self::unchecked(buffer);
|
||||
if packet.buffer.as_ref().len() < packet.header_len() as usize * 4 {
|
||||
Err(Error::SmallBuffer)?
|
||||
}
|
||||
Ok(packet)
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]>> IpV4Packet<B> {
|
||||
pub fn header(&self) -> &[u8] {
|
||||
&self.buffer.as_ref()[..(self.header_len() as usize * 4)]
|
||||
}
|
||||
pub fn payload(&self) -> &[u8] {
|
||||
&self.buffer.as_ref()[(self.header_len() as usize * 4)..]
|
||||
// match self.protocol() {
|
||||
// Protocol::Udp => {
|
||||
// let udp = UdpPacket::new(IpAddr::V4(self.source_ip()),
|
||||
// IpAddr::V4(self.destination_ip()),
|
||||
// &self.buffer.as_ref()[(self.header_len() as usize * 4)..])?;
|
||||
// Ok(crate::IpUpperLayer::UDP(udp))
|
||||
// }
|
||||
// _ => {
|
||||
// Ok(crate::IpUpperLayer::Unknown(self.buffer.as_ref()));
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]> + AsMut<[u8]>> IpV4Packet<B> {
|
||||
pub fn header_mut(&mut self) -> &mut [u8] {
|
||||
let len = self.header_len() as usize * 4;
|
||||
&mut self.buffer.as_mut()[..len]
|
||||
}
|
||||
pub fn payload_mut(&mut self) -> &mut [u8] {
|
||||
let len = self.header_len() as usize * 4;
|
||||
&mut self.buffer.as_mut()[len..]
|
||||
}
|
||||
|
||||
pub fn set_source_ip(&mut self, value: Ipv4Addr) {
|
||||
self.header_mut()[12..16].copy_from_slice(&value.octets());
|
||||
}
|
||||
pub fn set_destination_ip(&mut self, value: Ipv4Addr) {
|
||||
self.header_mut()[16..20].copy_from_slice(&value.octets());
|
||||
}
|
||||
fn set_checksum(&mut self, value: u16) {
|
||||
self.header_mut()[10..12].copy_from_slice(&value.to_be_bytes())
|
||||
}
|
||||
/// 更新校验和
|
||||
pub fn update_checksum(&mut self) {
|
||||
//先将校验和置0
|
||||
self.set_checksum(0);
|
||||
self.set_checksum(cal_checksum(self.header()))
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]>> IpV4Packet<B> {
|
||||
/// 版本号,ipv4的为4
|
||||
pub fn version(&self) -> u8 {
|
||||
self.buffer.as_ref()[0] >> 4
|
||||
}
|
||||
|
||||
/// 头部长度,以4字节为单位
|
||||
pub fn header_len(&self) -> u8 {
|
||||
self.buffer.as_ref()[0] & 0b1111
|
||||
}
|
||||
|
||||
/// 差异化服务编码点
|
||||
///
|
||||
/// 类别(3)+丢失概率(2)+用途(1)
|
||||
///
|
||||
///
|
||||
/// 类别子字段值 | 名称
|
||||
/// ---|:---
|
||||
/// 000 | 常规(Routine)
|
||||
/// 001 | 优先(Priority)
|
||||
/// 010 | 立即(Immediate)
|
||||
/// 011 | 瞬间(Flash)
|
||||
/// 100 | 瞬间覆盖(Flash Override)
|
||||
/// 101 | 严重(CRITIC/ECP)
|
||||
/// 110 | 网间控制(Internetwork Control)
|
||||
/// 111 | 网络控制(Network Control)
|
||||
///
|
||||
///
|
||||
/// 参考:https://www.modb.pro/db/477116
|
||||
pub fn dscp(&self) -> u8 {
|
||||
self.buffer.as_ref()[1] >> 2
|
||||
}
|
||||
|
||||
/// 显示拥塞 00:发送主机不支持ECN 01或者10:发送主机支持ECN 11:路由器正在经历拥塞
|
||||
pub fn ecn(&self) -> u8 {
|
||||
self.buffer.as_ref()[1] & 0b11
|
||||
}
|
||||
|
||||
/// ip报总字节数
|
||||
pub fn length(&self) -> u16 {
|
||||
(&self.buffer.as_ref()[2..])
|
||||
.read_u16::<BigEndian>()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
/// 标识. ip报文在数据链路层可能会被拆分,同一报文的不同分组标识字段相同
|
||||
pub fn id(&self) -> u16 {
|
||||
(&self.buffer.as_ref()[4..])
|
||||
.read_u16::<BigEndian>()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
/// 标志 3位.
|
||||
/// 第1位没有使用
|
||||
/// 第2位表示不分段位(DF)
|
||||
/// 0:允许数据报分段
|
||||
/// 1:数据报不能分段
|
||||
/// 置1之后路由器不能对其分段处理,如果超过MTU值则路由器不能对其转发将其丢弃,并向源点发送错误消息
|
||||
/// 第3位表示更多段位
|
||||
/// 0:数据包后面没有包,该包为最后的包
|
||||
/// 1:数据包后面有更多的包
|
||||
pub fn flags(&self) -> u8 {
|
||||
self.buffer.as_ref()[6] >> 5
|
||||
}
|
||||
|
||||
/// 片偏移 13位.
|
||||
/// 以字节为单位,用于指明分段起始点相对于包头起始点的偏移量
|
||||
/// 由于分段到达时可能错序,所以分段的偏移字段可以使接收者按照正确的顺序重组数据包
|
||||
pub fn offset(&self) -> u16 {
|
||||
(&self.buffer.as_ref()[6..])
|
||||
.read_u16::<BigEndian>()
|
||||
.unwrap()
|
||||
& 0x1fff
|
||||
}
|
||||
|
||||
/// 生存时间.
|
||||
/// 每一跳 减1 到0了则会被丢弃
|
||||
pub fn ttl(&self) -> u8 {
|
||||
self.buffer.as_ref()[8]
|
||||
}
|
||||
|
||||
/// 协议.
|
||||
pub fn protocol(&self) -> Protocol {
|
||||
self.buffer.as_ref()[9].into()
|
||||
}
|
||||
|
||||
/// 首部校验和
|
||||
pub fn checksum(&self) -> u16 {
|
||||
(&self.buffer.as_ref()[10..])
|
||||
.read_u16::<BigEndian>()
|
||||
.unwrap()
|
||||
}
|
||||
/// 验证校验和
|
||||
///
|
||||
/// TCP/IP协议栈不会自己计算校验和,而是简单地将一个空的校验和字段(零或随机填充)交给网卡硬件。
|
||||
/// 所以抓到发出去的包校验和可能是错误的
|
||||
pub fn is_valid(&self) -> bool {
|
||||
self.checksum() == 0 || cal_checksum(self.header()) == 0
|
||||
}
|
||||
/// 源ip.
|
||||
pub fn source_ip(&self) -> Ipv4Addr {
|
||||
Ipv4Addr::new(
|
||||
self.buffer.as_ref()[12],
|
||||
self.buffer.as_ref()[13],
|
||||
self.buffer.as_ref()[14],
|
||||
self.buffer.as_ref()[15],
|
||||
)
|
||||
}
|
||||
|
||||
/// 目标ip.
|
||||
pub fn destination_ip(&self) -> Ipv4Addr {
|
||||
Ipv4Addr::new(
|
||||
self.buffer.as_ref()[16],
|
||||
self.buffer.as_ref()[17],
|
||||
self.buffer.as_ref()[18],
|
||||
self.buffer.as_ref()[19],
|
||||
)
|
||||
}
|
||||
|
||||
/// 选项.
|
||||
pub fn options(&self) -> &[u8] {
|
||||
&self.buffer.as_ref()[20..(self.header_len() as usize * 4)]
|
||||
}
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]>> fmt::Debug for IpV4Packet<B> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("ip::v4::Packet")
|
||||
.field("version", &self.version())
|
||||
.field("header_len", &self.header_len())
|
||||
.field("dscp", &self.dscp())
|
||||
.field("ecn", &self.ecn())
|
||||
.field("length", &self.length())
|
||||
.field("id", &self.id())
|
||||
.field("flags", &self.flags())
|
||||
.field("offset", &self.offset())
|
||||
.field("ttl", &self.ttl())
|
||||
.field("protocol", &self.protocol())
|
||||
.field("checksum", &self.checksum())
|
||||
.field("is_valid", &self.is_valid())
|
||||
.field("source", &self.source_ip())
|
||||
.field("destination", &self.destination_ip())
|
||||
.field("options", &self.options())
|
||||
.field("payload", &self.payload())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,742 @@
|
||||
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
|
||||
pub enum Protocol {
|
||||
///
|
||||
Hopopt,
|
||||
|
||||
///
|
||||
Icmp,
|
||||
|
||||
///
|
||||
Igmp,
|
||||
|
||||
///
|
||||
Ggp,
|
||||
|
||||
///
|
||||
Ipv4,
|
||||
|
||||
///
|
||||
St,
|
||||
|
||||
///
|
||||
Tcp,
|
||||
|
||||
///
|
||||
Cbt,
|
||||
|
||||
///
|
||||
Egp,
|
||||
|
||||
///
|
||||
Igp,
|
||||
|
||||
///
|
||||
BbnRccMon,
|
||||
|
||||
///
|
||||
NvpII,
|
||||
|
||||
///
|
||||
Pup,
|
||||
|
||||
///
|
||||
Argus,
|
||||
|
||||
///
|
||||
Emcon,
|
||||
|
||||
///
|
||||
Xnet,
|
||||
|
||||
///
|
||||
Chaos,
|
||||
|
||||
///
|
||||
Udp,
|
||||
|
||||
///
|
||||
Mux,
|
||||
|
||||
///
|
||||
DcnMeas,
|
||||
|
||||
///
|
||||
Hmp,
|
||||
|
||||
///
|
||||
Prm,
|
||||
|
||||
///
|
||||
XnsIdp,
|
||||
|
||||
///
|
||||
Trunk1,
|
||||
|
||||
///
|
||||
Trunk2,
|
||||
|
||||
///
|
||||
Leaf1,
|
||||
|
||||
///
|
||||
Leaf2,
|
||||
|
||||
///
|
||||
Rdp,
|
||||
|
||||
///
|
||||
Irtp,
|
||||
|
||||
///
|
||||
IsoTp4,
|
||||
|
||||
///
|
||||
Netblt,
|
||||
|
||||
///
|
||||
MfeNsp,
|
||||
|
||||
///
|
||||
MeritInp,
|
||||
|
||||
///
|
||||
Dccp,
|
||||
|
||||
///
|
||||
ThreePc,
|
||||
|
||||
///
|
||||
Idpr,
|
||||
|
||||
///
|
||||
Xtp,
|
||||
|
||||
///
|
||||
Ddp,
|
||||
|
||||
///
|
||||
IdprCmtp,
|
||||
|
||||
///
|
||||
TpPlusPlus,
|
||||
|
||||
///
|
||||
Il,
|
||||
|
||||
///
|
||||
Ipv6,
|
||||
|
||||
///
|
||||
Sdrp,
|
||||
|
||||
///
|
||||
Ipv6Route,
|
||||
|
||||
///
|
||||
Ipv6Frag,
|
||||
|
||||
///
|
||||
Idrp,
|
||||
|
||||
///
|
||||
Rsvp,
|
||||
|
||||
///
|
||||
Gre,
|
||||
|
||||
///
|
||||
Dsr,
|
||||
|
||||
///
|
||||
Bna,
|
||||
|
||||
///
|
||||
Esp,
|
||||
|
||||
///
|
||||
Ah,
|
||||
|
||||
///
|
||||
INlsp,
|
||||
|
||||
///
|
||||
Swipe,
|
||||
|
||||
///
|
||||
Narp,
|
||||
|
||||
///
|
||||
Mobile,
|
||||
|
||||
///
|
||||
Tlsp,
|
||||
|
||||
///
|
||||
Skip,
|
||||
|
||||
///
|
||||
Ipv6Icmp,
|
||||
|
||||
///
|
||||
Ipv6NoNxt,
|
||||
|
||||
///
|
||||
Ipv6Opts,
|
||||
|
||||
///
|
||||
HostInternal,
|
||||
|
||||
///
|
||||
Cftp,
|
||||
|
||||
///
|
||||
LocalNetwork,
|
||||
|
||||
///
|
||||
SatExpak,
|
||||
|
||||
///
|
||||
Kryptolan,
|
||||
|
||||
///
|
||||
Rvd,
|
||||
|
||||
///
|
||||
Ippc,
|
||||
|
||||
///
|
||||
DistributedFs,
|
||||
|
||||
///
|
||||
SatMon,
|
||||
|
||||
///
|
||||
Visa,
|
||||
|
||||
///
|
||||
Ipcv,
|
||||
|
||||
///
|
||||
Cpnx,
|
||||
|
||||
///
|
||||
Cphb,
|
||||
|
||||
///
|
||||
Wsn,
|
||||
|
||||
///
|
||||
Pvp,
|
||||
|
||||
///
|
||||
BrSatMon,
|
||||
|
||||
///
|
||||
SunNd,
|
||||
|
||||
///
|
||||
WbMon,
|
||||
|
||||
///
|
||||
WbExpak,
|
||||
|
||||
///
|
||||
IsoIp,
|
||||
|
||||
///
|
||||
Vmtp,
|
||||
|
||||
///
|
||||
SecureVmtp,
|
||||
|
||||
///
|
||||
Vines,
|
||||
|
||||
///
|
||||
TtpOrIptm,
|
||||
|
||||
///
|
||||
NsfnetIgp,
|
||||
|
||||
///
|
||||
Dgp,
|
||||
|
||||
///
|
||||
Tcf,
|
||||
|
||||
///
|
||||
Eigrp,
|
||||
|
||||
///
|
||||
OspfigP,
|
||||
|
||||
///
|
||||
SpriteRpc,
|
||||
|
||||
///
|
||||
Larp,
|
||||
|
||||
///
|
||||
Mtp,
|
||||
|
||||
///
|
||||
Ax25,
|
||||
|
||||
///
|
||||
IpIp,
|
||||
|
||||
///
|
||||
Micp,
|
||||
|
||||
///
|
||||
SccSp,
|
||||
|
||||
///
|
||||
Etherip,
|
||||
|
||||
///
|
||||
Encap,
|
||||
|
||||
///
|
||||
PrivEncryption,
|
||||
|
||||
///
|
||||
Gmtp,
|
||||
|
||||
///
|
||||
Ifmp,
|
||||
|
||||
///
|
||||
Pnni,
|
||||
|
||||
///
|
||||
Pim,
|
||||
|
||||
///
|
||||
Aris,
|
||||
|
||||
///
|
||||
Scps,
|
||||
|
||||
///
|
||||
Qnx,
|
||||
|
||||
///
|
||||
AN,
|
||||
|
||||
///
|
||||
IpComp,
|
||||
|
||||
///
|
||||
Snp,
|
||||
|
||||
///
|
||||
CompaqPeer,
|
||||
|
||||
///
|
||||
IpxInIp,
|
||||
|
||||
///
|
||||
Vrrp,
|
||||
|
||||
///
|
||||
Pgm,
|
||||
|
||||
///
|
||||
ZeroHop,
|
||||
|
||||
///
|
||||
L2tp,
|
||||
|
||||
///
|
||||
Ddx,
|
||||
|
||||
///
|
||||
Iatp,
|
||||
|
||||
///
|
||||
Stp,
|
||||
|
||||
///
|
||||
Srp,
|
||||
|
||||
///
|
||||
Uti,
|
||||
|
||||
///
|
||||
Smp,
|
||||
|
||||
///
|
||||
Sm,
|
||||
|
||||
///
|
||||
Ptp,
|
||||
|
||||
///
|
||||
IsisOverIpv4,
|
||||
|
||||
///
|
||||
Fire,
|
||||
|
||||
///
|
||||
Crtp,
|
||||
|
||||
///
|
||||
Crudp,
|
||||
|
||||
///
|
||||
Sscopmce,
|
||||
|
||||
///
|
||||
Iplt,
|
||||
|
||||
///
|
||||
Sps,
|
||||
|
||||
///
|
||||
Pipe,
|
||||
|
||||
///
|
||||
Sctp,
|
||||
|
||||
///
|
||||
Fc,
|
||||
|
||||
///
|
||||
RsvpE2eIgnore,
|
||||
|
||||
///
|
||||
MobilityHeader,
|
||||
|
||||
///
|
||||
UdpLite,
|
||||
|
||||
///
|
||||
MplsInIp,
|
||||
|
||||
///
|
||||
Manet,
|
||||
|
||||
///
|
||||
Hip,
|
||||
|
||||
///
|
||||
Shim6,
|
||||
|
||||
///
|
||||
Wesp,
|
||||
Rohc,
|
||||
Test1,
|
||||
Test2,
|
||||
Unknown(u8),
|
||||
}
|
||||
|
||||
impl From<u8> for Protocol {
|
||||
fn from(value: u8) -> Protocol {
|
||||
use self::Protocol::*;
|
||||
|
||||
match value {
|
||||
0 => Hopopt,
|
||||
1 => Icmp,
|
||||
2 => Igmp,
|
||||
3 => Ggp,
|
||||
4 => Ipv4,
|
||||
5 => St,
|
||||
6 => Tcp,
|
||||
7 => Cbt,
|
||||
8 => Egp,
|
||||
9 => Igp,
|
||||
10 => BbnRccMon,
|
||||
11 => NvpII,
|
||||
12 => Pup,
|
||||
13 => Argus,
|
||||
14 => Emcon,
|
||||
15 => Xnet,
|
||||
16 => Chaos,
|
||||
17 => Udp,
|
||||
18 => Mux,
|
||||
19 => DcnMeas,
|
||||
20 => Hmp,
|
||||
21 => Prm,
|
||||
22 => XnsIdp,
|
||||
23 => Trunk1,
|
||||
24 => Trunk2,
|
||||
25 => Leaf1,
|
||||
26 => Leaf2,
|
||||
27 => Rdp,
|
||||
28 => Irtp,
|
||||
29 => IsoTp4,
|
||||
30 => Netblt,
|
||||
31 => MfeNsp,
|
||||
32 => MeritInp,
|
||||
33 => Dccp,
|
||||
34 => ThreePc,
|
||||
35 => Idpr,
|
||||
36 => Xtp,
|
||||
37 => Ddp,
|
||||
38 => IdprCmtp,
|
||||
39 => TpPlusPlus,
|
||||
40 => Il,
|
||||
41 => Ipv6,
|
||||
42 => Sdrp,
|
||||
43 => Ipv6Route,
|
||||
44 => Ipv6Frag,
|
||||
45 => Idrp,
|
||||
46 => Rsvp,
|
||||
47 => Gre,
|
||||
48 => Dsr,
|
||||
49 => Bna,
|
||||
50 => Esp,
|
||||
51 => Ah,
|
||||
52 => INlsp,
|
||||
53 => Swipe,
|
||||
54 => Narp,
|
||||
55 => Mobile,
|
||||
56 => Tlsp,
|
||||
57 => Skip,
|
||||
58 => Ipv6Icmp,
|
||||
59 => Ipv6NoNxt,
|
||||
60 => Ipv6Opts,
|
||||
61 => HostInternal,
|
||||
62 => Cftp,
|
||||
63 => LocalNetwork,
|
||||
64 => SatExpak,
|
||||
65 => Kryptolan,
|
||||
66 => Rvd,
|
||||
67 => Ippc,
|
||||
68 => DistributedFs,
|
||||
69 => SatMon,
|
||||
70 => Visa,
|
||||
71 => Ipcv,
|
||||
72 => Cpnx,
|
||||
73 => Cphb,
|
||||
74 => Wsn,
|
||||
75 => Pvp,
|
||||
76 => BrSatMon,
|
||||
77 => SunNd,
|
||||
78 => WbMon,
|
||||
79 => WbExpak,
|
||||
80 => IsoIp,
|
||||
81 => Vmtp,
|
||||
82 => SecureVmtp,
|
||||
83 => Vines,
|
||||
84 => TtpOrIptm,
|
||||
85 => NsfnetIgp,
|
||||
86 => Dgp,
|
||||
87 => Tcf,
|
||||
88 => Eigrp,
|
||||
89 => OspfigP,
|
||||
90 => SpriteRpc,
|
||||
91 => Larp,
|
||||
92 => Mtp,
|
||||
93 => Ax25,
|
||||
94 => IpIp,
|
||||
95 => Micp,
|
||||
96 => SccSp,
|
||||
97 => Etherip,
|
||||
98 => Encap,
|
||||
99 => PrivEncryption,
|
||||
100 => Gmtp,
|
||||
101 => Ifmp,
|
||||
102 => Pnni,
|
||||
103 => Pim,
|
||||
104 => Aris,
|
||||
105 => Scps,
|
||||
106 => Qnx,
|
||||
107 => AN,
|
||||
108 => IpComp,
|
||||
109 => Snp,
|
||||
110 => CompaqPeer,
|
||||
111 => IpxInIp,
|
||||
112 => Vrrp,
|
||||
113 => Pgm,
|
||||
114 => ZeroHop,
|
||||
115 => L2tp,
|
||||
116 => Ddx,
|
||||
117 => Iatp,
|
||||
118 => Stp,
|
||||
119 => Srp,
|
||||
120 => Uti,
|
||||
121 => Smp,
|
||||
122 => Sm,
|
||||
123 => Ptp,
|
||||
124 => IsisOverIpv4,
|
||||
125 => Fire,
|
||||
126 => Crtp,
|
||||
127 => Crudp,
|
||||
128 => Sscopmce,
|
||||
129 => Iplt,
|
||||
130 => Sps,
|
||||
131 => Pipe,
|
||||
132 => Sctp,
|
||||
133 => Fc,
|
||||
134 => RsvpE2eIgnore,
|
||||
135 => MobilityHeader,
|
||||
136 => UdpLite,
|
||||
137 => MplsInIp,
|
||||
138 => Manet,
|
||||
139 => Hip,
|
||||
140 => Shim6,
|
||||
141 => Wesp,
|
||||
142 => Rohc,
|
||||
253 => Test1,
|
||||
254 => Test2,
|
||||
p => Unknown(p),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<u8> for Protocol {
|
||||
fn into(self) -> u8 {
|
||||
use self::Protocol::*;
|
||||
|
||||
match self {
|
||||
Hopopt => 0,
|
||||
Icmp => 1,
|
||||
Igmp => 2,
|
||||
Ggp => 3,
|
||||
Ipv4 => 4,
|
||||
St => 5,
|
||||
Tcp => 6,
|
||||
Cbt => 7,
|
||||
Egp => 8,
|
||||
Igp => 9,
|
||||
BbnRccMon => 10,
|
||||
NvpII => 11,
|
||||
Pup => 12,
|
||||
Argus => 13,
|
||||
Emcon => 14,
|
||||
Xnet => 15,
|
||||
Chaos => 16,
|
||||
Udp => 17,
|
||||
Mux => 18,
|
||||
DcnMeas => 19,
|
||||
Hmp => 20,
|
||||
Prm => 21,
|
||||
XnsIdp => 22,
|
||||
Trunk1 => 23,
|
||||
Trunk2 => 24,
|
||||
Leaf1 => 25,
|
||||
Leaf2 => 26,
|
||||
Rdp => 27,
|
||||
Irtp => 28,
|
||||
IsoTp4 => 29,
|
||||
Netblt => 30,
|
||||
MfeNsp => 31,
|
||||
MeritInp => 32,
|
||||
Dccp => 33,
|
||||
ThreePc => 34,
|
||||
Idpr => 35,
|
||||
Xtp => 36,
|
||||
Ddp => 37,
|
||||
IdprCmtp => 38,
|
||||
TpPlusPlus => 39,
|
||||
Il => 40,
|
||||
Ipv6 => 41,
|
||||
Sdrp => 42,
|
||||
Ipv6Route => 43,
|
||||
Ipv6Frag => 44,
|
||||
Idrp => 45,
|
||||
Rsvp => 46,
|
||||
Gre => 47,
|
||||
Dsr => 48,
|
||||
Bna => 49,
|
||||
Esp => 50,
|
||||
Ah => 51,
|
||||
INlsp => 52,
|
||||
Swipe => 53,
|
||||
Narp => 54,
|
||||
Mobile => 55,
|
||||
Tlsp => 56,
|
||||
Skip => 57,
|
||||
Ipv6Icmp => 58,
|
||||
Ipv6NoNxt => 59,
|
||||
Ipv6Opts => 60,
|
||||
HostInternal => 61,
|
||||
Cftp => 62,
|
||||
LocalNetwork => 63,
|
||||
SatExpak => 64,
|
||||
Kryptolan => 65,
|
||||
Rvd => 66,
|
||||
Ippc => 67,
|
||||
DistributedFs => 68,
|
||||
SatMon => 69,
|
||||
Visa => 70,
|
||||
Ipcv => 71,
|
||||
Cpnx => 72,
|
||||
Cphb => 73,
|
||||
Wsn => 74,
|
||||
Pvp => 75,
|
||||
BrSatMon => 76,
|
||||
SunNd => 77,
|
||||
WbMon => 78,
|
||||
WbExpak => 79,
|
||||
IsoIp => 80,
|
||||
Vmtp => 81,
|
||||
SecureVmtp => 82,
|
||||
Vines => 83,
|
||||
TtpOrIptm => 84,
|
||||
NsfnetIgp => 85,
|
||||
Dgp => 86,
|
||||
Tcf => 87,
|
||||
Eigrp => 88,
|
||||
OspfigP => 89,
|
||||
SpriteRpc => 90,
|
||||
Larp => 91,
|
||||
Mtp => 92,
|
||||
Ax25 => 93,
|
||||
IpIp => 94,
|
||||
Micp => 95,
|
||||
SccSp => 96,
|
||||
Etherip => 97,
|
||||
Encap => 98,
|
||||
PrivEncryption => 99,
|
||||
Gmtp => 100,
|
||||
Ifmp => 101,
|
||||
Pnni => 102,
|
||||
Pim => 103,
|
||||
Aris => 104,
|
||||
Scps => 105,
|
||||
Qnx => 106,
|
||||
AN => 107,
|
||||
IpComp => 108,
|
||||
Snp => 109,
|
||||
CompaqPeer => 110,
|
||||
IpxInIp => 111,
|
||||
Vrrp => 112,
|
||||
Pgm => 113,
|
||||
ZeroHop => 114,
|
||||
L2tp => 115,
|
||||
Ddx => 116,
|
||||
Iatp => 117,
|
||||
Stp => 118,
|
||||
Srp => 119,
|
||||
Uti => 120,
|
||||
Smp => 121,
|
||||
Sm => 122,
|
||||
Ptp => 123,
|
||||
IsisOverIpv4 => 124,
|
||||
Fire => 125,
|
||||
Crtp => 126,
|
||||
Crudp => 127,
|
||||
Sscopmce => 128,
|
||||
Iplt => 129,
|
||||
Sps => 130,
|
||||
Pipe => 131,
|
||||
Sctp => 132,
|
||||
Fc => 133,
|
||||
RsvpE2eIgnore => 134,
|
||||
MobilityHeader => 135,
|
||||
UdpLite => 136,
|
||||
MplsInIp => 137,
|
||||
Manet => 138,
|
||||
Hip => 139,
|
||||
Shim6 => 140,
|
||||
Wesp => 141,
|
||||
Rohc => 142,
|
||||
Test1 => 253,
|
||||
Test2 => 254,
|
||||
Unknown(p) => p,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
use ipv4::packet::IpV4Packet;
|
||||
|
||||
use crate::error::*;
|
||||
|
||||
pub mod ipv4;
|
||||
|
||||
pub enum IpPacket<B> {
|
||||
V4(IpV4Packet<B>),
|
||||
}
|
||||
|
||||
impl<B: AsRef<[u8]>> IpPacket<B> {
|
||||
pub fn new(buffer: B) -> Result<Self> {
|
||||
match buffer.as_ref()[0] >> 4 {
|
||||
4 => Ok(IpPacket::V4(IpV4Packet::new(buffer)?)),
|
||||
_ => Err(Error::InvalidPacket),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user