tree: https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git master
head: 020f6cc5f75511c5974cfd454f224365bc0c2df4
commit: af308b94a2a4a5a27bec9028354c4df444a7c8ba [15/20] netfilter: nf_tables:
add tunnel support
reproduce:
# apt-get install sparse
git checkout af308b94a2a4a5a27bec9028354c4df444a7c8ba
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> net/netfilter/nft_tunnel.c:117:25: sparse: incorrect type in assignment
>> (different base types) @@ expected unsigned int [unsigned] [usertype]
>> flags @@ got ed int [unsigned] [usertype] flags @@
net/netfilter/nft_tunnel.c:117:25: expected unsigned int [unsigned]
[usertype] flags
net/netfilter/nft_tunnel.c:117:25: got restricted __be16 [usertype]
<noident>
net/netfilter/nft_tunnel.c:166:25: sparse: incorrect type in assignment
(different base types) @@ expected unsigned int [unsigned] [usertype] flags
@@ got ed int [unsigned] [usertype] flags @@
net/netfilter/nft_tunnel.c:166:25: expected unsigned int [unsigned]
[usertype] flags
net/netfilter/nft_tunnel.c:166:25: got restricted __be16 [usertype]
<noident>
>> net/netfilter/nft_tunnel.c:242:33: sparse: incorrect type in assignment
>> (different base types) @@ expected restricted __be16 [addressable]
>> [assigned] [usertype] tp_src @@ got e] tp_src @@
net/netfilter/nft_tunnel.c:242:33: expected restricted __be16
[addressable] [assigned] [usertype] tp_src
net/netfilter/nft_tunnel.c:242:33: got int
>> net/netfilter/nft_tunnel.c:246:33: sparse: incorrect type in assignment
>> (different base types) @@ expected restricted __be16 [addressable]
>> [assigned] [usertype] tp_dst @@ got e] tp_dst @@
net/netfilter/nft_tunnel.c:246:33: expected restricted __be16
[addressable] [assigned] [usertype] tp_dst
net/netfilter/nft_tunnel.c:246:33: got int
>> net/netfilter/nft_tunnel.c:284:43: sparse: incorrect type in argument 4
>> (different base types) @@ expected restricted __be16 [usertype] flags @@
>> got unsignrestricted __be16 [usertype] flags @@
net/netfilter/nft_tunnel.c:284:43: expected restricted __be16 [usertype]
flags
net/netfilter/nft_tunnel.c:284:43: got unsigned int [unsigned] [usertype]
flags
>> net/netfilter/nft_tunnel.c:342:27: sparse: restricted __be16 degrades to
>> integer
net/netfilter/nft_tunnel.c:346:34: sparse: restricted __be16 degrades to
integer
>> net/netfilter/nft_tunnel.c:370:54: sparse: cast from restricted __be16
>> net/netfilter/nft_tunnel.c:370:54: sparse: incorrect type in argument 1
>> (different base types) @@ expected unsigned short [unsigned] [usertype]
>> val @@ got short [unsigned] [usertype] val @@
net/netfilter/nft_tunnel.c:370:54: expected unsigned short [unsigned]
[usertype] val
net/netfilter/nft_tunnel.c:370:54: got restricted __be16 [usertype] tp_src
>> net/netfilter/nft_tunnel.c:370:54: sparse: cast from restricted __be16
>> net/netfilter/nft_tunnel.c:370:54: sparse: cast from restricted __be16
net/netfilter/nft_tunnel.c:371:54: sparse: cast from restricted __be16
net/netfilter/nft_tunnel.c:371:54: sparse: incorrect type in argument 1
(different base types) @@ expected unsigned short [unsigned] [usertype] val
@@ got short [unsigned] [usertype] val @@
net/netfilter/nft_tunnel.c:371:54: expected unsigned short [unsigned]
[usertype] val
net/netfilter/nft_tunnel.c:371:54: got restricted __be16 [usertype] tp_dst
net/netfilter/nft_tunnel.c:371:54: sparse: cast from restricted __be16
net/netfilter/nft_tunnel.c:371:54: sparse: cast from restricted __be16
vim +117 net/netfilter/nft_tunnel.c
99
100 static int nft_tunnel_obj_vxlan_init(const struct nlattr *attr,
101 struct nft_tunnel_opts *opts)
102 {
103 struct nlattr *tb[NFTA_TUNNEL_KEY_VXLAN_MAX + 1];
104 int err;
105
106 err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_VXLAN_MAX, attr,
107 nft_tunnel_opts_vxlan_policy, NULL);
108 if (err < 0)
109 return err;
110
111 if (!tb[NFTA_TUNNEL_KEY_VXLAN_GBP])
112 return -EINVAL;
113
114 opts->u.vxlan.gbp =
ntohl(nla_get_be32(tb[NFTA_TUNNEL_KEY_VXLAN_GBP]));
115
116 opts->len = sizeof(struct vxlan_metadata);
> 117 opts->flags = TUNNEL_VXLAN_OPT;
118
119 return 0;
120 }
121
122 static const struct nla_policy
nft_tunnel_opts_erspan_policy[NFTA_TUNNEL_KEY_ERSPAN_MAX + 1] = {
123 [NFTA_TUNNEL_KEY_ERSPAN_V1_INDEX] = { .type = NLA_U32 },
124 [NFTA_TUNNEL_KEY_ERSPAN_V2_DIR] = { .type = NLA_U8 },
125 [NFTA_TUNNEL_KEY_ERSPAN_V2_HWID] = { .type = NLA_U8 },
126 };
127
128 static int nft_tunnel_obj_erspan_init(const struct nlattr *attr,
129 struct nft_tunnel_opts *opts)
130 {
131 struct nlattr *tb[NFTA_TUNNEL_KEY_ERSPAN_MAX + 1];
132 uint8_t hwid, dir;
133 int err, version;
134
135 err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_ERSPAN_MAX, attr,
136 nft_tunnel_opts_erspan_policy, NULL);
137 if (err < 0)
138 return err;
139
140 version =
ntohl(nla_get_be32(tb[NFTA_TUNNEL_KEY_ERSPAN_VERSION]));
141 switch (version) {
142 case ERSPAN_VERSION:
143 if (!tb[NFTA_TUNNEL_KEY_ERSPAN_V1_INDEX])
144 return -EINVAL;
145
146 opts->u.erspan.u.index =
147
nla_get_be32(tb[NFTA_TUNNEL_KEY_ERSPAN_V1_INDEX]);
148 break;
149 case ERSPAN_VERSION2:
150 if (!tb[NFTA_TUNNEL_KEY_ERSPAN_V2_DIR] ||
151 !tb[NFTA_TUNNEL_KEY_ERSPAN_V2_HWID])
152 return -EINVAL;
153
154 hwid = nla_get_u8(tb[NFTA_TUNNEL_KEY_ERSPAN_V2_HWID]);
155 dir = nla_get_u8(tb[NFTA_TUNNEL_KEY_ERSPAN_V2_DIR]);
156
157 set_hwid(&opts->u.erspan.u.md2, hwid);
158 opts->u.erspan.u.md2.dir = dir;
159 break;
160 default:
161 return -EOPNOTSUPP;
162 }
163 opts->u.erspan.version = version;
164
165 opts->len = sizeof(struct erspan_metadata);
> 166 opts->flags = TUNNEL_ERSPAN_OPT;
167
168 return 0;
169 }
170
171 static const struct nla_policy
nft_tunnel_opts_policy[NFTA_TUNNEL_KEY_OPTS_MAX + 1] = {
172 [NFTA_TUNNEL_KEY_OPTS_VXLAN] = { .type = NLA_NESTED, },
173 [NFTA_TUNNEL_KEY_OPTS_ERSPAN] = { .type = NLA_NESTED, },
174 };
175
176 static int nft_tunnel_obj_opts_init(const struct nft_ctx *ctx,
177 const struct nlattr *attr,
178 struct ip_tunnel_info *info,
179 struct nft_tunnel_opts *opts)
180 {
181 struct nlattr *tb[NFTA_TUNNEL_KEY_OPTS_MAX + 1];
182 int err;
183
184 err = nla_parse_nested(tb, NFTA_TUNNEL_KEY_OPTS_MAX, attr,
185 nft_tunnel_opts_policy, NULL);
186 if (err < 0)
187 return err;
188
189 if (tb[NFTA_TUNNEL_KEY_OPTS_VXLAN]) {
190 err =
nft_tunnel_obj_vxlan_init(tb[NFTA_TUNNEL_KEY_OPTS_VXLAN],
191 opts);
192 } else if (tb[NFTA_TUNNEL_KEY_OPTS_ERSPAN]) {
193 err =
nft_tunnel_obj_erspan_init(tb[NFTA_TUNNEL_KEY_OPTS_ERSPAN],
194 opts);
195 } else {
196 return -EOPNOTSUPP;
197 }
198
199 return err;
200 }
201
202 static const struct nla_policy
nft_tunnel_key_policy[NFTA_TUNNEL_KEY_MAX + 1] = {
203 [NFTA_TUNNEL_KEY_IP] = { .type = NLA_NESTED, },
204 [NFTA_TUNNEL_KEY_IP6] = { .type = NLA_NESTED, },
205 [NFTA_TUNNEL_KEY_ID] = { .type = NLA_U32, },
206 [NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, },
207 [NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, },
208 [NFTA_TUNNEL_KEY_TTL] = { .type = NLA_U8, },
209 [NFTA_TUNNEL_KEY_OPTS] = { .type = NLA_NESTED, },
210 };
211
212 static int nft_tunnel_obj_init(const struct nft_ctx *ctx,
213 const struct nlattr * const tb[],
214 struct nft_object *obj)
215 {
216 struct nft_tunnel_obj *priv = nft_obj_data(obj);
217 struct ip_tunnel_info info;
218 struct metadata_dst *md;
219 int err;
220
221 if (!tb[NFTA_TUNNEL_KEY_ID])
222 return -EINVAL;
223
224 memset(&info, 0, sizeof(info));
225 info.mode = IP_TUNNEL_INFO_TX;
226 info.key.tun_id =
key32_to_tunnel_id(nla_get_be32(tb[NFTA_TUNNEL_KEY_ID]));
227 info.key.tun_flags = TUNNEL_KEY | TUNNEL_CSUM |
TUNNEL_NOCACHE;
228
229 if (tb[NFTA_TUNNEL_KEY_IP]) {
230 err = nft_tunnel_obj_ip_init(ctx,
tb[NFTA_TUNNEL_KEY_IP], &info);
231 if (err < 0)
232 return err;
233 } else if (tb[NFTA_TUNNEL_KEY_IP6]) {
234 err = nft_tunnel_obj_ip6_init(ctx,
tb[NFTA_TUNNEL_KEY_IP6], &info);
235 if (err < 0)
236 return err;
237 } else {
238 return -EINVAL;
239 }
240
241 if (tb[NFTA_TUNNEL_KEY_SPORT]) {
> 242 info.key.tp_src =
243 ntohs(nla_get_be16(tb[NFTA_TUNNEL_KEY_SPORT]));
244 }
245 if (tb[NFTA_TUNNEL_KEY_DPORT]) {
> 246 info.key.tp_dst =
247 ntohs(nla_get_be16(tb[NFTA_TUNNEL_KEY_DPORT]));
248 }
249
250 if (tb[NFTA_TUNNEL_KEY_FLAGS]) {
251 u32 tun_flags;
252
253 tun_flags =
ntohl(nla_get_be32(tb[NFTA_TUNNEL_KEY_FLAGS]));
254 if (tun_flags & ~NFT_TUNNEL_F_MASK)
255 return -EOPNOTSUPP;
256
257 if (tun_flags & NFT_TUNNEL_F_ZERO_CSUM_TX)
258 info.key.tun_flags &= ~TUNNEL_CSUM;
259 if (tun_flags & NFT_TUNNEL_F_DONT_FRAGMENT)
260 info.key.tun_flags |= TUNNEL_DONT_FRAGMENT;
261 if (tun_flags & NFT_TUNNEL_F_SEQ_NUMBER)
262 info.key.tun_flags |= TUNNEL_SEQ;
263 }
264 if (tb[NFTA_TUNNEL_KEY_TOS])
265 info.key.tos = nla_get_u8(tb[NFTA_TUNNEL_KEY_TOS]);
266 if (tb[NFTA_TUNNEL_KEY_TTL])
267 info.key.ttl = nla_get_u8(tb[NFTA_TUNNEL_KEY_TTL]);
268 else
269 info.key.ttl = U8_MAX;
270
271 if (tb[NFTA_TUNNEL_KEY_OPTS]) {
272 err = nft_tunnel_obj_opts_init(ctx,
tb[NFTA_TUNNEL_KEY_OPTS],
273 &info, &priv->opts);
274 if (err < 0)
275 return err;
276 }
277
278 md = metadata_dst_alloc(priv->opts.len, METADATA_IP_TUNNEL,
GFP_KERNEL);
279 if (!md)
280 return -ENOMEM;
281
282 memcpy(&md->u.tun_info, &info, sizeof(info));
283 ip_tunnel_info_opts_set(&md->u.tun_info, &priv->opts.u,
priv->opts.len,
> 284 priv->opts.flags);
285 priv->md = md;
286
287 return 0;
288 }
289
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html