2007-02-08 13:51:54 -08:00
/*
* Copyright 2006 IBM Corporation
* IUCV protocol stack for Linux on zSeries
* Version 1.0
* Author ( s ) : Jennifer Hunt < jenhunt @ us . ibm . com >
*
*/
# ifndef __AFIUCV_H
# define __AFIUCV_H
# include <asm/types.h>
# include <asm/byteorder.h>
# include <linux/list.h>
# include <linux/poll.h>
# include <linux/socket.h>
2011-08-08 01:33:54 +00:00
# include <net/iucv/iucv.h>
2007-02-08 13:51:54 -08:00
# ifndef AF_IUCV
# define AF_IUCV 32
# define PF_IUCV AF_IUCV
# endif
/* Connection and socket states */
enum {
IUCV_CONNECTED = 1 ,
IUCV_OPEN ,
IUCV_BOUND ,
IUCV_LISTEN ,
IUCV_DISCONN ,
2007-05-04 12:22:07 -07:00
IUCV_CLOSING ,
2007-02-08 13:51:54 -08:00
IUCV_CLOSED
} ;
# define IUCV_QUEUELEN_DEFAULT 65535
2011-08-08 01:33:54 +00:00
# define IUCV_HIPER_MSGLIM_DEFAULT 128
2007-02-08 13:51:54 -08:00
# define IUCV_CONN_TIMEOUT (HZ * 40)
# define IUCV_DISCONN_TIMEOUT (HZ * 2)
# define IUCV_CONN_IDLE_TIMEOUT (HZ * 60)
# define IUCV_BUFSIZE_DEFAULT 32768
/* IUCV socket address */
struct sockaddr_iucv {
sa_family_t siucv_family ;
unsigned short siucv_port ; /* Reserved */
unsigned int siucv_addr ; /* Reserved */
char siucv_nodeid [ 8 ] ; /* Reserved */
char siucv_user_id [ 8 ] ; /* Guest User Id */
char siucv_name [ 8 ] ; /* Application Name */
} ;
/* Common socket structures and functions */
2007-10-08 02:03:31 -07:00
struct sock_msg_q {
struct iucv_path * path ;
struct iucv_message msg ;
struct list_head list ;
spinlock_t lock ;
} ;
2007-02-08 13:51:54 -08:00
2011-08-08 01:33:54 +00:00
# define AF_IUCV_FLAG_ACK 0x1
# define AF_IUCV_FLAG_SYN 0x2
# define AF_IUCV_FLAG_FIN 0x4
# define AF_IUCV_FLAG_WIN 0x8
2012-03-07 02:06:24 +00:00
# define AF_IUCV_FLAG_SHT 0x10
2011-08-08 01:33:54 +00:00
struct af_iucv_trans_hdr {
u16 magic ;
u8 version ;
u8 flags ;
u16 window ;
char destNodeID [ 8 ] ;
char destUserID [ 8 ] ;
char destAppName [ 16 ] ;
char srcNodeID [ 8 ] ;
char srcUserID [ 8 ] ;
char srcAppName [ 16 ] ; /* => 70 bytes */
struct iucv_message iucv_hdr ; /* => 33 bytes */
u8 pad ; /* total 104 bytes */
} __packed ;
enum iucv_tx_notify {
/* transmission of skb is completed and was successful */
TX_NOTIFY_OK = 0 ,
/* target is unreachable */
TX_NOTIFY_UNREACHABLE = 1 ,
/* transfer pending queue full */
TX_NOTIFY_TPQFULL = 2 ,
/* general error */
TX_NOTIFY_GENERALERROR = 3 ,
/* transmission of skb is pending - may interleave
* with TX_NOTIFY_DELAYED_ * */
TX_NOTIFY_PENDING = 4 ,
/* transmission of skb was done successfully (delayed) */
TX_NOTIFY_DELAYED_OK = 5 ,
/* target unreachable (detected delayed) */
TX_NOTIFY_DELAYED_UNREACHABLE = 6 ,
/* general error (detected delayed) */
TX_NOTIFY_DELAYED_GENERALERROR = 7 ,
} ;
2007-02-08 13:51:54 -08:00
# define iucv_sk(__sk) ((struct iucv_sock *) __sk)
2011-08-08 01:33:54 +00:00
# define AF_IUCV_TRANS_IUCV 0
# define AF_IUCV_TRANS_HIPER 1
2007-02-08 13:51:54 -08:00
struct iucv_sock {
struct sock sk ;
char src_user_id [ 8 ] ;
char src_name [ 8 ] ;
char dst_user_id [ 8 ] ;
char dst_name [ 8 ] ;
struct list_head accept_q ;
2007-07-14 19:04:25 -07:00
spinlock_t accept_q_lock ;
2007-02-08 13:51:54 -08:00
struct sock * parent ;
struct iucv_path * path ;
2012-02-08 00:19:47 +00:00
struct net_device * hs_dev ;
2007-02-08 13:51:54 -08:00
struct sk_buff_head send_skb_q ;
2007-05-04 12:22:07 -07:00
struct sk_buff_head backlog_skb_q ;
2007-10-08 02:03:31 -07:00
struct sock_msg_q message_q ;
2007-02-08 13:51:54 -08:00
unsigned int send_tag ;
2009-04-21 23:26:22 +00:00
u8 flags ;
2009-04-21 23:26:27 +00:00
u16 msglimit ;
2011-08-08 01:33:54 +00:00
u16 msglimit_peer ;
atomic_t msg_sent ;
atomic_t msg_recv ;
atomic_t pendings ;
int transport ;
void ( * sk_txnotify ) ( struct sk_buff * skb ,
enum iucv_tx_notify n ) ;
2007-02-08 13:51:54 -08:00
} ;
2013-04-07 22:19:26 +00:00
struct iucv_skb_cb {
u32 class ; /* target class of message */
u32 tag ; /* tag associated with message */
u32 offset ; /* offset for skb receival */
} ;
# define IUCV_SKB_CB(__skb) ((struct iucv_skb_cb *)&((__skb)->cb[0]))
2009-04-21 23:26:22 +00:00
/* iucv socket options (SOL_IUCV) */
# define SO_IPRMDATA_MSG 0x0080 /* send/recv IPRM_DATA msgs */
2009-04-21 23:26:27 +00:00
# define SO_MSGLIMIT 0x1000 /* get/set IUCV MSGLIMIT */
2012-02-08 00:19:48 +00:00
# define SO_MSGSIZE 0x0800 /* get maximum msgsize */
2009-04-21 23:26:22 +00:00
2009-04-21 23:26:24 +00:00
/* iucv related control messages (scm) */
# define SCM_IUCV_TRGCLS 0x0001 /* target class control message */
2007-02-08 13:51:54 -08:00
struct iucv_sock_list {
struct hlist_head head ;
rwlock_t lock ;
atomic_t autobind_name ;
} ;
unsigned int iucv_sock_poll ( struct file * file , struct socket * sock ,
poll_table * wait ) ;
void iucv_sock_link ( struct iucv_sock_list * l , struct sock * s ) ;
void iucv_sock_unlink ( struct iucv_sock_list * l , struct sock * s ) ;
void iucv_accept_enqueue ( struct sock * parent , struct sock * sk ) ;
void iucv_accept_unlink ( struct sock * sk ) ;
struct sock * iucv_accept_dequeue ( struct sock * parent , struct socket * newsock ) ;
# endif /* __IUCV_H */