X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=dummynet%2Fmissing.h;h=5b04dce706fac1f5d3e85ec2303479882c8c32c0;hb=4e189c94aef3d3e9a4e8edfd2bb989feeb5d5e26;hp=c47b117db1a2f1e4637e94f04d46cad1a295f60f;hpb=5f337135c613b2ee3cb24ade7617ecaae0a74681;p=ipfw.git diff --git a/dummynet/missing.h b/dummynet/missing.h index c47b117..5b04dce 100644 --- a/dummynet/missing.h +++ b/dummynet/missing.h @@ -25,6 +25,7 @@ /* * $Id$ + * * Header for kernel variables and functions that are not available in * userland. */ @@ -32,6 +33,8 @@ #ifndef _MISSING_H_ #define _MISSING_H_ +#include + #ifdef _WIN32 #ifndef DEFINE_SPINLOCK @@ -49,15 +52,17 @@ #else /* __linux__ */ +#define MALLOC_DECLARE(x) /* nothing */ #include /* do_gettimeofday */ #include /* local version */ struct inpcb; /* * Kernel locking support. - * FreeBSD uses mtx in dummynet.c, and rwlocks in ipfw.c + * FreeBSD uses mtx in dummynet.c and struct rwlock ip_fw2.c * * In linux we use spinlock_bh to implement both. + * For 'struct rwlock' we need an #ifdef to change it to spinlock_t */ #ifndef DEFINE_SPINLOCK /* this is for linux 2.4 */ @@ -73,6 +78,7 @@ struct inpcb; #define rw_runlock(_l) spin_unlock_bh(_l) #define rw_wlock(_l) spin_lock_bh(_l) #define rw_wunlock(_l) spin_unlock_bh(_l) +#define rw_init_flags(_l, s, v) #define mtx_assert(a, b) #define mtx_destroy(m) @@ -82,6 +88,13 @@ struct inpcb; /* end of locking support */ +/* in netinet/in.h */ +#define in_nullhost(x) ((x).s_addr == INADDR_ANY) + +/* bzero not present on linux, but this should go in glue.h */ +#define bzero(s, n) memset(s, 0, n) +#define bcmp(p1, p2, n) memcmp(p1, p2, n) + /* ethernet stuff */ #define ETHERTYPE_IP 0x0800 /* IP protocol */ #define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ @@ -112,7 +125,11 @@ struct malloc_type { #define CTASSERT(x) -#define log(_level, fmt, arg...) printk(KERN_ERR fmt, ##arg) +/* log... does not use the first argument */ +#define LOG_ERR 0x100 +#define LOG_INFO 0x200 +#define log(_level, fmt, arg...) do { \ + int __unused x=_level;printk(KERN_ERR fmt, ##arg); } while (0) /* * gettimeofday would be in sys/time.h but it is not @@ -253,6 +270,10 @@ int in_cksum(struct mbuf *m, int len); #define INADDR_TO_IFP(a, b) b = NULL #define pf_find_mtag(a) NULL #define pf_get_mtag(a) NULL +/* we don't pullup, fail */ +#define m_pullup(m, x) \ + ((m)->m_len >= x ? (m) : (netisr_dispatch(-1, m), NULL)) + #ifndef _WIN32 #define AF_LINK AF_ASH /* ? our sys/socket.h */ #endif @@ -263,12 +284,13 @@ struct pf_mtag { u_int32_t qid; /* queue id */ }; -/* radix related */ - +#if 0 // ndef radix +/* radix stuff in radix.h and radix.c */ struct radix_node { caddr_t rn_key; /* object of search */ caddr_t rn_mask; /* netmask, if present */ }; +#endif /* !radix */ /* missing kernel functions */ char *inet_ntoa(struct in_addr ina); @@ -336,6 +358,17 @@ int sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen); /* defined in session.c */ int priv_check(struct thread *td, int priv); +/* struct ucred is in linux/socket.h and has pid, uid, gid. + * We need a 'bsd_ucred' to store also the extra info + */ + +struct bsd_ucred { + uid_t uid; + gid_t gid; + uint32_t xid; + uint32_t nid; +}; + int securelevel_ge(struct ucred *cr, int level); struct sysctl_oid; @@ -345,12 +378,31 @@ struct sysctl_req; * sysctl are mapped into /sys/module/ipfw_mod parameters */ #define CTLFLAG_RD 1 +#define CTLFLAG_RDTUN 1 #define CTLFLAG_RW 2 #define CTLFLAG_SECURE3 0 // unsupported +#define CTLFLAG_VNET 0 /* unsupported */ #ifdef _WIN32 #define module_param_named(_name, _var, _ty, _perm) #else + +/* Linux 2.4 is mostly for openwrt */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#include /* generic_ffs() used in ip_fw2.c */ +typedef uint32_t __be32; +typedef uint16_t __be16; +struct sock; +struct net; +struct inet_hashinfo; +struct sock *inet_lookup( + struct inet_hashinfo *hashinfo, + const __be32 saddr, const __be16 sport, + const __be32 daddr, const __be16 dport, + const int dif); +struct sock *tcp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif); +#endif /* Linux < 2.6 */ + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17) #define module_param_named(_name, _var, _ty, _perm) \ //module_param(_name, _ty, 0644) @@ -358,6 +410,7 @@ struct sysctl_req; #endif /* __linux__ */ #define SYSCTL_DECL(_1) +#define SYSCTL_OID(_1, _2, _3, _4, _5, _6, _7, _8) #define SYSCTL_NODE(_1, _2, _3, _4, _5, _6) #define _SYSCTL_BASE(_name, _var, _ty, _perm) \ module_param_named(_name, *(_var), _ty, \ @@ -374,13 +427,15 @@ struct sysctl_req; _SYSCTL_BASE(_name, _var, ulong, _mode) #define SYSCTL_UINT(_base, _oid, _name, _mode, _var, _val, _desc) \ - // _SYSCTL_BASE(_name, _var, uint, _mode) + _SYSCTL_BASE(_name, _var, uint, _mode) #define SYSCTL_HANDLER_ARGS \ struct sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req int sysctl_handle_int(SYSCTL_HANDLER_ARGS); int sysctl_handle_long(SYSCTL_HANDLER_ARGS); +#define TUNABLE_INT(_name, _ptr) + void ether_demux(struct ifnet *ifp, struct mbuf *m); int ether_output_frame(struct ifnet *ifp, struct mbuf *m); @@ -398,8 +453,6 @@ u_short in_cksum_skip(struct mbuf *m, int len, int skip); #define INP_LOCK_ASSERT(a) #endif -int rn_inithead(void **head, int off); - int jailed(struct ucred *cred); /* @@ -415,10 +468,52 @@ int in_localaddr(struct in_addr in); int fnmatch(const char *pattern, const char *string, int flags); -struct ip_fw_ugid; int linux_lookup(const int proto, const __be32 saddr, const __be16 sport, const __be32 daddr, const __be16 dport, - struct sk_buff *skb, int dir, struct ip_fw_ugid *ugp); + struct sk_buff *skb, int dir, struct bsd_ucred *u); + +/* vnet wrappers, in vnet.h and ip_var.h */ +int ipfw_init(void); +void ipfw_destroy(void); +struct ip_fw_args; +extern int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); + +#define curvnet NULL +#define CURVNET_SET(_v) +#define CURVNET_RESTORE() +#define VNET_ASSERT(condition) + +#define VNET_NAME(n) n +#define VNET_DECLARE(t, n) extern t n +#define VNET_DEFINE(t, n) t n +#define _VNET_PTR(b, n) &VNET_NAME(n) +/* + * Virtualized global variable accessor macros. + */ +#define VNET_VNET_PTR(vnet, n) (&(n)) +#define VNET_VNET(vnet, n) (n) + +#define VNET_PTR(n) (&(n)) +#define VNET(n) (n) + +extern int (*ip_dn_ctl_ptr)(struct sockopt *); +typedef int ip_fw_ctl_t(struct sockopt *); +extern ip_fw_ctl_t *ip_fw_ctl_ptr; + +/* For kernel ipfw_ether and ipfw_bridge. */ +struct ip_fw_args; +typedef int ip_fw_chk_t(struct ip_fw_args *args); +extern ip_fw_chk_t *ip_fw_chk_ptr; + +#define V_ip_fw_chk_ptr VNET(ip_fw_chk_ptr) +#define V_ip_fw_ctl_ptr VNET(ip_fw_ctl_ptr) +#define V_tcbinfo VNET(tcbinfo) +#define V_udbinfo VNET(udbinfo) + +#define SYSCTL_VNET_PROC SYSCTL_PROC +#define SYSCTL_VNET_INT SYSCTL_INT + +int my_mod_register(struct moduledata *mod, const char *name, int order); #endif /* !_MISSING_H_ */