@@ -27,7 +27,7 @@ enum Response<'a> {
27
27
Nop ,
28
28
Arp ( ArpRepr ) ,
29
29
Icmpv4 ( Ipv4Repr , Icmpv4Repr < ' a > ) ,
30
- Tcpv4 ( Ipv4Repr , TcpRepr < ' a > )
30
+ Tcp ( IpRepr , TcpRepr < ' a > )
31
31
}
32
32
33
33
impl < ' a , ' b , ' c , DeviceT : Device + ' a > Interface < ' a , ' b , ' c , DeviceT > {
@@ -220,10 +220,10 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
220
220
match ipv4_repr. protocol {
221
221
IpProtocol :: Icmp =>
222
222
Self :: process_icmpv4 ( ipv4_repr, ipv4_packet. payload ( ) ) ,
223
- IpProtocol :: Tcp =>
224
- Self :: process_tcpv4 ( sockets, timestamp, ipv4_repr, ipv4_packet. payload ( ) ) ,
225
223
IpProtocol :: Udp =>
226
224
Self :: process_udpv4 ( sockets, timestamp, ipv4_repr, ipv4_packet. payload ( ) ) ,
225
+ IpProtocol :: Tcp =>
226
+ Self :: process_tcp ( sockets, timestamp, ipv4_repr. into ( ) , ipv4_packet. payload ( ) ) ,
227
227
_ if handled_by_raw_socket =>
228
228
Ok ( Response :: Nop ) ,
229
229
_ => {
@@ -307,11 +307,9 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
307
307
Ok ( Response :: Icmpv4 ( ipv4_reply_repr, icmp_reply_repr) )
308
308
}
309
309
310
- fn process_tcpv4 < ' frame > ( sockets : & mut SocketSet , timestamp : u64 ,
311
- ipv4_repr : Ipv4Repr , ip_payload : & ' frame [ u8 ] ) ->
312
- Result < Response < ' frame > > {
313
- let ip_repr = IpRepr :: Ipv4 ( ipv4_repr) ;
314
-
310
+ fn process_tcp < ' frame > ( sockets : & mut SocketSet , timestamp : u64 ,
311
+ ip_repr : IpRepr , ip_payload : & ' frame [ u8 ] ) ->
312
+ Result < Response < ' frame > > {
315
313
for tcp_socket in sockets. iter_mut ( ) . filter_map (
316
314
<Socket as AsSocket < TcpSocket > >:: try_as_socket) {
317
315
match tcp_socket. process ( timestamp, & ip_repr, ip_payload) {
@@ -327,99 +325,81 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
327
325
328
326
// The packet wasn't handled by a socket, send a TCP RST packet.
329
327
let tcp_packet = TcpPacket :: new_checked ( ip_payload) ?;
330
- if tcp_packet. rst ( ) {
331
- // Don't reply to a TCP RST packet with another TCP RST packet.
332
- return Ok ( Response :: Nop )
328
+ let tcp_repr = TcpRepr :: parse ( & tcp_packet, & ip_repr. src_addr ( ) , & ip_repr. dst_addr ( ) ) ?;
329
+ if tcp_repr. control == TcpControl :: Rst {
330
+ // Never reply to a TCP RST packet with another TCP RST packet.
331
+ Ok ( Response :: Nop )
332
+ } else {
333
+ let ( ip_reply_repr, tcp_reply_repr) = TcpSocket :: rst_reply ( & ip_repr, & tcp_repr) ;
334
+ Ok ( Response :: Tcp ( ip_reply_repr, tcp_reply_repr) )
333
335
}
334
- let tcp_reply_repr = TcpRepr {
335
- src_port : tcp_packet. dst_port ( ) ,
336
- dst_port : tcp_packet. src_port ( ) ,
337
- control : TcpControl :: Rst ,
338
- push : false ,
339
- seq_number : tcp_packet. ack_number ( ) ,
340
- ack_number : Some ( tcp_packet. seq_number ( ) +
341
- tcp_packet. segment_len ( ) ) ,
342
- window_len : 0 ,
343
- max_seg_size : None ,
344
- payload : & [ ]
345
- } ;
346
- let ipv4_reply_repr = Ipv4Repr {
347
- src_addr : ipv4_repr. dst_addr ,
348
- dst_addr : ipv4_repr. src_addr ,
349
- protocol : IpProtocol :: Tcp ,
350
- payload_len : tcp_reply_repr. buffer_len ( )
351
- } ;
352
- Ok ( Response :: Tcpv4 ( ipv4_reply_repr, tcp_reply_repr) )
353
336
}
354
337
355
338
fn send_response ( & mut self , timestamp : u64 , response : Response ) -> Result < ( ) > {
356
- macro_rules! ip_response {
357
- ( $tx_buffer: ident, $frame: ident, $ip_repr: ident) => ( {
358
- let dst_hardware_addr =
359
- match self . arp_cache. lookup( & $ip_repr. dst_addr. into( ) ) {
360
- None => return Err ( Error :: Unaddressable ) ,
361
- Some ( hardware_addr) => hardware_addr
362
- } ;
363
-
364
- let tx_len = EthernetFrame :: <& [ u8 ] >:: buffer_len( $ip_repr. buffer_len( ) +
365
- $ip_repr. payload_len) ;
366
- $tx_buffer = self . device. transmit( timestamp, tx_len) ?;
367
- debug_assert!( $tx_buffer. as_ref( ) . len( ) == tx_len) ;
339
+ macro_rules! emit_packet {
340
+ ( Ethernet , $buffer_len: expr, |$frame: ident| $code: stmt) => ( {
341
+ let tx_len = EthernetFrame :: <& [ u8 ] >:: buffer_len( $buffer_len) ;
342
+ let mut tx_buffer = self . device. transmit( timestamp, tx_len) ?;
343
+ debug_assert!( tx_buffer. as_ref( ) . len( ) == tx_len) ;
368
344
369
- $frame = EthernetFrame :: new( & mut $ tx_buffer) ;
345
+ let mut $frame = EthernetFrame :: new( & mut tx_buffer) ;
370
346
$frame. set_src_addr( self . hardware_addr) ;
371
- $frame. set_dst_addr( dst_hardware_addr) ;
372
- $frame. set_ethertype( EthernetProtocol :: Ipv4 ) ;
373
347
374
- let mut ip_packet = Ipv4Packet :: new( $frame. payload_mut( ) ) ;
375
- $ip_repr. emit( & mut ip_packet) ;
376
- ip_packet
348
+ $code
349
+
350
+ Ok ( ( ) )
351
+ } ) ;
352
+
353
+ ( Ip , $ip_repr: expr, |$payload: ident| $code: stmt) => ( {
354
+ let ip_repr = $ip_repr. lower( & self . protocol_addrs) ?;
355
+ match self . arp_cache. lookup( & ip_repr. dst_addr( ) ) {
356
+ None => Err ( Error :: Unaddressable ) ,
357
+ Some ( dst_hardware_addr) => {
358
+ emit_packet!( Ethernet , ip_repr. total_len( ) , |frame| {
359
+ frame. set_dst_addr( dst_hardware_addr) ;
360
+ match ip_repr {
361
+ IpRepr :: Ipv4 ( _) => frame. set_ethertype( EthernetProtocol :: Ipv4 ) ,
362
+ _ => unreachable!( )
363
+ }
364
+
365
+ ip_repr. emit( frame. payload_mut( ) ) ;
366
+
367
+ let $payload = & mut frame. payload_mut( ) [ ip_repr. buffer_len( ) ..] ;
368
+ $code
369
+ } )
370
+ }
371
+ }
377
372
} )
378
373
}
379
374
380
375
match response {
381
- Response :: Arp ( repr) => {
382
- let tx_len = EthernetFrame :: < & [ u8 ] > :: buffer_len ( repr. buffer_len ( ) ) ;
383
- let mut tx_buffer = self . device . transmit ( timestamp, tx_len) ?;
384
- debug_assert ! ( tx_buffer. as_ref( ) . len( ) == tx_len) ;
385
-
386
- let mut frame = EthernetFrame :: new ( & mut tx_buffer) ;
387
- frame. set_src_addr ( self . hardware_addr ) ;
388
- frame. set_dst_addr ( match repr {
389
- ArpRepr :: EthernetIpv4 { target_hardware_addr, .. } => target_hardware_addr,
390
- _ => unreachable ! ( )
391
- } ) ;
392
- frame. set_ethertype ( EthernetProtocol :: Arp ) ;
376
+ Response :: Arp ( arp_repr) => {
377
+ let dst_hardware_addr =
378
+ match arp_repr {
379
+ ArpRepr :: EthernetIpv4 { target_hardware_addr, .. } => target_hardware_addr,
380
+ _ => unreachable ! ( )
381
+ } ;
393
382
394
- let mut packet = ArpPacket :: new ( frame. payload_mut ( ) ) ;
395
- repr. emit ( & mut packet) ;
383
+ emit_packet ! ( Ethernet , arp_repr. buffer_len( ) , |frame| {
384
+ frame. set_dst_addr( dst_hardware_addr) ;
385
+ frame. set_ethertype( EthernetProtocol :: Arp ) ;
396
386
397
- Ok ( ( ) )
387
+ let mut packet = ArpPacket :: new( frame. payload_mut( ) ) ;
388
+ arp_repr. emit( & mut packet) ;
389
+ } )
398
390
} ,
399
-
400
- Response :: Icmpv4 ( ip_repr, icmp_repr) => {
401
- let mut tx_buffer;
402
- let mut frame;
403
- let mut ip_packet = ip_response ! ( tx_buffer, frame, ip_repr) ;
404
- let mut icmp_packet = Icmpv4Packet :: new ( ip_packet. payload_mut ( ) ) ;
405
- icmp_repr. emit ( & mut icmp_packet) ;
406
- Ok ( ( ) )
391
+ Response :: Icmpv4 ( ipv4_repr, icmpv4_repr) => {
392
+ emit_packet ! ( Ip , IpRepr :: Ipv4 ( ipv4_repr) , |payload| {
393
+ icmpv4_repr. emit( & mut Icmpv4Packet :: new( payload) ) ;
394
+ } )
407
395
}
408
-
409
- Response :: Tcpv4 ( ip_repr, tcp_repr) => {
410
- let mut tx_buffer;
411
- let mut frame;
412
- let mut ip_packet = ip_response ! ( tx_buffer, frame, ip_repr) ;
413
- let mut tcp_packet = TcpPacket :: new ( ip_packet. payload_mut ( ) ) ;
414
- tcp_repr. emit ( & mut tcp_packet,
415
- & IpAddress :: Ipv4 ( ip_repr. src_addr ) ,
416
- & IpAddress :: Ipv4 ( ip_repr. dst_addr ) ) ;
417
- Ok ( ( ) )
418
- }
419
-
420
- Response :: Nop => {
421
- Ok ( ( ) )
396
+ Response :: Tcp ( ip_repr, tcp_repr) => {
397
+ emit_packet ! ( Ip , ip_repr, |payload| {
398
+ tcp_repr. emit( & mut TcpPacket :: new( payload) ,
399
+ & ip_repr. src_addr( ) , & ip_repr. dst_addr( ) ) ;
400
+ } )
422
401
}
402
+ Response :: Nop => Ok ( ( ) )
423
403
}
424
404
}
425
405
0 commit comments