xref: /netbsd-src/sys/dev/usb/if_umbreg.h (revision dd4b336babcd7e8780c1c620a5e1e3643b9ef054)
1 /*	$NetBSD: if_umbreg.h,v 1.2 2020/03/21 06:54:32 skrll Exp $ */
2 /*	$OpenBSD: if_umb.h,v 1.4 2017/04/18 13:27:55 gerhard Exp $ */
3 
4 /*
5  * Copyright (c) 2016 genua mbH
6  * All rights reserved.
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 /*
22  * Mobile Broadband Interface Model
23  * http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
24  */
25 #ifndef _IF_UMBREG_H_
26 #define _IF_UMBREG_H_
27 
28 struct umb_valdescr {
29 	int		 val;
30 	char const	*descr;
31 };
32 
33 static const char *
umb_val2descr(const struct umb_valdescr * vdp,int val)34 umb_val2descr(const struct umb_valdescr *vdp, int val)
35 {
36 	static char sval[32];
37 
38 	while (vdp->descr != NULL) {
39 		if (vdp->val == val)
40 			return vdp->descr;
41 		vdp++;
42 	}
43 	snprintf(sval, sizeof(sval), "#%d", val);
44 	return sval;
45 }
46 
47 #define MBIM_REGSTATE_DESCRIPTIONS {				\
48 	{ MBIM_REGSTATE_UNKNOWN,	"unknown" },		\
49 	{ MBIM_REGSTATE_DEREGISTERED,	"not registered" },	\
50 	{ MBIM_REGSTATE_SEARCHING,	"searching" },		\
51 	{ MBIM_REGSTATE_HOME,		"home network" },	\
52 	{ MBIM_REGSTATE_ROAMING,	"roaming network" },	\
53 	{ MBIM_REGSTATE_PARTNER,	"partner network" },	\
54 	{ MBIM_REGSTATE_DENIED,		"access denied" },	\
55 	{ 0, NULL } }
56 
57 #define MBIM_DATACLASS_DESCRIPTIONS {					\
58 	{ MBIM_DATACLASS_NONE,				"none" },	\
59 	{ MBIM_DATACLASS_GPRS,				"GPRS" },	\
60 	{ MBIM_DATACLASS_EDGE,				"EDGE" },	\
61 	{ MBIM_DATACLASS_UMTS,				"UMTS" },	\
62 	{ MBIM_DATACLASS_HSDPA,				"HSDPA" },	\
63 	{ MBIM_DATACLASS_HSUPA,				"HSUPA" },	\
64 	{ MBIM_DATACLASS_HSDPA|MBIM_DATACLASS_HSUPA,	"HSPA" },	\
65 	{ MBIM_DATACLASS_LTE,				"LTE" },	\
66 	{ MBIM_DATACLASS_1XRTT,				"CDMA2000" },	\
67 	{ MBIM_DATACLASS_1XEVDO,			"CDMA2000" },	\
68 	{ MBIM_DATACLASS_1XEVDO_REV_A,			"CDMA2000" },	\
69 	{ MBIM_DATACLASS_1XEVDV,			"CDMA2000" },	\
70 	{ MBIM_DATACLASS_3XRTT,				"CDMA2000" },	\
71 	{ MBIM_DATACLASS_1XEVDO_REV_B,			"CDMA2000" },	\
72 	{ MBIM_DATACLASS_UMB,				"CDMA2000" },	\
73 	{ MBIM_DATACLASS_CUSTOM,			"custom" },	\
74 	{ 0, NULL } }
75 
76 #define MBIM_1TO1_DESCRIPTION(m)	{ (m), #m }
77 #define MBIM_MESSAGES_DESCRIPTIONS {				\
78 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_MSG),			\
79 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_MSG),			\
80 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_MSG),		\
81 	MBIM_1TO1_DESCRIPTION(MBIM_HOST_ERROR_MSG),		\
82 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_DONE),			\
83 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_DONE),			\
84 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_DONE),		\
85 	MBIM_1TO1_DESCRIPTION(MBIM_FUNCTION_ERROR_MSG),		\
86 	MBIM_1TO1_DESCRIPTION(MBIM_INDICATE_STATUS_MSG),	\
87 	{ 0, NULL } }
88 
89 #define MBIM_STATUS_DESCRIPTION(m)	{ MBIM_STATUS_ ## m, #m }
90 #define MBIM_STATUS_DESCRIPTIONS {					\
91 	MBIM_STATUS_DESCRIPTION(SUCCESS),				\
92 	MBIM_STATUS_DESCRIPTION(BUSY),					\
93 	MBIM_STATUS_DESCRIPTION(FAILURE),				\
94 	MBIM_STATUS_DESCRIPTION(SIM_NOT_INSERTED),			\
95 	MBIM_STATUS_DESCRIPTION(BAD_SIM),				\
96 	MBIM_STATUS_DESCRIPTION(PIN_REQUIRED),				\
97 	MBIM_STATUS_DESCRIPTION(PIN_DISABLED),				\
98 	MBIM_STATUS_DESCRIPTION(NOT_REGISTERED),			\
99 	MBIM_STATUS_DESCRIPTION(PROVIDERS_NOT_FOUND),			\
100 	MBIM_STATUS_DESCRIPTION(NO_DEVICE_SUPPORT),			\
101 	MBIM_STATUS_DESCRIPTION(PROVIDER_NOT_VISIBLE),			\
102 	MBIM_STATUS_DESCRIPTION(DATA_CLASS_NOT_AVAILABLE),		\
103 	MBIM_STATUS_DESCRIPTION(PACKET_SERVICE_DETACHED),		\
104 	MBIM_STATUS_DESCRIPTION(MAX_ACTIVATED_CONTEXTS),		\
105 	MBIM_STATUS_DESCRIPTION(NOT_INITIALIZED),			\
106 	MBIM_STATUS_DESCRIPTION(VOICE_CALL_IN_PROGRESS),		\
107 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_ACTIVATED),			\
108 	MBIM_STATUS_DESCRIPTION(SERVICE_NOT_ACTIVATED),			\
109 	MBIM_STATUS_DESCRIPTION(INVALID_ACCESS_STRING),			\
110 	MBIM_STATUS_DESCRIPTION(INVALID_USER_NAME_PWD),			\
111 	MBIM_STATUS_DESCRIPTION(RADIO_POWER_OFF),			\
112 	MBIM_STATUS_DESCRIPTION(INVALID_PARAMETERS),			\
113 	MBIM_STATUS_DESCRIPTION(READ_FAILURE),				\
114 	MBIM_STATUS_DESCRIPTION(WRITE_FAILURE),				\
115 	MBIM_STATUS_DESCRIPTION(NO_PHONEBOOK),				\
116 	MBIM_STATUS_DESCRIPTION(PARAMETER_TOO_LONG),			\
117 	MBIM_STATUS_DESCRIPTION(STK_BUSY),				\
118 	MBIM_STATUS_DESCRIPTION(OPERATION_NOT_ALLOWED),			\
119 	MBIM_STATUS_DESCRIPTION(MEMORY_FAILURE),			\
120 	MBIM_STATUS_DESCRIPTION(INVALID_MEMORY_INDEX),			\
121 	MBIM_STATUS_DESCRIPTION(MEMORY_FULL),				\
122 	MBIM_STATUS_DESCRIPTION(FILTER_NOT_SUPPORTED),			\
123 	MBIM_STATUS_DESCRIPTION(DSS_INSTANCE_LIMIT),			\
124 	MBIM_STATUS_DESCRIPTION(INVALID_DEVICE_SERVICE_OPERATION),	\
125 	MBIM_STATUS_DESCRIPTION(AUTH_INCORRECT_AUTN),			\
126 	MBIM_STATUS_DESCRIPTION(AUTH_SYNC_FAILURE),			\
127 	MBIM_STATUS_DESCRIPTION(AUTH_AMF_NOT_SET),			\
128 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_SUPPORTED),			\
129 	MBIM_STATUS_DESCRIPTION(SMS_UNKNOWN_SMSC_ADDRESS),		\
130 	MBIM_STATUS_DESCRIPTION(SMS_NETWORK_TIMEOUT),			\
131 	MBIM_STATUS_DESCRIPTION(SMS_LANG_NOT_SUPPORTED),		\
132 	MBIM_STATUS_DESCRIPTION(SMS_ENCODING_NOT_SUPPORTED),		\
133 	MBIM_STATUS_DESCRIPTION(SMS_FORMAT_NOT_SUPPORTED),		\
134 	{ 0, NULL } }
135 
136 #define MBIM_ERROR_DESCRIPTION(m)	{ MBIM_ERROR_ ## m, #m }
137 #define MBIM_ERROR_DESCRIPTIONS {					\
138 	MBIM_ERROR_DESCRIPTION(TIMEOUT_FRAGMENT),			\
139 	MBIM_ERROR_DESCRIPTION(FRAGMENT_OUT_OF_SEQUENCE),		\
140 	MBIM_ERROR_DESCRIPTION(LENGTH_MISMATCH),			\
141 	MBIM_ERROR_DESCRIPTION(DUPLICATED_TID),				\
142 	MBIM_ERROR_DESCRIPTION(NOT_OPENED),				\
143 	MBIM_ERROR_DESCRIPTION(UNKNOWN),				\
144 	MBIM_ERROR_DESCRIPTION(CANCEL),					\
145 	MBIM_ERROR_DESCRIPTION(MAX_TRANSFER),				\
146 	{ 0, NULL } }
147 
148 #define MBIM_CID_DESCRIPTIONS {						\
149 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_CAPS),			\
150 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SUBSCRIBER_READY_STATUS),	\
151 	MBIM_1TO1_DESCRIPTION(MBIM_CID_RADIO_STATE),			\
152 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN),				\
153 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN_LIST),			\
154 	MBIM_1TO1_DESCRIPTION(MBIM_CID_HOME_PROVIDER),			\
155 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PREFERRED_PROVIDERS),		\
156 	MBIM_1TO1_DESCRIPTION(MBIM_CID_VISIBLE_PROVIDERS),		\
157 	MBIM_1TO1_DESCRIPTION(MBIM_CID_REGISTER_STATE),			\
158 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_SERVICE),			\
159 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SIGNAL_STATE),			\
160 	MBIM_1TO1_DESCRIPTION(MBIM_CID_CONNECT),			\
161 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PROVISIONED_CONTEXTS),		\
162 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SERVICE_ACTIVATION),		\
163 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_CONFIGURATION),		\
164 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICES),		\
165 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST),	\
166 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_STATISTICS),		\
167 	MBIM_1TO1_DESCRIPTION(MBIM_CID_NETWORK_IDLE_HINT),		\
168 	MBIM_1TO1_DESCRIPTION(MBIM_CID_EMERGENCY_MODE),			\
169 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_PACKET_FILTERS),		\
170 	MBIM_1TO1_DESCRIPTION(MBIM_CID_MULTICARRIER_PROVIDERS),		\
171 	{ 0, NULL } }
172 
173 #define MBIM_SIMSTATE_DESCRIPTIONS {					\
174 	{ MBIM_SIMSTATE_NOTINITIALIZED, "not initialized" },		\
175 	{ MBIM_SIMSTATE_INITIALIZED, "initialized" },			\
176 	{ MBIM_SIMSTATE_NOTINSERTED, "not inserted" },			\
177 	{ MBIM_SIMSTATE_BADSIM, "bad type" },				\
178 	{ MBIM_SIMSTATE_FAILURE, "failed" },				\
179 	{ MBIM_SIMSTATE_NOTACTIVATED, "not activated" },		\
180 	{ MBIM_SIMSTATE_LOCKED, "locked" },				\
181 	{ 0, NULL } }
182 
183 #define MBIM_PINTYPE_DESCRIPTIONS {					\
184 	{ MBIM_PIN_TYPE_NONE, "none" },					\
185 	{ MBIM_PIN_TYPE_CUSTOM, "custom" },				\
186 	{ MBIM_PIN_TYPE_PIN1, "PIN1" },					\
187 	{ MBIM_PIN_TYPE_PIN2, "PIN2" },					\
188 	{ MBIM_PIN_TYPE_DEV_SIM_PIN, "device PIN" },			\
189 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN, "device 1st PIN" },		\
190 	{ MBIM_PIN_TYPE_NETWORK_PIN, "network PIN" },			\
191 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PIN, "network subset PIN" },	\
192 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN, "provider PIN" },		\
193 	{ MBIM_PIN_TYPE_CORPORATE_PIN, "corporate PIN" },		\
194 	{ MBIM_PIN_TYPE_SUBSIDY_LOCK, "subsidy lock" },			\
195 	{ MBIM_PIN_TYPE_PUK1, "PUK" },					\
196 	{ MBIM_PIN_TYPE_PUK2, "PUK2" },					\
197 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK, "device 1st PUK" },		\
198 	{ MBIM_PIN_TYPE_NETWORK_PUK, "network PUK" },			\
199 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PUK, "network subset PUK" },	\
200 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK, "provider PUK" },		\
201 	{ MBIM_PIN_TYPE_CORPORATE_PUK, "corporate PUK" },		\
202 	{ 0, NULL } }
203 
204 #define MBIM_PKTSRV_STATE_DESCRIPTIONS {				\
205 	{ MBIM_PKTSERVICE_STATE_UNKNOWN, "unknown" },			\
206 	{ MBIM_PKTSERVICE_STATE_ATTACHING, "attaching" },		\
207 	{ MBIM_PKTSERVICE_STATE_ATTACHED, "attached" },			\
208 	{ MBIM_PKTSERVICE_STATE_DETACHING, "detaching" },		\
209 	{ MBIM_PKTSERVICE_STATE_DETACHED, "detached" },			\
210 	{ 0, NULL } }
211 
212 #define MBIM_ACTIVATION_STATE_DESCRIPTIONS {				\
213 	{ MBIM_ACTIVATION_STATE_UNKNOWN, "unknown" },			\
214 	{ MBIM_ACTIVATION_STATE_ACTIVATED, "activated" },		\
215 	{ MBIM_ACTIVATION_STATE_ACTIVATING, "activating" },		\
216 	{ MBIM_ACTIVATION_STATE_DEACTIVATED, "deactivated" },		\
217 	{ MBIM_ACTIVATION_STATE_DEACTIVATING, "deactivating" },		\
218 	{ 0, NULL } }
219 
220 /*
221  * Driver internal state
222  */
223 enum umb_state {
224 	UMB_S_DOWN = 0,		/* interface down */
225 	UMB_S_OPEN,		/* MBIM device has been opened */
226 	UMB_S_CID,		/* QMI client id allocated */
227 	UMB_S_RADIO,		/* radio is on */
228 	UMB_S_SIMREADY,		/* SIM is ready */
229 	UMB_S_ATTACHED,		/* packet service is attached */
230 	UMB_S_CONNECTED,	/* connected to provider */
231 	UMB_S_UP,		/* have IP configuration */
232 };
233 
234 #define UMB_INTERNAL_STATE_DESCRIPTIONS {	\
235 	{ UMB_S_DOWN, "down" },			\
236 	{ UMB_S_OPEN, "open" },			\
237 	{ UMB_S_CID, "CID allocated" },		\
238 	{ UMB_S_RADIO, "radio on" },		\
239 	{ UMB_S_SIMREADY, "SIM is ready" },	\
240 	{ UMB_S_ATTACHED, "attached" },		\
241 	{ UMB_S_CONNECTED, "connected" },	\
242 	{ UMB_S_UP, "up" },			\
243 	{ 0, NULL } }
244 
245 /*
246  * UMB parameters (SIOC[GS]UMBPARAM ioctls)
247  */
248 struct umb_parameter {
249 	int			op;
250 	int			is_puk;
251 	uint16_t		pin[MBIM_PIN_MAXLEN];
252 	int			pinlen;
253 
254 	char			newpin[MBIM_PIN_MAXLEN];
255 	int			newpinlen;
256 
257 #define UMB_APN_MAXLEN		100
258 	uint16_t		apn[UMB_APN_MAXLEN];
259 	int			apnlen;
260 
261 #define UMB_USERNAME_MAXLEN	205
262 	uint16_t		username[UMB_USERNAME_MAXLEN];
263 	int			usernamelen;
264 
265 #define UMB_PASSWORD_MAXLEN	205
266 	uint16_t		password[UMB_PASSWORD_MAXLEN];
267 	int			passwordlen;
268 
269 	int			roaming;
270 	uint32_t		preferredclasses;
271 };
272 
273 /*
274  * UMB device status info (SIOCGUMBINFO ioctl)
275  */
276 struct umb_info {
277 	enum umb_state		state;
278 	int			enable_roaming;
279 #define UMB_PIN_REQUIRED	0
280 #define UMB_PIN_UNLOCKED	1
281 #define UMB_PUK_REQUIRED	2
282 	int			pin_state;
283 	int			pin_attempts_left;
284 	int			activation;
285 	int			sim_state;
286 	int			regstate;
287 	int			regmode;
288 	int			nwerror;
289 	int			packetstate;
290 	uint32_t		supportedclasses; /* what the hw supports */
291 	uint32_t		preferredclasses; /* what the user prefers */
292 	uint32_t		highestclass;	/* what the network offers */
293 	uint32_t		cellclass;
294 #define UMB_PROVIDERNAME_MAXLEN		20
295 	uint16_t		provider[UMB_PROVIDERNAME_MAXLEN];
296 #define UMB_PHONENR_MAXLEN		22
297 	uint16_t		pn[UMB_PHONENR_MAXLEN];
298 #define UMB_SUBSCRIBERID_MAXLEN		15
299 	uint16_t		sid[UMB_SUBSCRIBERID_MAXLEN];
300 #define UMB_ICCID_MAXLEN		20
301 	uint16_t		iccid[UMB_ICCID_MAXLEN];
302 #define UMB_ROAMINGTEXT_MAXLEN		63
303 	uint16_t		roamingtxt[UMB_ROAMINGTEXT_MAXLEN];
304 
305 #define UMB_DEVID_MAXLEN		18
306 	uint16_t		devid[UMB_DEVID_MAXLEN];
307 #define UMB_FWINFO_MAXLEN		30
308 	uint16_t		fwinfo[UMB_FWINFO_MAXLEN];
309 #define UMB_HWINFO_MAXLEN		30
310 	uint16_t		hwinfo[UMB_HWINFO_MAXLEN];
311 
312 	uint16_t		apn[UMB_APN_MAXLEN];
313 	int			apnlen;
314 
315 	uint16_t		username[UMB_USERNAME_MAXLEN];
316 	int			usernamelen;
317 
318 	uint16_t		password[UMB_PASSWORD_MAXLEN];
319 	int			passwordlen;
320 
321 #define UMB_VALUE_UNKNOWN	-999
322 	int			rssi;
323 #define UMB_BER_EXCELLENT	0
324 #define UMB_BER_VERYGOOD	1
325 #define UMB_BER_GOOD		2
326 #define UMB_BER_OK		3
327 #define UMB_BER_MEDIUM		4
328 #define UMB_BER_BAD		5
329 #define UMB_BER_VERYBAD		6
330 #define UMB_BER_EXTREMELYBAD	7
331 	int			ber;
332 
333 	int			hw_radio_on;
334 	int			sw_radio_on;
335 
336 	uint64_t		uplink_speed;
337 	uint64_t		downlink_speed;
338 
339 #define UMB_MAX_DNSSRV			2
340 	u_int32_t		ipv4dns[UMB_MAX_DNSSRV];
341 };
342 
343 #if !defined(ifr_mtu)
344 #define ifr_mtu	ifr_ifru.ifru_metric
345 #endif
346 
347 #ifdef _KERNEL
348 /*
349  * UMB device
350  */
351 struct umb_softc {
352 	device_t		 sc_dev;
353 	struct ifnet		 sc_if;
354 #define GET_IFP(sc)	(&(sc)->sc_if)
355 	struct ifmedia		 sc_im;
356 	krndsource_t		 sc_rnd_source;
357 	struct usbd_device	*sc_udev;
358 
359 	int			 sc_ver_maj;
360 	int			 sc_ver_min;
361 	int			 sc_ctrl_len;
362 	int			 sc_maxpktlen;
363 	int			 sc_maxsessions;
364 
365 #define UMBFLG_FCC_AUTH_REQUIRED	0x0001
366 	uint32_t		 sc_flags;
367 	int			 sc_cid;
368 
369 	struct usb_task		 sc_umb_task;
370 	struct usb_task		 sc_get_response_task;
371 	int			 sc_nresp;
372 	callout_t		 sc_statechg_timer;
373 	char			 sc_dying;
374 	char			 sc_attached;
375 
376 	uint8_t			 sc_ctrl_ifaceno;
377 	struct usbd_pipe	*sc_ctrl_pipe;
378 	usb_cdc_notification_t	 sc_intr_msg;
379 	struct usbd_interface	*sc_data_iface;
380 
381 	void			*sc_resp_buf;
382 	void			*sc_ctrl_msg;
383 
384 	int			 sc_rx_ep;
385 	struct usbd_xfer	*sc_rx_xfer;
386 	char			*sc_rx_buf;
387 	int			 sc_rx_bufsz;
388 	struct usbd_pipe	*sc_rx_pipe;
389 	unsigned		 sc_rx_nerr;
390 
391 	int			 sc_tx_ep;
392 	struct usbd_xfer	*sc_tx_xfer;
393 	char			*sc_tx_buf;
394 	int			 sc_tx_bufsz;
395 	struct usbd_pipe	*sc_tx_pipe;
396 	struct mbuf		*sc_tx_m;
397 	uint32_t		 sc_tx_seq;
398 
399 	uint32_t		 sc_tid;
400 
401 #define sc_state		sc_info.state
402 #define sc_roaming		sc_info.enable_roaming
403 	struct umb_info		sc_info;
404 };
405 #endif /* _KERNEL */
406 
407 #endif /* _IF_UMBREG_H_ */
408