xref: /linux/include/uapi/linux/phonet.h (revision 607ca46e97a1b6594b29647d98a32d545c24bdff)
1*607ca46eSDavid Howells /**
2*607ca46eSDavid Howells  * file phonet.h
3*607ca46eSDavid Howells  *
4*607ca46eSDavid Howells  * Phonet sockets kernel interface
5*607ca46eSDavid Howells  *
6*607ca46eSDavid Howells  * Copyright (C) 2008 Nokia Corporation. All rights reserved.
7*607ca46eSDavid Howells  *
8*607ca46eSDavid Howells  * This program is free software; you can redistribute it and/or
9*607ca46eSDavid Howells  * modify it under the terms of the GNU General Public License
10*607ca46eSDavid Howells  * version 2 as published by the Free Software Foundation.
11*607ca46eSDavid Howells  *
12*607ca46eSDavid Howells  * This program is distributed in the hope that it will be useful, but
13*607ca46eSDavid Howells  * WITHOUT ANY WARRANTY; without even the implied warranty of
14*607ca46eSDavid Howells  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*607ca46eSDavid Howells  * General Public License for more details.
16*607ca46eSDavid Howells  *
17*607ca46eSDavid Howells  * You should have received a copy of the GNU General Public License
18*607ca46eSDavid Howells  * along with this program; if not, write to the Free Software
19*607ca46eSDavid Howells  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20*607ca46eSDavid Howells  * 02110-1301 USA
21*607ca46eSDavid Howells  */
22*607ca46eSDavid Howells 
23*607ca46eSDavid Howells #ifndef _UAPILINUX_PHONET_H
24*607ca46eSDavid Howells #define _UAPILINUX_PHONET_H
25*607ca46eSDavid Howells 
26*607ca46eSDavid Howells #include <linux/types.h>
27*607ca46eSDavid Howells #include <linux/socket.h>
28*607ca46eSDavid Howells 
29*607ca46eSDavid Howells /* Automatic protocol selection */
30*607ca46eSDavid Howells #define PN_PROTO_TRANSPORT	0
31*607ca46eSDavid Howells /* Phonet datagram socket */
32*607ca46eSDavid Howells #define PN_PROTO_PHONET		1
33*607ca46eSDavid Howells /* Phonet pipe */
34*607ca46eSDavid Howells #define PN_PROTO_PIPE		2
35*607ca46eSDavid Howells #define PHONET_NPROTO		3
36*607ca46eSDavid Howells 
37*607ca46eSDavid Howells /* Socket options for SOL_PNPIPE level */
38*607ca46eSDavid Howells #define PNPIPE_ENCAP		1
39*607ca46eSDavid Howells #define PNPIPE_IFINDEX		2
40*607ca46eSDavid Howells #define PNPIPE_HANDLE		3
41*607ca46eSDavid Howells #define PNPIPE_INITSTATE	4
42*607ca46eSDavid Howells 
43*607ca46eSDavid Howells #define PNADDR_ANY		0
44*607ca46eSDavid Howells #define PNADDR_BROADCAST	0xFC
45*607ca46eSDavid Howells #define PNPORT_RESOURCE_ROUTING	0
46*607ca46eSDavid Howells 
47*607ca46eSDavid Howells /* Values for PNPIPE_ENCAP option */
48*607ca46eSDavid Howells #define PNPIPE_ENCAP_NONE	0
49*607ca46eSDavid Howells #define PNPIPE_ENCAP_IP		1
50*607ca46eSDavid Howells 
51*607ca46eSDavid Howells /* ioctls */
52*607ca46eSDavid Howells #define SIOCPNGETOBJECT		(SIOCPROTOPRIVATE + 0)
53*607ca46eSDavid Howells #define SIOCPNENABLEPIPE	(SIOCPROTOPRIVATE + 13)
54*607ca46eSDavid Howells #define SIOCPNADDRESOURCE	(SIOCPROTOPRIVATE + 14)
55*607ca46eSDavid Howells #define SIOCPNDELRESOURCE	(SIOCPROTOPRIVATE + 15)
56*607ca46eSDavid Howells 
57*607ca46eSDavid Howells /* Phonet protocol header */
58*607ca46eSDavid Howells struct phonethdr {
59*607ca46eSDavid Howells 	__u8	pn_rdev;
60*607ca46eSDavid Howells 	__u8	pn_sdev;
61*607ca46eSDavid Howells 	__u8	pn_res;
62*607ca46eSDavid Howells 	__be16	pn_length;
63*607ca46eSDavid Howells 	__u8	pn_robj;
64*607ca46eSDavid Howells 	__u8	pn_sobj;
65*607ca46eSDavid Howells } __attribute__((packed));
66*607ca46eSDavid Howells 
67*607ca46eSDavid Howells /* Common Phonet payload header */
68*607ca46eSDavid Howells struct phonetmsg {
69*607ca46eSDavid Howells 	__u8	pn_trans_id;	/* transaction ID */
70*607ca46eSDavid Howells 	__u8	pn_msg_id;	/* message type */
71*607ca46eSDavid Howells 	union {
72*607ca46eSDavid Howells 		struct {
73*607ca46eSDavid Howells 			__u8	pn_submsg_id;	/* message subtype */
74*607ca46eSDavid Howells 			__u8	pn_data[5];
75*607ca46eSDavid Howells 		} base;
76*607ca46eSDavid Howells 		struct {
77*607ca46eSDavid Howells 			__u16	pn_e_res_id;	/* extended resource ID */
78*607ca46eSDavid Howells 			__u8	pn_e_submsg_id;	/* message subtype */
79*607ca46eSDavid Howells 			__u8	pn_e_data[3];
80*607ca46eSDavid Howells 		} ext;
81*607ca46eSDavid Howells 	} pn_msg_u;
82*607ca46eSDavid Howells };
83*607ca46eSDavid Howells #define PN_COMMON_MESSAGE	0xF0
84*607ca46eSDavid Howells #define PN_COMMGR		0x10
85*607ca46eSDavid Howells #define PN_PREFIX		0xE0 /* resource for extended messages */
86*607ca46eSDavid Howells #define pn_submsg_id		pn_msg_u.base.pn_submsg_id
87*607ca46eSDavid Howells #define pn_e_submsg_id		pn_msg_u.ext.pn_e_submsg_id
88*607ca46eSDavid Howells #define pn_e_res_id		pn_msg_u.ext.pn_e_res_id
89*607ca46eSDavid Howells #define pn_data			pn_msg_u.base.pn_data
90*607ca46eSDavid Howells #define pn_e_data		pn_msg_u.ext.pn_e_data
91*607ca46eSDavid Howells 
92*607ca46eSDavid Howells /* data for unreachable errors */
93*607ca46eSDavid Howells #define PN_COMM_SERVICE_NOT_IDENTIFIED_RESP	0x01
94*607ca46eSDavid Howells #define PN_COMM_ISA_ENTITY_NOT_REACHABLE_RESP	0x14
95*607ca46eSDavid Howells #define pn_orig_msg_id		pn_data[0]
96*607ca46eSDavid Howells #define pn_status		pn_data[1]
97*607ca46eSDavid Howells #define pn_e_orig_msg_id	pn_e_data[0]
98*607ca46eSDavid Howells #define pn_e_status		pn_e_data[1]
99*607ca46eSDavid Howells 
100*607ca46eSDavid Howells /* Phonet socket address structure */
101*607ca46eSDavid Howells struct sockaddr_pn {
102*607ca46eSDavid Howells 	__kernel_sa_family_t spn_family;
103*607ca46eSDavid Howells 	__u8 spn_obj;
104*607ca46eSDavid Howells 	__u8 spn_dev;
105*607ca46eSDavid Howells 	__u8 spn_resource;
106*607ca46eSDavid Howells 	__u8 spn_zero[sizeof(struct sockaddr) - sizeof(__kernel_sa_family_t) - 3];
107*607ca46eSDavid Howells } __attribute__((packed));
108*607ca46eSDavid Howells 
109*607ca46eSDavid Howells /* Well known address */
110*607ca46eSDavid Howells #define PN_DEV_PC	0x10
111*607ca46eSDavid Howells 
112*607ca46eSDavid Howells static inline __u16 pn_object(__u8 addr, __u16 port)
113*607ca46eSDavid Howells {
114*607ca46eSDavid Howells 	return (addr << 8) | (port & 0x3ff);
115*607ca46eSDavid Howells }
116*607ca46eSDavid Howells 
117*607ca46eSDavid Howells static inline __u8 pn_obj(__u16 handle)
118*607ca46eSDavid Howells {
119*607ca46eSDavid Howells 	return handle & 0xff;
120*607ca46eSDavid Howells }
121*607ca46eSDavid Howells 
122*607ca46eSDavid Howells static inline __u8 pn_dev(__u16 handle)
123*607ca46eSDavid Howells {
124*607ca46eSDavid Howells 	return handle >> 8;
125*607ca46eSDavid Howells }
126*607ca46eSDavid Howells 
127*607ca46eSDavid Howells static inline __u16 pn_port(__u16 handle)
128*607ca46eSDavid Howells {
129*607ca46eSDavid Howells 	return handle & 0x3ff;
130*607ca46eSDavid Howells }
131*607ca46eSDavid Howells 
132*607ca46eSDavid Howells static inline __u8 pn_addr(__u16 handle)
133*607ca46eSDavid Howells {
134*607ca46eSDavid Howells 	return (handle >> 8) & 0xfc;
135*607ca46eSDavid Howells }
136*607ca46eSDavid Howells 
137*607ca46eSDavid Howells static inline void pn_sockaddr_set_addr(struct sockaddr_pn *spn, __u8 addr)
138*607ca46eSDavid Howells {
139*607ca46eSDavid Howells 	spn->spn_dev &= 0x03;
140*607ca46eSDavid Howells 	spn->spn_dev |= addr & 0xfc;
141*607ca46eSDavid Howells }
142*607ca46eSDavid Howells 
143*607ca46eSDavid Howells static inline void pn_sockaddr_set_port(struct sockaddr_pn *spn, __u16 port)
144*607ca46eSDavid Howells {
145*607ca46eSDavid Howells 	spn->spn_dev &= 0xfc;
146*607ca46eSDavid Howells 	spn->spn_dev |= (port >> 8) & 0x03;
147*607ca46eSDavid Howells 	spn->spn_obj = port & 0xff;
148*607ca46eSDavid Howells }
149*607ca46eSDavid Howells 
150*607ca46eSDavid Howells static inline void pn_sockaddr_set_object(struct sockaddr_pn *spn,
151*607ca46eSDavid Howells 						__u16 handle)
152*607ca46eSDavid Howells {
153*607ca46eSDavid Howells 	spn->spn_dev = pn_dev(handle);
154*607ca46eSDavid Howells 	spn->spn_obj = pn_obj(handle);
155*607ca46eSDavid Howells }
156*607ca46eSDavid Howells 
157*607ca46eSDavid Howells static inline void pn_sockaddr_set_resource(struct sockaddr_pn *spn,
158*607ca46eSDavid Howells 						__u8 resource)
159*607ca46eSDavid Howells {
160*607ca46eSDavid Howells 	spn->spn_resource = resource;
161*607ca46eSDavid Howells }
162*607ca46eSDavid Howells 
163*607ca46eSDavid Howells static inline __u8 pn_sockaddr_get_addr(const struct sockaddr_pn *spn)
164*607ca46eSDavid Howells {
165*607ca46eSDavid Howells 	return spn->spn_dev & 0xfc;
166*607ca46eSDavid Howells }
167*607ca46eSDavid Howells 
168*607ca46eSDavid Howells static inline __u16 pn_sockaddr_get_port(const struct sockaddr_pn *spn)
169*607ca46eSDavid Howells {
170*607ca46eSDavid Howells 	return ((spn->spn_dev & 0x03) << 8) | spn->spn_obj;
171*607ca46eSDavid Howells }
172*607ca46eSDavid Howells 
173*607ca46eSDavid Howells static inline __u16 pn_sockaddr_get_object(const struct sockaddr_pn *spn)
174*607ca46eSDavid Howells {
175*607ca46eSDavid Howells 	return pn_object(spn->spn_dev, spn->spn_obj);
176*607ca46eSDavid Howells }
177*607ca46eSDavid Howells 
178*607ca46eSDavid Howells static inline __u8 pn_sockaddr_get_resource(const struct sockaddr_pn *spn)
179*607ca46eSDavid Howells {
180*607ca46eSDavid Howells 	return spn->spn_resource;
181*607ca46eSDavid Howells }
182*607ca46eSDavid Howells 
183*607ca46eSDavid Howells /* Phonet device ioctl requests */
184*607ca46eSDavid Howells 
185*607ca46eSDavid Howells #endif /* _UAPILINUX_PHONET_H */
186