0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #ifndef _UAPILINUX_PHONET_H
0025 #define _UAPILINUX_PHONET_H
0026
0027 #include <linux/types.h>
0028 #include <linux/socket.h>
0029
0030
0031 #define PN_PROTO_TRANSPORT 0
0032
0033 #define PN_PROTO_PHONET 1
0034
0035 #define PN_PROTO_PIPE 2
0036 #define PHONET_NPROTO 3
0037
0038
0039 #define PNPIPE_ENCAP 1
0040 #define PNPIPE_IFINDEX 2
0041 #define PNPIPE_HANDLE 3
0042 #define PNPIPE_INITSTATE 4
0043
0044 #define PNADDR_ANY 0
0045 #define PNADDR_BROADCAST 0xFC
0046 #define PNPORT_RESOURCE_ROUTING 0
0047
0048
0049 #define PNPIPE_ENCAP_NONE 0
0050 #define PNPIPE_ENCAP_IP 1
0051
0052
0053 #define SIOCPNGETOBJECT (SIOCPROTOPRIVATE + 0)
0054 #define SIOCPNENABLEPIPE (SIOCPROTOPRIVATE + 13)
0055 #define SIOCPNADDRESOURCE (SIOCPROTOPRIVATE + 14)
0056 #define SIOCPNDELRESOURCE (SIOCPROTOPRIVATE + 15)
0057
0058
0059 struct phonethdr {
0060 __u8 pn_rdev;
0061 __u8 pn_sdev;
0062 __u8 pn_res;
0063 __be16 pn_length;
0064 __u8 pn_robj;
0065 __u8 pn_sobj;
0066 } __attribute__((packed));
0067
0068
0069 struct phonetmsg {
0070 __u8 pn_trans_id;
0071 __u8 pn_msg_id;
0072 union {
0073 struct {
0074 __u8 pn_submsg_id;
0075 __u8 pn_data[5];
0076 } base;
0077 struct {
0078 __u16 pn_e_res_id;
0079 __u8 pn_e_submsg_id;
0080 __u8 pn_e_data[3];
0081 } ext;
0082 } pn_msg_u;
0083 };
0084 #define PN_COMMON_MESSAGE 0xF0
0085 #define PN_COMMGR 0x10
0086 #define PN_PREFIX 0xE0
0087 #define pn_submsg_id pn_msg_u.base.pn_submsg_id
0088 #define pn_e_submsg_id pn_msg_u.ext.pn_e_submsg_id
0089 #define pn_e_res_id pn_msg_u.ext.pn_e_res_id
0090 #define pn_data pn_msg_u.base.pn_data
0091 #define pn_e_data pn_msg_u.ext.pn_e_data
0092
0093
0094 #define PN_COMM_SERVICE_NOT_IDENTIFIED_RESP 0x01
0095 #define PN_COMM_ISA_ENTITY_NOT_REACHABLE_RESP 0x14
0096 #define pn_orig_msg_id pn_data[0]
0097 #define pn_status pn_data[1]
0098 #define pn_e_orig_msg_id pn_e_data[0]
0099 #define pn_e_status pn_e_data[1]
0100
0101
0102 struct sockaddr_pn {
0103 __kernel_sa_family_t spn_family;
0104 __u8 spn_obj;
0105 __u8 spn_dev;
0106 __u8 spn_resource;
0107 __u8 spn_zero[sizeof(struct sockaddr) - sizeof(__kernel_sa_family_t) - 3];
0108 } __attribute__((packed));
0109
0110
0111 #define PN_DEV_PC 0x10
0112
0113 static inline __u16 pn_object(__u8 addr, __u16 port)
0114 {
0115 return (addr << 8) | (port & 0x3ff);
0116 }
0117
0118 static inline __u8 pn_obj(__u16 handle)
0119 {
0120 return handle & 0xff;
0121 }
0122
0123 static inline __u8 pn_dev(__u16 handle)
0124 {
0125 return handle >> 8;
0126 }
0127
0128 static inline __u16 pn_port(__u16 handle)
0129 {
0130 return handle & 0x3ff;
0131 }
0132
0133 static inline __u8 pn_addr(__u16 handle)
0134 {
0135 return (handle >> 8) & 0xfc;
0136 }
0137
0138 static inline void pn_sockaddr_set_addr(struct sockaddr_pn *spn, __u8 addr)
0139 {
0140 spn->spn_dev &= 0x03;
0141 spn->spn_dev |= addr & 0xfc;
0142 }
0143
0144 static inline void pn_sockaddr_set_port(struct sockaddr_pn *spn, __u16 port)
0145 {
0146 spn->spn_dev &= 0xfc;
0147 spn->spn_dev |= (port >> 8) & 0x03;
0148 spn->spn_obj = port & 0xff;
0149 }
0150
0151 static inline void pn_sockaddr_set_object(struct sockaddr_pn *spn,
0152 __u16 handle)
0153 {
0154 spn->spn_dev = pn_dev(handle);
0155 spn->spn_obj = pn_obj(handle);
0156 }
0157
0158 static inline void pn_sockaddr_set_resource(struct sockaddr_pn *spn,
0159 __u8 resource)
0160 {
0161 spn->spn_resource = resource;
0162 }
0163
0164 static inline __u8 pn_sockaddr_get_addr(const struct sockaddr_pn *spn)
0165 {
0166 return spn->spn_dev & 0xfc;
0167 }
0168
0169 static inline __u16 pn_sockaddr_get_port(const struct sockaddr_pn *spn)
0170 {
0171 return ((spn->spn_dev & 0x03) << 8) | spn->spn_obj;
0172 }
0173
0174 static inline __u16 pn_sockaddr_get_object(const struct sockaddr_pn *spn)
0175 {
0176 return pn_object(spn->spn_dev, spn->spn_obj);
0177 }
0178
0179 static inline __u8 pn_sockaddr_get_resource(const struct sockaddr_pn *spn)
0180 {
0181 return spn->spn_resource;
0182 }
0183
0184
0185
0186 #endif