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 */ 25enum { 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 */ 43struct 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 */ 54struct 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 67struct 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 82enum 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 107struct 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 133struct 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 149struct iucv_sock_list { 150 struct hlist_head head; 151 rwlock_t lock; 152 atomic_t autobind_name; 153}; 154 155unsigned int iucv_sock_poll(struct file *file, struct socket *sock, 156 poll_table *wait); 157void iucv_sock_link(struct iucv_sock_list *l, struct sock *s); 158void iucv_sock_unlink(struct iucv_sock_list *l, struct sock *s); 159void iucv_accept_enqueue(struct sock *parent, struct sock *sk); 160void iucv_accept_unlink(struct sock *sk); 161struct sock *iucv_accept_dequeue(struct sock *parent, struct socket *newsock); 162 163#endif /* __IUCV_H */ 164