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