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