Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
0002 /**
0003  * file phonet.h
0004  *
0005  * Phonet sockets kernel interface
0006  *
0007  * Copyright (C) 2008 Nokia Corporation. All rights reserved.
0008  *
0009  * This program is free software; you can redistribute it and/or
0010  * modify it under the terms of the GNU General Public License
0011  * version 2 as published by the Free Software Foundation.
0012  *
0013  * This program is distributed in the hope that it will be useful, but
0014  * WITHOUT ANY WARRANTY; without even the implied warranty of
0015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0016  * General Public License for more details.
0017  *
0018  * You should have received a copy of the GNU General Public License
0019  * along with this program; if not, write to the Free Software
0020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
0021  * 02110-1301 USA
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 /* Automatic protocol selection */
0031 #define PN_PROTO_TRANSPORT  0
0032 /* Phonet datagram socket */
0033 #define PN_PROTO_PHONET     1
0034 /* Phonet pipe */
0035 #define PN_PROTO_PIPE       2
0036 #define PHONET_NPROTO       3
0037 
0038 /* Socket options for SOL_PNPIPE level */
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 /* Values for PNPIPE_ENCAP option */
0049 #define PNPIPE_ENCAP_NONE   0
0050 #define PNPIPE_ENCAP_IP     1
0051 
0052 /* ioctls */
0053 #define SIOCPNGETOBJECT     (SIOCPROTOPRIVATE + 0)
0054 #define SIOCPNENABLEPIPE    (SIOCPROTOPRIVATE + 13)
0055 #define SIOCPNADDRESOURCE   (SIOCPROTOPRIVATE + 14)
0056 #define SIOCPNDELRESOURCE   (SIOCPROTOPRIVATE + 15)
0057 
0058 /* Phonet protocol header */
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 /* Common Phonet payload header */
0069 struct phonetmsg {
0070     __u8    pn_trans_id;    /* transaction ID */
0071     __u8    pn_msg_id;  /* message type */
0072     union {
0073         struct {
0074             __u8    pn_submsg_id;   /* message subtype */
0075             __u8    pn_data[5];
0076         } base;
0077         struct {
0078             __u16   pn_e_res_id;    /* extended resource ID */
0079             __u8    pn_e_submsg_id; /* message subtype */
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 /* resource for extended messages */
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 /* data for unreachable errors */
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 /* Phonet socket address structure */
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 /* Well known address */
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 /* Phonet device ioctl requests */
0185 
0186 #endif /* _UAPILINUX_PHONET_H */