feat: started to make a TCP state machine
This commit is contained in:
@@ -577,7 +577,13 @@ impl TCPPacketBuilder {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn build<I1, I2>(self, srcip: I1, dstip: I2, data: Vec<u8>) -> TCPPacket
|
||||
pub fn build<I1, I2>(
|
||||
self,
|
||||
srcip: I1,
|
||||
dstip: I2,
|
||||
data: Vec<u8>,
|
||||
checksum_offset: Option<u16>,
|
||||
) -> TCPPacket
|
||||
where
|
||||
I1: Into<Ipv4Addr>,
|
||||
I2: Into<Ipv4Addr>,
|
||||
@@ -626,10 +632,7 @@ impl TCPPacketBuilder {
|
||||
}
|
||||
})
|
||||
.fold(0u32, |acc, e| acc + e)
|
||||
+ 30;
|
||||
// + 30 to intentionally deviate from
|
||||
// the RFC, to make it so that I can identify the packets as sparse
|
||||
// packets
|
||||
+ (checksum_offset.unwrap_or(0) as u32);
|
||||
|
||||
let checksum = (checksum >> 16) + (checksum & 0xffff);
|
||||
let checksum = ((checksum >> 16) as u16) + (checksum as u16);
|
||||
@@ -645,3 +648,33 @@ impl TCPPacketBuilder {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::net::Ipv4Addr;
|
||||
|
||||
use crate::TCPPacketBuilder;
|
||||
|
||||
#[test]
|
||||
fn test_checksum() {
|
||||
let tcp_packet = TCPPacketBuilder::default()
|
||||
.srcport(57116)
|
||||
.dstport(54248)
|
||||
.seqnumber(0xaed77262)
|
||||
.acknumber(0)
|
||||
.syn(true)
|
||||
.window(64240)
|
||||
.options(vec![
|
||||
0x02, 0x04, 0x05, 0xb4, 0x04, 0x02, 0x08, 0x0a, 0xd4, 0x06, 0xdf, 0x18, 0x00, 0x00,
|
||||
0x00, 0x00, 0x01, 0x03, 0x03, 0x07,
|
||||
])
|
||||
.build(
|
||||
Ipv4Addr::new(10, 104, 18, 67),
|
||||
Ipv4Addr::new(10, 104, 21, 16),
|
||||
vec![],
|
||||
None,
|
||||
);
|
||||
|
||||
assert_eq!(tcp_packet.pkt().checksum(), 0x898d);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user