⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qeth.h

📁 linux-2.6.15.6
💻 H
📖 第 1 页 / 共 2 页
字号:
			unsigned int mask;		} a4;		struct {			struct in6_addr addr;			unsigned int pfxlen;		} a6;	} u;};struct qeth_ipato_entry {	struct list_head entry;	enum qeth_prot_versions proto;	char addr[16];	int mask_bits;};struct qeth_ipato {	int enabled;	int invert4;	int invert6;	struct list_head entries;};struct qeth_channel;struct qeth_cmd_buffer {	enum qeth_cmd_buffer_state state;	struct qeth_channel *channel;	unsigned char *data;	int rc;	void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *);};/** * definition of a qeth channel, used for read and write */struct qeth_channel {	enum qeth_channel_states state;	struct ccw1 ccw;	spinlock_t iob_lock;	wait_queue_head_t wait_q;	struct tasklet_struct irq_tasklet;	struct ccw_device *ccwdev;/*command buffer for control data*/	struct qeth_cmd_buffer iob[QETH_CMD_BUFFER_NO];	atomic_t irq_pending;	volatile int io_buf_no;	volatile int buf_no;};/** *  OSA card related definitions */struct qeth_token {	__u32 issuer_rm_w;	__u32 issuer_rm_r;	__u32 cm_filter_w;	__u32 cm_filter_r;	__u32 cm_connection_w;	__u32 cm_connection_r;	__u32 ulp_filter_w;	__u32 ulp_filter_r;	__u32 ulp_connection_w;	__u32 ulp_connection_r;};struct qeth_seqno {	__u32 trans_hdr;	__u32 pdu_hdr;	__u32 pdu_hdr_ack;	__u16 ipa;	__u32 pkt_seqno;};struct qeth_reply {	struct list_head list;	wait_queue_head_t wait_q;	int (*callback)(struct qeth_card *,struct qeth_reply *,unsigned long); 	u32 seqno;	unsigned long offset;	int received;	int rc;	void *param;	struct qeth_card *card;	atomic_t refcnt;};struct qeth_card_blkt {	int time_total;	int inter_packet;	int inter_packet_jumbo;};#define QETH_BROADCAST_WITH_ECHO    0x01#define QETH_BROADCAST_WITHOUT_ECHO 0x02#define QETH_LAYER2_MAC_READ	    0x01#define QETH_LAYER2_MAC_REGISTERED  0x02struct qeth_card_info {	unsigned short unit_addr2;	unsigned short cula;	unsigned short chpid;	__u16 func_level;	char mcl_level[QETH_MCL_LENGTH + 1];	int guestlan;	int mac_bits;	int portname_required;	int portno;	char portname[9];	enum qeth_card_types type;	enum qeth_link_types link_type;	int is_multicast_different;	int initial_mtu;	int max_mtu;	int broadcast_capable;	int unique_id;	struct qeth_card_blkt blkt;	__u32 csum_mask;	enum qeth_ipa_promisc_modes promisc_mode;};struct qeth_card_options {	struct qeth_routing_info route4;	struct qeth_ipa_info ipa4;	struct qeth_ipa_info adp; /*Adapter parameters*/#ifdef CONFIG_QETH_IPV6	struct qeth_routing_info route6;	struct qeth_ipa_info ipa6;#endif /* QETH_IPV6 */	enum qeth_checksum_types checksum_type;	int broadcast_mode;	int macaddr_mode;	int fake_broadcast;	int add_hhlen;	int fake_ll;	int layer2;	enum qeth_large_send_types large_send;};/* * thread bits for qeth_card thread masks */enum qeth_threads {	QETH_SET_IP_THREAD  = 1,	QETH_RECOVER_THREAD = 2,	QETH_SET_PROMISC_MODE_THREAD = 4,};struct qeth_osn_info {	int (*assist_cb)(struct net_device *dev, void *data);	int (*data_cb)(struct sk_buff *skb);};struct qeth_card {	struct list_head list;	enum qeth_card_states state;	int lan_online;	spinlock_t lock;/*hardware and sysfs stuff*/	struct ccwgroup_device *gdev;	struct qeth_channel read;	struct qeth_channel write;	struct qeth_channel data;	struct net_device *dev;	struct net_device_stats stats;	struct qeth_card_info info;	struct qeth_token token;	struct qeth_seqno seqno;	struct qeth_card_options options;	wait_queue_head_t wait_q;#ifdef CONFIG_QETH_VLAN	spinlock_t vlanlock;	struct vlan_group *vlangrp;#endif	struct work_struct kernel_thread_starter;	spinlock_t thread_mask_lock;	volatile unsigned long thread_start_mask;	volatile unsigned long thread_allowed_mask;	volatile unsigned long thread_running_mask;	spinlock_t ip_lock;	struct list_head ip_list;	struct list_head *ip_tbd_list;	struct qeth_ipato ipato;	struct list_head cmd_waiter_list;	/* QDIO buffer handling */	struct qeth_qdio_info qdio;#ifdef CONFIG_QETH_PERF_STATS	struct qeth_perf_stats perf_stats;#endif /* CONFIG_QETH_PERF_STATS */	int use_hard_stop;	int (*orig_hard_header)(struct sk_buff *,struct net_device *,				unsigned short,void *,void *,unsigned);	struct qeth_osn_info osn_info; };struct qeth_card_list_struct {	struct list_head list;	rwlock_t rwlock;};extern struct qeth_card_list_struct qeth_card_list;/*notifier list */struct qeth_notify_list_struct {	struct list_head list;	struct task_struct *task;	int signum;};extern spinlock_t qeth_notify_lock;extern struct list_head qeth_notify_list;/*some helper functions*/#define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "")static inline __u8qeth_get_ipa_adp_type(enum qeth_link_types link_type){	switch (link_type) {	case QETH_LINK_TYPE_HSTR:		return 2;	default:		return 1;	}}static inline intqeth_realloc_headroom(struct qeth_card *card, struct sk_buff **skb, int size){	struct sk_buff *new_skb = NULL;	if (skb_headroom(*skb) < size){		new_skb = skb_realloc_headroom(*skb, size);		if (!new_skb) {                        PRINT_ERR("qeth_prepare_skb: could "                                  "not realloc headroom for qeth_hdr "                                  "on interface %s", QETH_CARD_IFNAME(card));                        return -ENOMEM;                }		kfree_skb(*skb);                *skb = new_skb;	}	return 0;}static inline struct sk_buff *qeth_pskb_unshare(struct sk_buff *skb, int pri){        struct sk_buff *nskb;        if (!skb_cloned(skb))                return skb;        nskb = skb_copy(skb, pri);        kfree_skb(skb); /* free our shared copy */        return nskb;}static inline void *qeth_push_skb(struct qeth_card *card, struct sk_buff **skb, int size){        void *hdr;	hdr = (void *) skb_push(*skb, size);        /*         * sanity check, the Linux memory allocation scheme should         * never present us cases like this one (the qdio header size plus         * the first 40 bytes of the paket cross a 4k boundary)         */        if ((((unsigned long) hdr) & (~(PAGE_SIZE - 1))) !=            (((unsigned long) hdr + size +              QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) {                PRINT_ERR("qeth_prepare_skb: misaligned "                          "packet on interface %s. Discarded.",                          QETH_CARD_IFNAME(card));                return NULL;        }        return hdr;}static inline intqeth_get_hlen(__u8 link_type){#ifdef CONFIG_QETH_IPV6	switch (link_type) {	case QETH_LINK_TYPE_HSTR:	case QETH_LINK_TYPE_LANE_TR:		return sizeof(struct qeth_hdr_tso) + TR_HLEN;	default:#ifdef CONFIG_QETH_VLAN		return sizeof(struct qeth_hdr_tso) + VLAN_ETH_HLEN;#else		return sizeof(struct qeth_hdr_tso) + ETH_HLEN;#endif	}#else  /* CONFIG_QETH_IPV6 */#ifdef CONFIG_QETH_VLAN	return sizeof(struct qeth_hdr_tso) + VLAN_HLEN;#else	return sizeof(struct qeth_hdr_tso);#endif#endif /* CONFIG_QETH_IPV6 */}static inline unsigned shortqeth_get_netdev_flags(struct qeth_card *card){	if (card->options.layer2 &&	   (card->info.type == QETH_CARD_TYPE_OSAE))		return 0;	switch (card->info.type) {	case QETH_CARD_TYPE_IQD:	case QETH_CARD_TYPE_OSN:			return IFF_NOARP;#ifdef CONFIG_QETH_IPV6	default:		return 0;#else	default:		return IFF_NOARP;#endif	}}static inline intqeth_get_initial_mtu_for_card(struct qeth_card * card){	switch (card->info.type) {	case QETH_CARD_TYPE_UNKNOWN:		return 1500;	case QETH_CARD_TYPE_IQD:		return card->info.max_mtu;	case QETH_CARD_TYPE_OSAE:		switch (card->info.link_type) {		case QETH_LINK_TYPE_HSTR:		case QETH_LINK_TYPE_LANE_TR:			return 2000;		default:			return 1492;		}	default:		return 1500;	}}static inline intqeth_get_max_mtu_for_card(int cardtype){	switch (cardtype) {			case QETH_CARD_TYPE_UNKNOWN:	case QETH_CARD_TYPE_OSAE:	case QETH_CARD_TYPE_OSN:		return 61440;	case QETH_CARD_TYPE_IQD:		return 57344;	default:		return 1500;	}}static inline intqeth_get_mtu_out_of_mpc(int cardtype){	switch (cardtype) {	case QETH_CARD_TYPE_IQD:		return 1;	default:		return 0;	}}static inline intqeth_get_mtu_outof_framesize(int framesize){	switch (framesize) {	case 0x4000:		return 8192;	case 0x6000:		return 16384;	case 0xa000:		return 32768;	case 0xffff:		return 57344;	default:		return 0;	}}static inline intqeth_mtu_is_valid(struct qeth_card * card, int mtu){	switch (card->info.type) {	case QETH_CARD_TYPE_OSAE:		return ((mtu >= 576) && (mtu <= 61440));	case QETH_CARD_TYPE_IQD:		return ((mtu >= 576) &&			(mtu <= card->info.max_mtu + 4096 - 32));	case QETH_CARD_TYPE_OSN:	case QETH_CARD_TYPE_UNKNOWN:	default:		return 1;	}}static inline intqeth_get_arphdr_type(int cardtype, int linktype){	switch (cardtype) {	case QETH_CARD_TYPE_OSAE:	case QETH_CARD_TYPE_OSN:		switch (linktype) {		case QETH_LINK_TYPE_LANE_TR:		case QETH_LINK_TYPE_HSTR:			return ARPHRD_IEEE802_TR;		default:			return ARPHRD_ETHER;		}	case QETH_CARD_TYPE_IQD:	default:		return ARPHRD_ETHER;	}}#ifdef CONFIG_QETH_PERF_STATSstatic inline intqeth_get_micros(void){	return (int) (get_clock() >> 12);}#endifstatic inline intqeth_get_qdio_q_format(struct qeth_card *card){	switch (card->info.type) {	case QETH_CARD_TYPE_IQD:		return 2;	default:		return 0;	}}static inline intqeth_isdigit(char * buf){	while (*buf) {		if (!isdigit(*buf++))			return 0;	}	return 1;}static inline intqeth_isxdigit(char * buf){	while (*buf) {		if (!isxdigit(*buf++))			return 0;	}	return 1;}static inline voidqeth_ipaddr4_to_string(const __u8 *addr, char *buf){	sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]);}static inline intqeth_string_to_ipaddr4(const char *buf, __u8 *addr){	const char *start, *end;	char abuf[4];	char *tmp;	int len;	int i;	start = buf;	for (i = 0; i < 4; i++) {		if (i == 3) {			end = strchr(start,0xa);			if (end)				len = end - start;			else						len = strlen(start);		}		else {			end = strchr(start, '.');			len = end - start;		}		if ((len <= 0) || (len > 3))			return -EINVAL;		memset(abuf, 0, 4);		strncpy(abuf, start, len);		if (!qeth_isdigit(abuf))			return -EINVAL;		addr[i] = simple_strtoul(abuf, &tmp, 10);		start = end + 1;	}	return 0;}static inline voidqeth_ipaddr6_to_string(const __u8 *addr, char *buf){	sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x"		     ":%02x%02x:%02x%02x:%02x%02x:%02x%02x",		     addr[0], addr[1], addr[2], addr[3],		     addr[4], addr[5], addr[6], addr[7],		     addr[8], addr[9], addr[10], addr[11],		     addr[12], addr[13], addr[14], addr[15]);}static inline intqeth_string_to_ipaddr6(const char *buf, __u8 *addr){	const char *start, *end;	u16 *tmp_addr;	char abuf[5];	char *tmp;	int len;	int i;	tmp_addr = (u16 *)addr;	start = buf;	for (i = 0; i < 8; i++) {		if (i == 7) {			end = strchr(start,0xa);			if (end)				len = end - start;			else				len = strlen(start);		}		else {			end = strchr(start, ':');			len = end - start;		}		if ((len <= 0) || (len > 4))			return -EINVAL;		memset(abuf, 0, 5);		strncpy(abuf, start, len);		if (!qeth_isxdigit(abuf))			return -EINVAL;		tmp_addr[i] = simple_strtoul(abuf, &tmp, 16);		start = end + 1;	}	return 0;}static inline voidqeth_ipaddr_to_string(enum qeth_prot_versions proto, const __u8 *addr,		      char *buf){	if (proto == QETH_PROT_IPV4)		return qeth_ipaddr4_to_string(addr, buf);	else if (proto == QETH_PROT_IPV6)		return qeth_ipaddr6_to_string(addr, buf);}static inline intqeth_string_to_ipaddr(const char *buf, enum qeth_prot_versions proto,		      __u8 *addr){	if (proto == QETH_PROT_IPV4)		return qeth_string_to_ipaddr4(buf, addr);	else if (proto == QETH_PROT_IPV6)		return qeth_string_to_ipaddr6(buf, addr);	else		return -EINVAL;}extern intqeth_setrouting_v4(struct qeth_card *);extern intqeth_setrouting_v6(struct qeth_card *);extern intqeth_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *);extern voidqeth_del_ipato_entry(struct qeth_card *, enum qeth_prot_versions, u8 *, int);extern intqeth_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);extern voidqeth_del_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);extern intqeth_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);extern voidqeth_del_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);extern intqeth_notifier_register(struct task_struct *, int );extern intqeth_notifier_unregister(struct task_struct * );extern voidqeth_schedule_recovery(struct qeth_card *);extern intqeth_realloc_buffer_pool(struct qeth_card *, int);extern intqeth_set_large_send(struct qeth_card *, enum qeth_large_send_types);extern voidqeth_fill_header(struct qeth_card *, struct qeth_hdr *,		 struct sk_buff *, int, int);extern voidqeth_flush_buffers(struct qeth_qdio_out_q *, int, int, int);extern intqeth_osn_assist(struct net_device *, void *, int);extern intqeth_osn_register(unsigned char *read_dev_no,                 struct net_device **,                 int (*assist_cb)(struct net_device *, void *),                 int (*data_cb)(struct sk_buff *));extern voidqeth_osn_deregister(struct net_device *);		#endif /* __QETH_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -