📄 qeth.h
字号:
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 + -