2732 .llseek = seq_lseek,
2733 .release = seq_release,
2734};
2735
2736static void *ptype_get_idx(loff_t pos)
2737{
2738 struct packet_type *pt = NULL;
2739 loff_t i = 0;
2740 int t;
2741
2742 list_for_each_entry_rcu(pt, &ptype_all, list) {
2743 if (i == pos)
2744 return pt;
2745 ++i;
2746 }
2747
2748 for (t = 0; t < PTYPE_HASH_SIZE; t++) {
2749 list_for_each_entry_rcu(pt, &ptype_base[t], list) {
2750 if (i == pos)
2751 return pt;
2752 ++i;
2753 }
2754 }
2755 return NULL;
2756}
2757
2758static void *ptype_seq_start(struct seq_file *seq, loff_t *pos)
2759 __acquires(RCU)
2760{
2761 rcu_read_lock();
2762 return *pos ? ptype_get_idx(*pos - 1) : SEQ_START_TOKEN;
2763}
2764
2765static void *ptype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2766{
2767 struct packet_type *pt;
2768 struct list_head *nxt;
2769 int hash;
2770
2771 ++*pos;
2772 if (v == SEQ_START_TOKEN)