@@ -33,7 +33,7 @@ use ::std::ops::{Deref, DerefMut};
33
33
34
34
pub struct Layer2Endpoint {
35
35
layer1_endpoint : Box < dyn PhysicalLayer > ,
36
- local_link_addr : MacAddress ,
36
+ local_mac : MacAddress ,
37
37
}
38
38
39
39
#[ derive( Clone ) ]
@@ -47,63 +47,66 @@ impl SharedLayer2Endpoint {
47
47
pub fn new < P : PhysicalLayer > ( config : & Config , layer1_endpoint : P ) ->Result < Self , Fail > {
48
48
Ok ( Self ( SharedObject :: new ( Layer2Endpoint {
49
49
layer1_endpoint : Box :: new ( layer1_endpoint) ,
50
- local_link_addr : config. local_link_addr ( ) ?,
50
+ local_mac : config. local_link_addr ( ) ?,
51
51
} ) ) )
52
52
}
53
53
54
54
pub fn receive ( & mut self ) ->Result < ArrayVec < ( EtherType2 , DemiBuffer ) , MAX_BATCH_SIZE_NUM_PACKETS > , Fail > {
55
- let mut batch: ArrayVec < ( EtherType2 , DemiBuffer ) , MAX_BATCH_SIZE_NUM_PACKETS > =ArrayVec :: new ( ) ;
56
- for mut pkt in self . layer1_endpoint . receive ( ) ?{
57
- let header: Ethernet2Header =match Ethernet2Header :: parse_and_strip ( & mut pkt ) {
55
+ let mut batch =ArrayVec :: new ( ) ;
56
+ for mut packet in self . layer1_endpoint . receive ( ) ?{
57
+ let header =match Ethernet2Header :: parse_and_strip ( & mut packet ) {
58
58
Ok ( result) => result,
59
59
Err ( e) =>{
60
60
// TODO: Collect dropped packet statistics.
61
- let cause: & str ="Invalid Ethernet header" ;
62
- warn ! ( "{}: {:?}" , cause, e) ;
61
+ warn ! ( "Invalid Ethernet header: {:?}" , e) ;
63
62
continue ;
64
63
} ,
65
64
} ;
66
65
debug ! ( "L2 INCOMING {:?}" , header) ;
67
- if self . local_link_addr != header. dst_addr ( )
68
- && !header. dst_addr ( ) . is_broadcast ( )
69
- && !header. dst_addr ( ) . is_multicast ( )
70
- {
71
- let cause: & str ="invalid link address" ;
72
- warn ! ( "dropping packet: {}" , cause) ;
66
+ if self . bad_dst ( & header) {
67
+ warn ! ( "dropping packet: invalid link address" ) ;
73
68
}
74
- batch. push ( ( header. ether_type ( ) , pkt ) )
69
+ batch. push ( ( header. ether_type ( ) , packet ) )
75
70
}
76
71
Ok ( batch)
77
72
}
78
73
79
- pub fn transmit_arp_packet ( & mut self , remote_link_addr : MacAddress , pkt : DemiBuffer ) ->Result < ( ) , Fail > {
80
- let mut pkts : ArrayVec < DemiBuffer , MAX_BATCH_SIZE_NUM_PACKETS > =ArrayVec :: new ( ) ;
81
- pkts . push ( pkt ) ;
82
- self . transmit ( remote_link_addr , EtherType2 :: Arp , pkts )
74
+ pub fn transmit_arp_packet ( & mut self , remote_mac : MacAddress , packet : DemiBuffer ) ->Result < ( ) , Fail > {
75
+ let mut packets =ArrayVec :: new ( ) ;
76
+ packets . push ( packet ) ;
77
+ self . transmit ( remote_mac , EtherType2 :: Arp , packets )
83
78
}
84
79
85
- pub fn transmit_ipv4_packet ( & mut self , remote_link_addr : MacAddress , pkt : DemiBuffer ) ->Result < ( ) , Fail > {
86
- let mut pkts: ArrayVec < DemiBuffer , MAX_BATCH_SIZE_NUM_PACKETS > =ArrayVec :: new ( ) ;
87
- pkts. push ( pkt) ;
88
- self . transmit ( remote_link_addr, EtherType2 :: Ipv4 , pkts)
80
+ pub fn transmit_ipv4_packet ( & mut self , remote_mac : MacAddress , packet : DemiBuffer ) ->Result < ( ) , Fail > {
81
+ let mut packets =ArrayVec :: new ( ) ;
82
+ packets. push ( packet) ;
83
+ self . transmit ( remote_mac, EtherType2 :: Ipv4 , packets)
84
+ }
85
+
86
+ fn bad_dst ( & self , header : & Ethernet2Header ) ->bool {
87
+ let dst_mac = header. dst_addr ( ) ;
88
+ self . local_mac != dst_mac && !dst_mac. is_broadcast ( ) && !dst_mac. is_multicast ( )
89
89
}
90
90
91
91
fn transmit (
92
92
& mut self ,
93
- remote_link_addr : MacAddress ,
94
- eth2_type : EtherType2 ,
95
- mut pkts : ArrayVec < DemiBuffer , MAX_BATCH_SIZE_NUM_PACKETS > ,
93
+ remote_mac : MacAddress ,
94
+ ether_type : EtherType2 ,
95
+ mut packets : ArrayVec < DemiBuffer , MAX_BATCH_SIZE_NUM_PACKETS > ,
96
96
) ->Result < ( ) , Fail > {
97
- let eth2_header: Ethernet2Header =Ethernet2Header :: new ( remote_link_addr, self . local_link_addr , eth2_type) ;
98
- debug ! ( "L2 OUTGOING {:?}" , eth2_header) ;
99
- for pktin pkts. iter_mut ( ) {
100
- eth2_header. serialize_and_attach ( pkt) ;
97
+ let header =Ethernet2Header :: new ( remote_mac, self . local_mac , ether_type) ;
98
+
99
+ debug ! ( "L2 OUTGOING {:?}" , header) ;
100
+
101
+ for packetin packets. iter_mut ( ) {
102
+ header. serialize_and_attach ( packet) ;
101
103
}
102
- self . layer1_endpoint . transmit ( pkts)
104
+
105
+ self . layer1_endpoint . transmit ( packets)
103
106
}
104
107
105
108
pub fn get_local_link_addr ( & self ) ->MacAddress {
106
- self . local_link_addr
109
+ self . local_mac
107
110
}
108
111
}
109
112