443
444static struct hlist_node *ct_expect_get_next(struct seq_file *seq,
445 struct hlist_node *head)
446{
447 struct net *net = seq_file_net(seq);
448 struct ct_expect_iter_state *st = seq->private;
449
450 head = rcu_dereference(head->next);
451 while (head == NULL) {
452 if (++st->bucket >= nf_ct_expect_hsize)
453 return NULL;
454 head = rcu_dereference(net->ct.expect_hash[st->bucket].first);
455 }
456 return head;
457}
458
459static struct hlist_node *ct_expect_get_idx(struct seq_file *seq, loff_t pos)
460{
461 struct hlist_node *head = ct_expect_get_first(seq);
462
463 if (head)
464 while (pos && (head = ct_expect_get_next(seq, head)))
465 pos--;
466 return pos ? NULL : head;
467}
468
469static void *exp_seq_start(struct seq_file *seq, loff_t *pos)
470 __acquires(RCU)
471{
472 rcu_read_lock();
473 return ct_expect_get_idx(seq, *pos);
474}
475
476static void *exp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
477{
478 (*pos)++;
479 return ct_expect_get_next(seq, v);
480}
481
482static void exp_seq_stop(struct seq_file *seq, void *v)
483 __releases(RCU)