@@ -988,6 +988,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
988
988
+ rtnl_xdp_size () /* IFLA_XDP */
989
989
+ nla_total_size (4 ) /* IFLA_EVENT */
990
990
+ nla_total_size (4 ) /* IFLA_NEW_NETNSID */
991
+ + nla_total_size (4 ) /* IFLA_NEW_IFINDEX */
991
992
+ nla_total_size (1 ) /* IFLA_PROTO_DOWN */
992
993
+ nla_total_size (4 ) /* IFLA_IF_NETNSID */
993
994
+ nla_total_size (4 ) /* IFLA_CARRIER_UP_COUNT */
@@ -1511,7 +1512,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
1511
1512
struct net_device * dev , struct net * src_net ,
1512
1513
int type , u32 pid , u32 seq , u32 change ,
1513
1514
unsigned int flags , u32 ext_filter_mask ,
1514
- u32 event , int * new_nsid , int tgt_netnsid )
1515
+ u32 event , int * new_nsid , int new_ifindex ,
1516
+ int tgt_netnsid )
1515
1517
{
1516
1518
struct ifinfomsg * ifm ;
1517
1519
struct nlmsghdr * nlh ;
@@ -1608,6 +1610,10 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
1608
1610
if (new_nsid &&
1609
1611
nla_put_s32 (skb , IFLA_NEW_NETNSID , * new_nsid ) < 0 )
1610
1612
goto nla_put_failure ;
1613
+ if (new_ifindex &&
1614
+ nla_put_s32 (skb , IFLA_NEW_IFINDEX , new_ifindex ) < 0 )
1615
+ goto nla_put_failure ;
1616
+
1611
1617
1612
1618
rcu_read_lock ();
1613
1619
if (rtnl_fill_link_af (skb , dev , ext_filter_mask ))
@@ -1853,7 +1859,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
1853
1859
NETLINK_CB (cb -> skb ).portid ,
1854
1860
cb -> nlh -> nlmsg_seq , 0 ,
1855
1861
flags ,
1856
- ext_filter_mask , 0 , NULL ,
1862
+ ext_filter_mask , 0 , NULL , 0 ,
1857
1863
netnsid );
1858
1864
1859
1865
if (err < 0 ) {
@@ -3088,7 +3094,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3088
3094
err = rtnl_fill_ifinfo (nskb , dev , net ,
3089
3095
RTM_NEWLINK , NETLINK_CB (skb ).portid ,
3090
3096
nlh -> nlmsg_seq , 0 , 0 , ext_filter_mask ,
3091
- 0 , NULL , netnsid );
3097
+ 0 , NULL , 0 , netnsid );
3092
3098
if (err < 0 ) {
3093
3099
/* -EMSGSIZE implies BUG in if_nlmsg_size */
3094
3100
WARN_ON (err == - EMSGSIZE );
@@ -3184,7 +3190,8 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
3184
3190
3185
3191
struct sk_buff * rtmsg_ifinfo_build_skb (int type , struct net_device * dev ,
3186
3192
unsigned int change ,
3187
- u32 event , gfp_t flags , int * new_nsid )
3193
+ u32 event , gfp_t flags , int * new_nsid ,
3194
+ int new_ifindex )
3188
3195
{
3189
3196
struct net * net = dev_net (dev );
3190
3197
struct sk_buff * skb ;
@@ -3197,7 +3204,7 @@ struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
3197
3204
3198
3205
err = rtnl_fill_ifinfo (skb , dev , dev_net (dev ),
3199
3206
type , 0 , 0 , change , 0 , 0 , event ,
3200
- new_nsid , -1 );
3207
+ new_nsid , new_ifindex , -1 );
3201
3208
if (err < 0 ) {
3202
3209
/* -EMSGSIZE implies BUG in if_nlmsg_size() */
3203
3210
WARN_ON (err == - EMSGSIZE );
@@ -3220,29 +3227,31 @@ void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev, gfp_t flags)
3220
3227
3221
3228
static void rtmsg_ifinfo_event (int type , struct net_device * dev ,
3222
3229
unsigned int change , u32 event ,
3223
- gfp_t flags , int * new_nsid )
3230
+ gfp_t flags , int * new_nsid , int new_ifindex )
3224
3231
{
3225
3232
struct sk_buff * skb ;
3226
3233
3227
3234
if (dev -> reg_state != NETREG_REGISTERED )
3228
3235
return ;
3229
3236
3230
- skb = rtmsg_ifinfo_build_skb (type , dev , change , event , flags , new_nsid );
3237
+ skb = rtmsg_ifinfo_build_skb (type , dev , change , event , flags , new_nsid ,
3238
+ new_ifindex );
3231
3239
if (skb )
3232
3240
rtmsg_ifinfo_send (skb , dev , flags );
3233
3241
}
3234
3242
3235
3243
void rtmsg_ifinfo (int type , struct net_device * dev , unsigned int change ,
3236
3244
gfp_t flags )
3237
3245
{
3238
- rtmsg_ifinfo_event (type , dev , change , rtnl_get_event (0 ), flags , NULL );
3246
+ rtmsg_ifinfo_event (type , dev , change , rtnl_get_event (0 ), flags ,
3247
+ NULL , 0 );
3239
3248
}
3240
3249
3241
3250
void rtmsg_ifinfo_newnet (int type , struct net_device * dev , unsigned int change ,
3242
- gfp_t flags , int * new_nsid )
3251
+ gfp_t flags , int * new_nsid , int new_ifindex )
3243
3252
{
3244
3253
rtmsg_ifinfo_event (type , dev , change , rtnl_get_event (0 ), flags ,
3245
- new_nsid );
3254
+ new_nsid , new_ifindex );
3246
3255
}
3247
3256
3248
3257
static int nlmsg_populate_fdb_fill (struct sk_buff * skb ,
@@ -4642,7 +4651,7 @@ static int rtnetlink_event(struct notifier_block *this, unsigned long event, voi
4642
4651
case NETDEV_CHANGELOWERSTATE :
4643
4652
case NETDEV_CHANGE_TX_QUEUE_LEN :
4644
4653
rtmsg_ifinfo_event (RTM_NEWLINK , dev , 0 , rtnl_get_event (event ),
4645
- GFP_KERNEL , NULL );
4654
+ GFP_KERNEL , NULL , 0 );
4646
4655
break ;
4647
4656
default :
4648
4657
break ;
0 commit comments