2344 break;
2345 }
2346 }
2347 return *pos ? NULL : pn;
2348}
2349
2350static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos)
2351{
2352 struct neigh_seq_state *state = seq->private;
2353 void *rc;
2354 loff_t idxpos = *pos;
2355
2356 rc = neigh_get_idx(seq, &idxpos);
2357 if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY))
2358 rc = pneigh_get_idx(seq, &idxpos);
2359
2360 return rc;
2361}
2362
2363void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
2364 __acquires(tbl->lock)
2365{
2366 struct neigh_seq_state *state = seq->private;
2367
2368 state->tbl = tbl;
2369 state->bucket = 0;
2370 state->flags = (neigh_seq_flags & ~NEIGH_SEQ_IS_PNEIGH);
2371
2372 read_lock_bh(&tbl->lock);
2373
2374 return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN;
2375}
2376EXPORT_SYMBOL(neigh_seq_start);
2377
2378void *neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2379{
2380 struct neigh_seq_state *state;
2381 void *rc;
2382
2383 if (v == SEQ_START_TOKEN) {
2384 rc = neigh_get_first(seq);