@@ -51,14 +51,14 @@ netlink_link_setlladdr(vrrp_rt *vrrp)
5151 req .n .nlmsg_flags = NLM_F_REQUEST ;
5252 req .n .nlmsg_type = RTM_NEWLINK ;
5353 req .ifi .ifi_family = AF_INET ;
54- req .ifi .ifi_index = IF_INDEX (vrrp -> ifp );
54+ req .ifi .ifi_index = IF_INDEX (vrrp -> xmit_ifp );
5555
5656 addattr_l (& req .n , sizeof (req ), IFLA_ADDRESS , ll_addr , ETH_ALEN );
5757
5858 if (netlink_talk (& nl_cmd , & req .n ) < 0 )
5959 status = -1 ;
6060 else
61- memcpy (vrrp -> ifp -> hw_addr , ll_addr , ETH_ALEN );
61+ memcpy (vrrp -> xmit_ifp -> hw_addr , ll_addr , ETH_ALEN );
6262
6363 return status ;
6464}
@@ -80,7 +80,7 @@ netlink_link_setmode(vrrp_rt *vrrp)
8080 req .n .nlmsg_flags = NLM_F_REQUEST ;
8181 req .n .nlmsg_type = RTM_NEWLINK ;
8282 req .ifi .ifi_family = AF_INET ;
83- req .ifi .ifi_index = IF_INDEX (vrrp -> ifp );
83+ req .ifi .ifi_index = IF_INDEX (vrrp -> xmit_ifp );
8484
8585 linkinfo = NLMSG_TAIL (& req .n );
8686 addattr_l (& req .n , sizeof (req ), IFLA_LINKINFO , NULL , 0 );
@@ -94,8 +94,11 @@ netlink_link_setmode(vrrp_rt *vrrp)
9494 * In private mode, macvlan will receive frames with same MAC addr
9595 * as configured on the interface.
9696 */
97+ #ifndef MACVLAN_MODE_VRRP
98+ #define MACVLAN_MODE_VRRP 16
99+ #endif
97100 addattr32 (& req .n , sizeof (req ), IFLA_MACVLAN_MODE ,
98- MACVLAN_MODE_PRIVATE );
101+ MACVLAN_MODE_VRRP );
99102 data -> rta_len = (void * )NLMSG_TAIL (& req .n ) - (void * )data ;
100103
101104 linkinfo -> rta_len = (void * )NLMSG_TAIL (& req .n ) - (void * )linkinfo ;
@@ -106,7 +109,7 @@ netlink_link_setmode(vrrp_rt *vrrp)
106109 return status ;
107110}
108111
109- static int
112+ int
110113netlink_link_up (vrrp_rt * vrrp )
111114{
112115 int status = 1 ;
@@ -122,7 +125,7 @@ netlink_link_up(vrrp_rt *vrrp)
122125 req .n .nlmsg_flags = NLM_F_REQUEST ;
123126 req .n .nlmsg_type = RTM_NEWLINK ;
124127 req .ifi .ifi_family = AF_UNSPEC ;
125- req .ifi .ifi_index = IF_INDEX (vrrp -> ifp );
128+ req .ifi .ifi_index = IF_INDEX (vrrp -> xmit_ifp );
126129 req .ifi .ifi_change |= IFF_UP ;
127130 req .ifi .ifi_flags |= IFF_UP ;
128131
@@ -132,6 +135,32 @@ netlink_link_up(vrrp_rt *vrrp)
132135 return status ;
133136}
134137
138+ int
139+ netlink_link_down (vrrp_rt * vrrp )
140+ {
141+ int status = 1 ;
142+ struct {
143+ struct nlmsghdr n ;
144+ struct ifinfomsg ifi ;
145+ char buf [256 ];
146+ } req ;
147+
148+ memset (& req , 0 , sizeof (req ));
149+
150+ req .n .nlmsg_len = NLMSG_LENGTH (sizeof (struct ifinfomsg ));
151+ req .n .nlmsg_flags = NLM_F_REQUEST ;
152+ req .n .nlmsg_type = RTM_NEWLINK ;
153+ req .ifi .ifi_family = AF_UNSPEC ;
154+ req .ifi .ifi_index = IF_INDEX (vrrp -> xmit_ifp );
155+ req .ifi .ifi_change |= IFF_UP ;
156+ req .ifi .ifi_flags &= ~IFF_UP ;
157+
158+ if (netlink_talk (& nl_cmd , & req .n ) < 0 )
159+ status = -1 ;
160+
161+ return status ;
162+ }
163+
135164int
136165netlink_link_add_vmac (vrrp_rt * vrrp )
137166{
@@ -156,9 +185,9 @@ netlink_link_add_vmac(vrrp_rt *vrrp)
156185 * by a previous instance.
157186 */
158187 if (reload && (ifp = if_get_by_ifname (ifname ))) {
159- vrrp -> ifp = ifp ;
188+ vrrp -> xmit_ifp = ifp ;
160189 /* Save ifindex for use on delete */
161- vrrp -> vmac_ifindex = IF_INDEX (vrrp -> ifp );
190+ vrrp -> vmac_ifindex = IF_INDEX (vrrp -> xmit_ifp );
162191 vrrp -> vmac |= 2 ;
163192 return 1 ;
164193 }
@@ -187,8 +216,8 @@ netlink_link_add_vmac(vrrp_rt *vrrp)
187216 ifp = if_get_by_ifname (ifname );
188217 if (!ifp )
189218 return -1 ;
190- vrrp -> ifp = ifp ;
191- vrrp -> vmac_ifindex = IF_INDEX (vrrp -> ifp ); /* For use on delete */
219+ vrrp -> xmit_ifp = ifp ;
220+ vrrp -> vmac_ifindex = IF_INDEX (vrrp -> xmit_ifp ); /* For use on delete */
192221 vrrp -> vmac |= 2 ;
193222 netlink_link_setlladdr (vrrp );
194223 vyatta_if_setup (ifname );
0 commit comments