summaryrefslogtreecommitdiffstats
path: root/drivers/stemodem/caif_socket.h
blob: 424c30134599f53166f176b901895d8ec67b886b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* linux/caif_socket.h
 * CAIF Definitions for CAIF socket and network layer
 * Copyright (C) ST-Ericsson AB 2009
 * Author:	 Sjur Brendeland/ sjur.brandeland@stericsson.com
 * License terms: GNU General Public License (GPL) version 2
 */

#ifndef _LINUX_CAIF_SOCKET_H
#define _LINUX_CAIF_SOCKET_H

#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/socket.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif
#ifndef AF_CAIF
#define AF_CAIF    37          /* CAIF Socket Address Family */
#endif
#ifndef PF_CAIF
#define PF_CAIF    AF_CAIF      /* CAIF Socket Protocol Family */
#endif
#ifndef SOL_CAIF
#define SOL_CAIF   278		/* CAIF Socket Option Level */
#endif

/**
 * enum caif_link_selector -   Physical Link Selection.
 * @CAIF_LINK_HIGH_BANDW:	Default physical interface for high-bandwidth
 *				traffic.
 * @CAIF_LINK_LOW_LATENCY:	Default physical interface for low-latency
 *				traffic.
 */
enum caif_link_selector {
	CAIF_LINK_HIGH_BANDW,
	CAIF_LINK_LOW_LATENCY
};

/**
 * enum caif_protocol_type  -	Types of CAIF protocols in the CAIF Stack.
 * @CAIFPROTO_AT:		Classic AT channel.
 * @CAIFPROTO_DATAGRAM:		Datagram channel.
 * @CAIFPROTO_DATAGRAM_LOOP:	Datagram loopback channel, used for testing.
 * @CAIFPROTO_UTIL:		Utility (Psock) channel.
 * @CAIFPROTO_RFM:		Remote File Manager
 */
enum caif_protocol_type {
	CAIFPROTO_AT,
	CAIFPROTO_DATAGRAM,
	CAIFPROTO_DATAGRAM_LOOP,
	CAIFPROTO_UTIL,
	CAIFPROTO_RFM,
	_CAIFPROTO_MAX
};
#define	CAIFPROTO_MAX _CAIFPROTO_MAX

/**
 * enum caif_at_type - AT Service Endpoint
 * @CAIF_ATTYPE_PLAIN:	     Connects to a plain vanilla AT channel.
 */
enum caif_at_type {
	CAIF_ATTYPE_PLAIN
};

/**
 * struct sockaddr_caif - the sockaddr structure for CAIF sockets.
 * @family:		     Address family number, must be AF_CAIF.
 * @u:			     Union of address data 'switched' by familty.
 * @at:			     Applies when family = CAIFPROTO_AT.
 * @at.type:		     Type of AT link to set up (enum caif_at_type).
 * @util:		     Applies when family = CAIFPROTO_UTIL
 * @util.service:	     Service name.
 * @dgm:		     Applies when family = CAIFPROTO_DATAGRAM
 * @dgm.connection_id:	     Datagram connection id.
 * @dgm.nsapi:		     NSAPI of the PDP-Context.
 * @rfm:		     Applies when family = CAIFPROTO_RFM
 * @rfm.connection_id:       Connection ID for RFM.
 * @rfm.volume:	     	     Volume to mount.
 */
struct sockaddr_caif {
	sa_family_t  family;
	union {
		struct {
			u_int8_t  type;		/* type: enum caif_at_type */
		} at;				/* CAIFPROTO_AT */
		struct {
			char	  service[16];
		} util;				/* CAIFPROTO_UTIL */
		union {
			u_int32_t connection_id;
			u_int8_t  nsapi;
		} dgm;				/* CAIFPROTO_DATAGRAM(_LOOP)*/
		struct {
			u_int32_t connection_id;
			char	  volume[16];
		} rfm;				/* CAIFPROTO_RFM */
	} u;
};

/**
 * struct caif_channel_opt - CAIF channel connect options.
 * @priority:		Priority of the channel (between 0 and 0x1f)
 * @link_selector:	Selector for the physical link.
 *			(see enum caif_phy_preference in caif_config.h)
 * @link_name:		Physical link to use. This is the instance name of the
 *			CAIF Physical Driver.
 */
struct caif_channel_opt {
	u_int16_t  priority;
	u_int16_t  link_selector;
	char	   link_name[16];
};

/**
 * struct caif_param - CAIF parameters.
 * @size:	Length of data
 * @data:	Binary Data Blob
 */
struct caif_param {
	u_int16_t  size;
	u_int8_t   data[256];
};


/** enum caif_socket_opts - CAIF option values for getsockopt and setsockopt
 * @CAIFSO_CHANNEL:		Used to set the connect options on a CAIF
 *				socket. (struct caif_config_opt). This can only
 *				be set before connecting.
 * @CAIFSO_REQ_PARAM:		Used to set the request parameters for a
 *				utility channel. (struct caif_param). This
 *				can only be set before connecting.
 *
 * @CAIFSO_RSP_PARAM:		Gets the request parameters for a utility
 *				channel. (struct caif_param). This can only be
 *				fetched after connecting the socket.
 *
 * @CAIFSO_UTIL_FLOW:		Sets the utility channels flow options.
 *				This can only be set before connecting.
 *				(struct caif_util_modem_flow_opt)
 *
 * @CAIFSO_CONN_ID:		Gets the channel id on a CAIF Channel.
 *				This can only be done after connect.
 *				( u_int32_t)
 *
 * @CAIFSO_NEXT_PAKCET_LEN:	Gets the size of next received packet.
 *				Value is 0 if no packet is available.
 *				This can only be done after connect.
 *				( u_int32_t)
 *
 * @CAIFSO_MAX_PAKCET_LEN:	Gets the maximum packet size for this
 *				connection. ( u_int32_t)
 */
enum caif_socket_opts {
	CAIFSO_CHANNEL_CONFIG	= 127,
	CAIFSO_REQ_PARAM	= 128,
	CAIFSO_RSP_PARAM	= 129,
	CAIFSO_UTIL_FLOW	= 130,
	CAIFSO_CONN_ID		= 131,
	CAIFSO_NEXT_PACKET_LEN	= 132,
	CAIFSO_MAX_PACKET_LEN	= 133,
};

#ifdef __cplusplus
}				/* extern "C" */
#endif
#endif /* _LINUX_CAIF_SOCKET_H */