@@ -2188,25 +2188,22 @@ static int rtnl_valid_dump_ifinfo_req(const struct nlmsghdr *nlh,
2188
2188
2189
2189
static int rtnl_dump_ifinfo (struct sk_buff * skb , struct netlink_callback * cb )
2190
2190
{
2191
+ const struct rtnl_link_ops * kind_ops = NULL ;
2191
2192
struct netlink_ext_ack * extack = cb -> extack ;
2192
2193
const struct nlmsghdr * nlh = cb -> nlh ;
2193
2194
struct net * net = sock_net (skb -> sk );
2194
- struct net * tgt_net = net ;
2195
- int h , s_h ;
2196
- int idx = 0 , s_idx ;
2197
- struct net_device * dev ;
2198
- struct hlist_head * head ;
2195
+ unsigned int flags = NLM_F_MULTI ;
2199
2196
struct nlattr * tb [IFLA_MAX + 1 ];
2197
+ struct {
2198
+ unsigned long ifindex ;
2199
+ } * ctx = (void * )cb -> ctx ;
2200
+ struct net * tgt_net = net ;
2200
2201
u32 ext_filter_mask = 0 ;
2201
- const struct rtnl_link_ops * kind_ops = NULL ;
2202
- unsigned int flags = NLM_F_MULTI ;
2202
+ struct net_device * dev ;
2203
2203
int master_idx = 0 ;
2204
2204
int netnsid = -1 ;
2205
2205
int err , i ;
2206
2206
2207
- s_h = cb -> args [0 ];
2208
- s_idx = cb -> args [1 ];
2209
-
2210
2207
err = rtnl_valid_dump_ifinfo_req (nlh , cb -> strict_check , tb , extack );
2211
2208
if (err < 0 ) {
2212
2209
if (cb -> strict_check )
@@ -2250,36 +2247,21 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
2250
2247
flags |= NLM_F_DUMP_FILTERED ;
2251
2248
2252
2249
walk_entries :
2253
- for (h = s_h ; h < NETDEV_HASHENTRIES ; h ++ , s_idx = 0 ) {
2254
- idx = 0 ;
2255
- head = & tgt_net -> dev_index_head [h ];
2256
- hlist_for_each_entry (dev , head , index_hlist ) {
2257
- if (link_dump_filtered (dev , master_idx , kind_ops ))
2258
- goto cont ;
2259
- if (idx < s_idx )
2260
- goto cont ;
2261
- err = rtnl_fill_ifinfo (skb , dev , net ,
2262
- RTM_NEWLINK ,
2263
- NETLINK_CB (cb -> skb ).portid ,
2264
- nlh -> nlmsg_seq , 0 , flags ,
2265
- ext_filter_mask , 0 , NULL , 0 ,
2266
- netnsid , GFP_KERNEL );
2267
-
2268
- if (err < 0 ) {
2269
- if (likely (skb -> len ))
2270
- goto out ;
2271
-
2272
- goto out_err ;
2273
- }
2274
- cont :
2275
- idx ++ ;
2250
+ err = 0 ;
2251
+ for_each_netdev_dump (tgt_net , dev , ctx -> ifindex ) {
2252
+ if (link_dump_filtered (dev , master_idx , kind_ops ))
2253
+ continue ;
2254
+ err = rtnl_fill_ifinfo (skb , dev , net , RTM_NEWLINK ,
2255
+ NETLINK_CB (cb -> skb ).portid ,
2256
+ nlh -> nlmsg_seq , 0 , flags ,
2257
+ ext_filter_mask , 0 , NULL , 0 ,
2258
+ netnsid , GFP_KERNEL );
2259
+ if (err < 0 ) {
2260
+ if (likely (skb -> len ))
2261
+ err = skb -> len ;
2262
+ break ;
2276
2263
}
2277
2264
}
2278
- out :
2279
- err = skb -> len ;
2280
- out_err :
2281
- cb -> args [1 ] = idx ;
2282
- cb -> args [0 ] = h ;
2283
2265
cb -> seq = tgt_net -> dev_base_seq ;
2284
2266
nl_dump_check_consistent (cb , nlmsg_hdr (skb ));
2285
2267
if (netnsid >= 0 )
0 commit comments