248 lines
7.2 KiB
C
248 lines
7.2 KiB
C
#ifndef LINUX_26_24_COMPAT_H
|
|
#define LINUX_26_24_COMPAT_H
|
|
|
|
#include <linux/version.h>
|
|
|
|
/* Compat work for 2.6.21, 2.6.22 and 2.6.23 */
|
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
|
|
|
|
#include <asm/atomic.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/usb.h>
|
|
#include <linux/types.h>
|
|
#include <linux/list.h>
|
|
#include <linux/scatterlist.h>
|
|
|
|
#define KEY_BLUETOOTH 237
|
|
#define KEY_WLAN 238
|
|
#define KEY_UWB 239
|
|
|
|
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
|
|
|
|
struct proc_dir_entry;
|
|
struct net_device;
|
|
struct net {
|
|
atomic_t count; /* To decided when the network
|
|
* namespace should be freed.
|
|
*/
|
|
atomic_t use_count; /* To track references we
|
|
* destroy on demand
|
|
*/
|
|
struct list_head list; /* list of network namespaces */
|
|
struct work_struct work; /* work struct for freeing */
|
|
|
|
struct proc_dir_entry *proc_net;
|
|
struct proc_dir_entry *proc_net_stat;
|
|
struct proc_dir_entry *proc_net_root;
|
|
|
|
struct net_device *loopback_dev; /* The loopback */
|
|
|
|
struct list_head dev_base_head;
|
|
struct hlist_head *dev_name_head;
|
|
struct hlist_head *dev_index_head;
|
|
};
|
|
|
|
#ifdef CONFIG_NET
|
|
/* Init's network namespace */
|
|
extern struct net init_net;
|
|
#define INIT_NET_NS(net_ns) .net_ns = &init_net,
|
|
#else
|
|
#define INIT_NET_NS(net_ns)
|
|
#endif
|
|
|
|
/* Added on 2.6.24 in include/linux/types.h by Al viro on commit 142956af */
|
|
typedef unsigned long uintptr_t;
|
|
|
|
/* From include/linux/net.h */
|
|
enum sock_shutdown_cmd {
|
|
SHUT_RD = 0,
|
|
SHUT_WR = 1,
|
|
SHUT_RDWR = 2,
|
|
};
|
|
|
|
#if (LINUX_VERSION_CODE == KERNEL_VERSION(2,6,23)) /* Local check */
|
|
/* Added as of 2.6.24 in include/linux/skbuff.h.
|
|
*
|
|
* Although 2.6.23 does support for CONFIG_NETDEVICES_MULTIQUEUE
|
|
* this helper was not added until 2.6.24. This implementation
|
|
* is exactly as it is on newer kernels.
|
|
*
|
|
* For older kernels we use the an internal mac80211 hack.
|
|
* For details see changes to include/net/mac80211.h through
|
|
* compat.diff and compat/mq_compat.h */
|
|
static inline u16 skb_get_queue_mapping(struct sk_buff *skb)
|
|
{
|
|
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
|
return skb->queue_mapping;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
#endif /* Local 2.6.23 check */
|
|
|
|
/* On older kernels we handle this a bit differently, so we yield to that
|
|
* code for its implementation in mq_compat.h as we want to make
|
|
* use of the internal mac80211 __ieee80211_queue_stopped() which itself
|
|
* uses internal mac80211 data structure hacks. */
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)) /* Local check */
|
|
/**
|
|
* netif_subqueue_stopped - test status of subqueue
|
|
* @dev: network device
|
|
* @queue_index: sub queue index
|
|
*
|
|
* Check individual transmit queue of a device with multiple transmit queues.
|
|
*/
|
|
static inline int __netif_subqueue_stopped(const struct net_device *dev,
|
|
u16 queue_index)
|
|
{
|
|
#ifdef CONFIG_NETDEVICES_MULTIQUEUE
|
|
return test_bit(__LINK_STATE_XOFF,
|
|
&dev->egress_subqueue[queue_index].state);
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
/* Note: although the backport implementation for netif_subqueue_stopped
|
|
* on older kernels is identical to upstream __netif_subqueue_stopped()
|
|
* (except for a const qualifier) we implement netif_subqueue_stopped()
|
|
* as part of mac80211 as it relies on internal mac80211 structures we
|
|
* use for MQ support. We this implement it in mq_compat.h */
|
|
|
|
#endif /* Local 2.6.23 check */
|
|
|
|
/*
|
|
* Force link bug if constructor is used, can't be done compatibly
|
|
* because constructor arguments were swapped since then!
|
|
*/
|
|
extern void __incompatible_kmem_cache_create(void);
|
|
|
|
/* 2.6.21 and 2.6.22 kmem_cache_create() takes 6 arguments */
|
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23))
|
|
#define kmem_cache_create(name, objsize, align, flags, ctor) \
|
|
({ \
|
|
if (ctor) __incompatible_kmem_cache_create(); \
|
|
kmem_cache_create((name), (objsize), (align), \
|
|
(flags), NULL, NULL); \
|
|
})
|
|
#endif
|
|
|
|
/* 2.6.23 kmem_cache_create() takes 5 arguments */
|
|
#if (LINUX_VERSION_CODE == KERNEL_VERSION(2,6,23))
|
|
#define kmem_cache_create(name, objsize, align, flags, ctor) \
|
|
({ \
|
|
if (ctor) __incompatible_kmem_cache_create(); \
|
|
kmem_cache_create((name), (objsize), (align), \
|
|
(flags), NULL); \
|
|
})
|
|
#endif
|
|
|
|
/* From include/linux/mod_devicetable.h */
|
|
|
|
/* SSB core, see drivers/ssb/ */
|
|
#ifndef SSB_DEVICE
|
|
struct ssb_device_id {
|
|
__u16 vendor;
|
|
__u16 coreid;
|
|
__u8 revision;
|
|
};
|
|
#define SSB_DEVICE(_vendor, _coreid, _revision) \
|
|
{ .vendor = _vendor, .coreid = _coreid, .revision = _revision, }
|
|
#define SSB_DEVTABLE_END \
|
|
{ 0, },
|
|
|
|
#define SSB_ANY_VENDOR 0xFFFF
|
|
#define SSB_ANY_ID 0xFFFF
|
|
#define SSB_ANY_REV 0xFF
|
|
#endif
|
|
|
|
|
|
/* Namespace stuff, introduced on 2.6.24 */
|
|
#define dev_get_by_index(a, b) dev_get_by_index(b)
|
|
#define __dev_get_by_index(a, b) __dev_get_by_index(b)
|
|
|
|
extern int eth_header(struct sk_buff *skb, struct net_device *dev,
|
|
unsigned short type, void *daddr,
|
|
void *saddr, unsigned len);
|
|
extern int eth_rebuild_header(struct sk_buff *skb);
|
|
extern void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev,
|
|
unsigned char * haddr);
|
|
extern int eth_header_cache(struct neighbour *neigh,
|
|
struct hh_cache *hh);
|
|
|
|
/* This structure is simply not present on 2.6.22 and 2.6.23 */
|
|
struct header_ops {
|
|
int (*create) (struct sk_buff *skb, struct net_device *dev,
|
|
unsigned short type, void *daddr,
|
|
void *saddr, unsigned len);
|
|
int (*parse)(const struct sk_buff *skb, unsigned char *haddr);
|
|
int (*rebuild)(struct sk_buff *skb);
|
|
#define HAVE_HEADER_CACHE
|
|
int (*cache)(struct neighbour *neigh, struct hh_cache *hh);
|
|
void (*cache_update)(struct hh_cache *hh,
|
|
struct net_device *dev,
|
|
unsigned char *haddr);
|
|
};
|
|
|
|
/* net/ieee80211/ieee80211_crypt_tkip uses sg_init_table. This was added on
|
|
* 2.6.24. CONFIG_DEBUG_SG was added in 2.6.24 as well, so lets just ignore
|
|
* the debug stuff. Note that adding this required changes to the struct
|
|
* scatterlist on include/asm/scatterlist*, so the right way to port this
|
|
* is to simply ignore the new structure changes and zero the scatterlist
|
|
* array. We lave the kdoc intact for reference.
|
|
*/
|
|
|
|
/**
|
|
* sg_mark_end - Mark the end of the scatterlist
|
|
* @sg: SG entryScatterlist
|
|
*
|
|
* Description:
|
|
* Marks the passed in sg entry as the termination point for the sg
|
|
* table. A call to sg_next() on this entry will return NULL.
|
|
*
|
|
**/
|
|
static inline void sg_mark_end(struct scatterlist *sg)
|
|
{
|
|
#ifdef CONFIG_DEBUG_SG
|
|
BUG_ON(sg->sg_magic != SG_MAGIC);
|
|
#endif
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
|
|
/*
|
|
* Set termination bit, clear potential chain bit
|
|
*/
|
|
sg->page_link |= 0x02;
|
|
sg->page_link &= ~0x01;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* sg_init_table - Initialize SG table
|
|
* @sgl: The SG table
|
|
* @nents: Number of entries in table
|
|
*
|
|
* Notes:
|
|
* If this is part of a chained sg table, sg_mark_end() should be
|
|
* used only on the last table part.
|
|
*
|
|
**/
|
|
static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents)
|
|
{
|
|
memset(sgl, 0, sizeof(*sgl) * nents);
|
|
}
|
|
|
|
/**
|
|
* usb_endpoint_num - get the endpoint's number
|
|
* @epd: endpoint to be checked
|
|
*
|
|
* Returns @epd's number: 0 to 15.
|
|
*/
|
|
static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
|
|
{
|
|
return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
|
|
}
|
|
|
|
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) */
|
|
|
|
#endif /* LINUX_26_24_COMPAT_H */
|