195
196static struct hlist_node *ct_expect_get_next(struct seq_file *seq,
197 struct hlist_node *head)
198{
199 struct net *net = seq_file_net(seq);
200 struct ct_expect_iter_state *st = seq->private;
201
202 head = rcu_dereference(head->next);
203 while (head == NULL) {
204 if (++st->bucket >= nf_ct_expect_hsize)
205 return NULL;
206 head = rcu_dereference(net->ct.expect_hash[st->bucket].first);
207 }
208 return head;
209}
210
211static struct hlist_node *ct_expect_get_idx(struct seq_file *seq, loff_t pos)
212{
213 struct hlist_node *head = ct_expect_get_first(seq);
214
215 if (head)
216 while (pos && (head = ct_expect_get_next(seq, head)))
217 pos--;
218 return pos ? NULL : head;
219}
220
221static void *exp_seq_start(struct seq_file *seq, loff_t *pos)
222 __acquires(RCU)
223{
224 rcu_read_lock();
225 return ct_expect_get_idx(seq, *pos);
226}
227
228static void *exp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
229{
230 (*pos)++;
231 return ct_expect_get_next(seq, v);
232}
233
234static void exp_seq_stop(struct seq_file *seq, void *v)
235 __releases(RCU)