linux/include/net/iucv/af_iucv.h
<<
>>
Prefs
   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