• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 /*
3  * Copyright (c) 2022 Huawei Device Co., Ltd.
4  *
5  * Description: Provide operations and conversions
6  * related to NewIP address.
7  *
8  * Author: Yang Yanjun <yangyanjun@huawei.com>
9  *
10  * Data: 2022-07-18
11  */
12 #ifndef _UAPI_NEWIP_ADDR_H
13 #define _UAPI_NEWIP_ADDR_H
14 
15 #define NIP_ADDR_LEN_1 1
16 #define NIP_ADDR_LEN_2 2
17 #define NIP_ADDR_LEN_3 3
18 #define NIP_ADDR_LEN_4 4
19 #define NIP_ADDR_LEN_5 5
20 #define NIP_ADDR_LEN_7 7
21 #define NIP_ADDR_LEN_8 8
22 
23 #define NIP_ADDR_BIT_LEN_8    8
24 #define NIP_ADDR_BIT_LEN_16   16
25 #define NIP_ADDR_BIT_LEN_24   24
26 #define NIP_ADDR_BIT_LEN_40   40
27 #define NIP_ADDR_BIT_LEN_MAX  64
28 
29 enum nip_addr_check_value {
30 	ADDR_FIRST_DC = 0xDC,
31 	ADDR_FIRST_F0 = 0xF0,
32 	ADDR_FIRST_F1,
33 	ADDR_FIRST_F2,
34 	ADDR_FIRST_F3,
35 	ADDR_FIRST_FE = 0xFE,
36 	ADDR_FIRST_FF = 0xFF,
37 	ADDR_SECOND_MIN_DD = 0xDD,
38 	ADDR_SECOND_MIN_F1 = 0x14,    /* f1 14 00 */
39 	ADDR_THIRD_MIN_F2 = 0x01,     /* f2 00 01 00 00 */
40 	ADDR_THIRD_MIN_F3 = 0x01,     /* F3 0001 0000 0000 */
41 };
42 
43 enum nip_8bit_addr_index {
44 	NIP_8BIT_ADDR_INDEX_0 = 0,
45 	NIP_8BIT_ADDR_INDEX_1 = 1,
46 	NIP_8BIT_ADDR_INDEX_2 = 2,
47 	NIP_8BIT_ADDR_INDEX_3 = 3,
48 	NIP_8BIT_ADDR_INDEX_4 = 4,
49 	NIP_8BIT_ADDR_INDEX_5 = 5,
50 	NIP_8BIT_ADDR_INDEX_6 = 6,
51 	NIP_8BIT_ADDR_INDEX_7 = 7,
52 	NIP_8BIT_ADDR_INDEX_MAX,
53 };
54 
55 enum nip_16bit_addr_index {
56 	NIP_16BIT_ADDR_INDEX_0 = 0,
57 	NIP_16BIT_ADDR_INDEX_1 = 1,
58 	NIP_16BIT_ADDR_INDEX_2 = 2,
59 	NIP_16BIT_ADDR_INDEX_3 = 3,
60 	NIP_16BIT_ADDR_INDEX_MAX,
61 };
62 
63 enum nip_32bit_addr_index {
64 	NIP_32BIT_ADDR_INDEX_0 = 0,
65 	NIP_32BIT_ADDR_INDEX_1 = 1,
66 	NIP_32BIT_ADDR_INDEX_MAX,
67 };
68 
69 #define NIP_ADDR_FIELD8 v.u.field8
70 #define NIP_ADDR_FIELD16 v.u.field16
71 #define NIP_ADDR_FIELD32 v.u.field32
72 
73 #pragma pack(1)
74 struct nip_addr_field {
75 	union {
76 		unsigned char   field8[NIP_8BIT_ADDR_INDEX_MAX];
77 		unsigned short field16[NIP_16BIT_ADDR_INDEX_MAX]; /* big-endian */
78 		unsigned int   field32[NIP_32BIT_ADDR_INDEX_MAX]; /* big-endian */
79 	} u;
80 };
81 
82 struct nip_addr {
83 	unsigned char bitlen; /* The address length is in bit (not byte) */
84 	struct nip_addr_field v;
85 };
86 
87 #pragma pack()
88 
89 enum nip_index {
90 	INDEX_0 = 0,
91 	INDEX_1 = 1,
92 	INDEX_2 = 2,
93 	INDEX_3 = 3,
94 	INDEX_4 = 4,
95 	INDEX_5 = 5,
96 	INDEX_6 = 6,
97 	INDEX_7 = 7,
98 	INDEX_8 = 8,
99 	INDEX_9 = 9,
100 	INDEX_10 = 10,
101 	INDEX_11 = 11,
102 	INDEX_12 = 12,
103 	INDEX_13 = 13,
104 	INDEX_14 = 14,
105 	INDEX_15 = 15,
106 	INDEX_MAX,
107 };
108 
109 extern const struct nip_addr nip_any_addr;
110 extern const struct nip_addr nip_broadcast_addr_arp;
111 
112 struct nip_buff {
113 	unsigned char *data;
114 	unsigned int remaining_len;
115 };
116 
nip_buff_pull(struct nip_buff * nbuf,unsigned int len)117 static inline void nip_buff_pull(struct nip_buff *nbuf, unsigned int len)
118 {
119 	if (len > nbuf->remaining_len)
120 		return;
121 
122 	nbuf->data += len;
123 	nbuf->remaining_len -= len;
124 }
125 
126 int nip_addr_invalid(const struct nip_addr *addr);
127 int nip_addr_public(const struct nip_addr *addr);
128 int nip_addr_any(const struct nip_addr *addr);
129 int get_nip_addr_len(const struct nip_addr *addr);
130 unsigned char *build_nip_addr(const struct nip_addr *addr, unsigned char *buf);
131 unsigned char *decode_nip_addr(struct nip_buff *nbuf, struct nip_addr *addr);
132 int is_nip_local_addr(const struct nip_addr *addr);
133 
134 #endif /* _UAPI_NEWIP_ADDR_H */
135 
136