Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)    BlueZ - Bluetooth protocol stack for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)    Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)    This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)    it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)    published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)    SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #ifndef __SMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define __SMP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) struct smp_command_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	__u8	code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define SMP_CMD_PAIRING_REQ	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define SMP_CMD_PAIRING_RSP	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) struct smp_cmd_pairing {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	__u8	io_capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	__u8	oob_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	__u8	auth_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	__u8	max_key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	__u8	init_key_dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	__u8	resp_key_dist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define SMP_IO_DISPLAY_ONLY	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define SMP_IO_DISPLAY_YESNO	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #define SMP_IO_KEYBOARD_ONLY	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define SMP_IO_NO_INPUT_OUTPUT	0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define SMP_IO_KEYBOARD_DISPLAY	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define SMP_OOB_NOT_PRESENT	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define SMP_OOB_PRESENT		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define SMP_DIST_ENC_KEY	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #define SMP_DIST_ID_KEY		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #define SMP_DIST_SIGN		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #define SMP_DIST_LINK_KEY	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #define SMP_AUTH_NONE		0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define SMP_AUTH_BONDING	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) #define SMP_AUTH_MITM		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define SMP_AUTH_SC		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define SMP_AUTH_KEYPRESS	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) #define SMP_AUTH_CT2		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #define SMP_CMD_PAIRING_CONFIRM	0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) struct smp_cmd_pairing_confirm {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	__u8	confirm_val[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #define SMP_CMD_PAIRING_RANDOM	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) struct smp_cmd_pairing_random {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	__u8	rand_val[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #define SMP_CMD_PAIRING_FAIL	0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) struct smp_cmd_pairing_fail {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	__u8	reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #define SMP_CMD_ENCRYPT_INFO	0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) struct smp_cmd_encrypt_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	__u8	ltk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) #define SMP_CMD_MASTER_IDENT	0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) struct smp_cmd_master_ident {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	__le16	ediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	__le64	rand;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) #define SMP_CMD_IDENT_INFO	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) struct smp_cmd_ident_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	__u8	irk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #define SMP_CMD_IDENT_ADDR_INFO	0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) struct smp_cmd_ident_addr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	__u8	addr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	bdaddr_t bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) #define SMP_CMD_SIGN_INFO	0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct smp_cmd_sign_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	__u8	csrk[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define SMP_CMD_SECURITY_REQ	0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct smp_cmd_security_req {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	__u8	auth_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define SMP_CMD_PUBLIC_KEY	0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct smp_cmd_public_key {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	__u8	x[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	__u8	y[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SMP_CMD_DHKEY_CHECK	0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct smp_cmd_dhkey_check {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	__u8	e[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define SMP_CMD_KEYPRESS_NOTIFY	0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct smp_cmd_keypress_notify {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	__u8	value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SMP_CMD_MAX		0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SMP_PASSKEY_ENTRY_FAILED	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SMP_OOB_NOT_AVAIL		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define SMP_AUTH_REQUIREMENTS		0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SMP_CONFIRM_FAILED		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SMP_PAIRING_NOTSUPP		0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SMP_ENC_KEY_SIZE		0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SMP_CMD_NOTSUPP			0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SMP_UNSPECIFIED			0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SMP_REPEATED_ATTEMPTS		0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SMP_INVALID_PARAMS		0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SMP_DHKEY_CHECK_FAILED		0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SMP_NUMERIC_COMP_FAILED		0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SMP_BREDR_PAIRING_IN_PROGRESS	0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SMP_CROSS_TRANSP_NOT_ALLOWED	0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SMP_MIN_ENC_KEY_SIZE		7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SMP_MAX_ENC_KEY_SIZE		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* LTK types used in internal storage (struct smp_ltk) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	SMP_STK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	SMP_LTK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	SMP_LTK_SLAVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	SMP_LTK_P256,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	SMP_LTK_P256_DEBUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static inline bool smp_ltk_is_sc(struct smp_ltk *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	switch (key->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	case SMP_LTK_P256:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	case SMP_LTK_P256_DEBUG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static inline u8 smp_ltk_sec_level(struct smp_ltk *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	if (key->authenticated) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		if (smp_ltk_is_sc(key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 			return BT_SECURITY_FIPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 			return BT_SECURITY_HIGH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	return BT_SECURITY_MEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* Key preferences for smp_sufficient security */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) enum smp_key_pref {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	SMP_ALLOW_STK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	SMP_USE_LTK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* SMP Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 				  u8 addr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 			     enum smp_key_pref key_pref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		     const bdaddr_t *bdaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int smp_register(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) void smp_unregister(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) int bt_selftest_smp(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static inline int bt_selftest_smp(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #endif /* __SMP_H */