1 /* 2 * Copyright 2006 IBM Corporation 3 * IUCV protocol stack for Linux on zSeries 4 * Version 1.0 5 * Author(s): Jennifer Hunt <jenhunt@us.ibm.com> 6 * 7 */ 8 9 #ifndef __AFIUCV_H 10 #define __AFIUCV_H 11 12 #include <asm/types.h> 13 #include <asm/byteorder.h> 14 #include <linux/list.h> 15 #include <linux/poll.h> 16 #include <linux/socket.h> 17 #include <net/iucv/iucv.h> 18 19 #ifndef AF_IUCV 20 #define AF_IUCV 32 21 #define PF_IUCV AF_IUCV 22 #endif 23 24 /* Connection and socket states */ 25 enum { 26 IUCV_CONNECTED = 1, 27 IUCV_OPEN, 28 IUCV_BOUND, 29 IUCV_LISTEN, 30 IUCV_DISCONN, 31 IUCV_CLOSING, 32 IUCV_CLOSED 33 }; 34 35 #define IUCV_QUEUELEN_DEFAULT 65535 36 #define IUCV_HIPER_MSGLIM_DEFAULT 128 37 #define IUCV_CONN_TIMEOUT (HZ * 40) 38 #define IUCV_DISCONN_TIMEOUT (HZ * 2) 39 #define IUCV_CONN_IDLE_TIMEOUT (HZ * 60) 40 #define IUCV_BUFSIZE_DEFAULT 32768 41 42 /* IUCV socket address */ 43 struct sockaddr_iucv { 44 sa_family_t siucv_family; 45 unsigned short siucv_port; /* Reserved */ 46 unsigned int siucv_addr; /* Reserved */ 47 char siucv_nodeid[8]; /* Reserved */ 48 char siucv_user_id[8]; /* Guest User Id */ 49 char siucv_name[8]; /* Application Name */ 50 }; 51 52 53 /* Common socket structures and functions */ 54 struct sock_msg_q { 55 struct iucv_path *path; 56 struct iucv_message msg; 57 struct list_head list; 58 spinlock_t lock; 59 }; 60 61 #define AF_IUCV_FLAG_ACK 0x1 62 #define AF_IUCV_FLAG_SYN 0x2 63 #define AF_IUCV_FLAG_FIN 0x4 64 #define AF_IUCV_FLAG_WIN 0x8 65 #define AF_IUCV_FLAG_SHT 0x10 66 67 struct af_iucv_trans_hdr { 68 u16 magic; 69 u8 version; 70 u8 flags; 71 u16 window; 72 char destNodeID[8]; 73 char destUserID[8]; 74 char destAppName[16]; 75 char srcNodeID[8]; 76 char srcUserID[8]; 77 char srcAppName[16]; /* => 70 bytes */ 78 struct iucv_message iucv_hdr; /* => 33 bytes */ 79 u8 pad; /* total 104 bytes */ 80 } __packed; 81 82 enum iucv_tx_notify { 83 /* transmission of skb is completed and was successful */ 84 TX_NOTIFY_OK = 0, 85 /* target is unreachable */ 86 TX_NOTIFY_UNREACHABLE = 1, 87 /* transfer pending queue full */ 88 TX_NOTIFY_TPQFULL = 2, 89 /* general error */ 90 TX_NOTIFY_GENERALERROR = 3, 91 /* transmission of skb is pending - may interleave 92 * with TX_NOTIFY_DELAYED_* */ 93 TX_NOTIFY_PENDING = 4, 94 /* transmission of skb was done successfully (delayed) */ 95 TX_NOTIFY_DELAYED_OK = 5, 96 /* target unreachable (detected delayed) */ 97 TX_NOTIFY_DELAYED_UNREACHABLE = 6, 98 /* general error (detected delayed) */ 99 TX_NOTIFY_DELAYED_GENERALERROR = 7, 100 }; 101 102 #define iucv_sk(__sk) ((struct iucv_sock *) __sk) 103 104 #define AF_IUCV_TRANS_IUCV 0 105 #define AF_IUCV_TRANS_HIPER 1 106 107 struct iucv_sock { 108 struct sock sk; 109 char src_user_id[8]; 110 char src_name[8]; 111 char dst_user_id[8]; 112 char dst_name[8]; 113 struct list_head accept_q; 114 spinlock_t accept_q_lock; 115 struct sock *parent; 116 struct iucv_path *path; 117 struct net_device *hs_dev; 118 struct sk_buff_head send_skb_q; 119 struct sk_buff_head backlog_skb_q; 120 struct sock_msg_q message_q; 121 unsigned int send_tag; 122 u8 flags; 123 u16 msglimit; 124 u16 msglimit_peer; 125 atomic_t msg_sent; 126 atomic_t msg_recv; 127 atomic_t pendings; 128 int transport; 129 void (*sk_txnotify)(struct sk_buff *skb, 130 enum iucv_tx_notify n); 131 }; 132 133 struct iucv_skb_cb { 134 u32 class; /* target class of message */ 135 u32 tag; /* tag associated with message */ 136 u32 offset; /* offset for skb receival */ 137 }; 138 139 #define IUCV_SKB_CB(__skb) ((struct iucv_skb_cb *)&((__skb)->cb[0])) 140 141 /* iucv socket options (SOL_IUCV) */ 142 #define SO_IPRMDATA_MSG 0x0080 /* send/recv IPRM_DATA msgs */ 143 #define SO_MSGLIMIT 0x1000 /* get/set IUCV MSGLIMIT */ 144 #define SO_MSGSIZE 0x0800 /* get maximum msgsize */ 145 146 /* iucv related control messages (scm) */ 147 #define SCM_IUCV_TRGCLS 0x0001 /* target class control message */ 148 149 struct iucv_sock_list { 150 struct hlist_head head; 151 rwlock_t lock; 152 atomic_t autobind_name; 153 }; 154 155 unsigned int iucv_sock_poll(struct file *file, struct socket *sock, 156 poll_table *wait); 157 void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); 158 void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); 159 void iucv_accept_enqueue(struct sock *parent, struct sock *sk); 160 void iucv_accept_unlink(struct sock *sk); 161 struct sock *iucv_accept_dequeue(struct sock *parent, struct socket *newsock); 162 163 #endif /* __IUCV_H */ 164