![Pavel Emelyanov](/assets/img/avatar_default.png)
Both ipv6/raw.c and ipv4/raw.c use the seq files to walk through the raw sockets hash and show them. The "walking" code is rather huge, but is identical in both cases. The difference is the hash table to walk over and the protocol family to check (this was not in the first virsion of the patch, which was noticed by YOSHIFUJI) Make the ->open store the needed hash table and the family on the allocated raw_iter_state and make the start/next/stop callbacks work with it. This removes most of the code. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
60 lines
1.6 KiB
C
60 lines
1.6 KiB
C
/*
|
|
* INET An implementation of the TCP/IP protocol suite for the LINUX
|
|
* operating system. INET is implemented using the BSD Socket
|
|
* interface as the means of communication with the user level.
|
|
*
|
|
* Definitions for the RAW-IP module.
|
|
*
|
|
* Version: @(#)raw.h 1.0.2 05/07/93
|
|
*
|
|
* Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#ifndef _RAW_H
|
|
#define _RAW_H
|
|
|
|
|
|
#include <net/protocol.h>
|
|
|
|
extern struct proto raw_prot;
|
|
|
|
void raw_icmp_error(struct sk_buff *, int, u32);
|
|
int raw_local_deliver(struct sk_buff *, int);
|
|
|
|
extern int raw_rcv(struct sock *, struct sk_buff *);
|
|
|
|
#define RAW_HTABLE_SIZE MAX_INET_PROTOS
|
|
|
|
struct raw_hashinfo {
|
|
rwlock_t lock;
|
|
struct hlist_head ht[RAW_HTABLE_SIZE];
|
|
};
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
extern int raw_proc_init(void);
|
|
extern void raw_proc_exit(void);
|
|
|
|
struct raw_iter_state {
|
|
int bucket;
|
|
unsigned short family;
|
|
struct raw_hashinfo *h;
|
|
};
|
|
|
|
#define raw_seq_private(seq) ((struct raw_iter_state *)(seq)->private)
|
|
void *raw_seq_start(struct seq_file *seq, loff_t *pos);
|
|
void *raw_seq_next(struct seq_file *seq, void *v, loff_t *pos);
|
|
void raw_seq_stop(struct seq_file *seq, void *v);
|
|
int raw_seq_open(struct file *file, struct raw_hashinfo *h,
|
|
unsigned short family);
|
|
|
|
#endif
|
|
|
|
void raw_hash_sk(struct sock *sk, struct raw_hashinfo *h);
|
|
void raw_unhash_sk(struct sock *sk, struct raw_hashinfo *h);
|
|
|
|
#endif /* _RAW_H */
|