@@ -9,7 +9,8 @@ use netlink_packet_core::{
9
9
} ;
10
10
11
11
use netlink_packet_route:: {
12
- nlas:: address:: Nla , AddressMessage , RtnlMessage , AF_INET , AF_INET6 ,
12
+ address:: { AddressAttribute , AddressMessage } ,
13
+ AddressFamily , RouteNetlinkMessage ,
13
14
} ;
14
15
15
16
use crate :: { try_nl, Error , Handle } ;
@@ -34,46 +35,35 @@ impl AddressAddRequest {
34
35
message. header . prefix_len = prefix_len;
35
36
message. header . index = index;
36
37
37
- let address_vec = match address {
38
- IpAddr :: V4 ( ipv4) => {
39
- message. header . family = AF_INET as u8 ;
40
- ipv4. octets ( ) . to_vec ( )
41
- }
42
- IpAddr :: V6 ( ipv6) => {
43
- message. header . family = AF_INET6 as u8 ;
44
- ipv6. octets ( ) . to_vec ( )
45
- }
38
+ message. header . family = match address {
39
+ IpAddr :: V4 ( _) => AddressFamily :: Inet ,
40
+ IpAddr :: V6 ( _) => AddressFamily :: Inet6 ,
46
41
} ;
47
42
48
43
if address. is_multicast ( ) {
49
- message. nlas . push ( Nla :: Multicast ( address_vec) ) ;
50
- } else if address. is_unspecified ( ) {
51
- message. nlas . push ( Nla :: Unspec ( address_vec) ) ;
52
- } else if address. is_ipv6 ( ) {
53
- message. nlas . push ( Nla :: Address ( address_vec) ) ;
44
+ if let IpAddr :: V6 ( a) = address {
45
+ message. attributes . push ( AddressAttribute :: Multicast ( a) ) ;
46
+ }
54
47
} else {
55
- message. nlas . push ( Nla :: Address ( address_vec . clone ( ) ) ) ;
48
+ message. attributes . push ( AddressAttribute :: Address ( address ) ) ;
56
49
57
50
// for IPv4 the IFA_LOCAL address can be set to the same value as
58
51
// IFA_ADDRESS
59
- message. nlas . push ( Nla :: Local ( address_vec . clone ( ) ) ) ;
52
+ message. attributes . push ( AddressAttribute :: Local ( address ) ) ;
60
53
61
54
// set the IFA_BROADCAST address as well (IPv6 does not support
62
55
// broadcast)
63
- if prefix_len == 32 {
64
- message. nlas . push ( Nla :: Broadcast ( address_vec) ) ;
65
- } else {
66
- let ip_addr: u32 = u32:: from ( Ipv4Addr :: new (
67
- address_vec[ 0 ] ,
68
- address_vec[ 1 ] ,
69
- address_vec[ 2 ] ,
70
- address_vec[ 3 ] ,
71
- ) ) ;
72
- let brd = Ipv4Addr :: from (
73
- ( 0xffff_ffff_u32 ) >> u32:: from ( prefix_len) | ip_addr,
74
- ) ;
75
- message. nlas . push ( Nla :: Broadcast ( brd. octets ( ) . to_vec ( ) ) ) ;
76
- } ;
56
+ if let IpAddr :: V4 ( a) = address {
57
+ if prefix_len == 32 {
58
+ message. attributes . push ( AddressAttribute :: Broadcast ( a) ) ;
59
+ } else {
60
+ let ip_addr = u32:: from ( a) ;
61
+ let brd = Ipv4Addr :: from (
62
+ ( 0xffff_ffff_u32 ) >> u32:: from ( prefix_len) | ip_addr,
63
+ ) ;
64
+ message. attributes . push ( AddressAttribute :: Broadcast ( brd) ) ;
65
+ } ;
66
+ }
77
67
}
78
68
AddressAddRequest {
79
69
handle,
@@ -97,7 +87,8 @@ impl AddressAddRequest {
97
87
message,
98
88
replace,
99
89
} = self ;
100
- let mut req = NetlinkMessage :: from ( RtnlMessage :: NewAddress ( message) ) ;
90
+ let mut req =
91
+ NetlinkMessage :: from ( RouteNetlinkMessage :: NewAddress ( message) ) ;
101
92
let replace = if replace { NLM_F_REPLACE } else { NLM_F_EXCL } ;
102
93
req. header . flags = NLM_F_REQUEST | NLM_F_ACK | replace | NLM_F_CREATE ;
103
94
0 commit comments