@@ -9,7 +9,8 @@ use netlink_packet_core::{
99} ;
1010
1111use netlink_packet_route:: {
12- nlas:: address:: Nla , AddressMessage , RtnlMessage , AF_INET , AF_INET6 ,
12+ address:: { AddressAttribute , AddressMessage } ,
13+ AddressFamily , RouteNetlinkMessage ,
1314} ;
1415
1516use crate :: { try_nl, Error , Handle } ;
@@ -34,46 +35,35 @@ impl AddressAddRequest {
3435 message. header . prefix_len = prefix_len;
3536 message. header . index = index;
3637
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 ,
4641 } ;
4742
4843 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+ }
5447 } else {
55- message. nlas . push ( Nla :: Address ( address_vec . clone ( ) ) ) ;
48+ message. attributes . push ( AddressAttribute :: Address ( address ) ) ;
5649
5750 // for IPv4 the IFA_LOCAL address can be set to the same value as
5851 // IFA_ADDRESS
59- message. nlas . push ( Nla :: Local ( address_vec . clone ( ) ) ) ;
52+ message. attributes . push ( AddressAttribute :: Local ( address ) ) ;
6053
6154 // set the IFA_BROADCAST address as well (IPv6 does not support
6255 // 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+ }
7767 }
7868 AddressAddRequest {
7969 handle,
@@ -97,7 +87,8 @@ impl AddressAddRequest {
9787 message,
9888 replace,
9989 } = self ;
100- let mut req = NetlinkMessage :: from ( RtnlMessage :: NewAddress ( message) ) ;
90+ let mut req =
91+ NetlinkMessage :: from ( RouteNetlinkMessage :: NewAddress ( message) ) ;
10192 let replace = if replace { NLM_F_REPLACE } else { NLM_F_EXCL } ;
10293 req. header . flags = NLM_F_REQUEST | NLM_F_ACK | replace | NLM_F_CREATE ;
10394
0 commit comments