]> Pileus Git - ~andy/linux/blob - net/ipv4/gre.c
gre: export gre_handle_offloads() function.
[~andy/linux] / net / ipv4 / gre.c
1 /*
2  *      GRE over IPv4 demultiplexer driver
3  *
4  *      Authors: Dmitry Kozlov (xeb@mail.ru)
5  *
6  *      This program is free software; you can redistribute it and/or
7  *      modify it under the terms of the GNU General Public License
8  *      as published by the Free Software Foundation; either version
9  *      2 of the License, or (at your option) any later version.
10  *
11  */
12
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
15 #include <linux/module.h>
16 #include <linux/if.h>
17 #include <linux/icmp.h>
18 #include <linux/kernel.h>
19 #include <linux/kmod.h>
20 #include <linux/skbuff.h>
21 #include <linux/in.h>
22 #include <linux/ip.h>
23 #include <linux/netdevice.h>
24 #include <linux/if_tunnel.h>
25 #include <linux/spinlock.h>
26 #include <net/protocol.h>
27 #include <net/gre.h>
28
29 #include <net/icmp.h>
30 #include <net/route.h>
31 #include <net/xfrm.h>
32
33 static const struct gre_protocol __rcu *gre_proto[GREPROTO_MAX] __read_mostly;
34 static struct gre_cisco_protocol __rcu *gre_cisco_proto_list[GRE_IP_PROTO_MAX];
35
36 int gre_add_protocol(const struct gre_protocol *proto, u8 version)
37 {
38         if (version >= GREPROTO_MAX)
39                 return -EINVAL;
40
41         return (cmpxchg((const struct gre_protocol **)&gre_proto[version], NULL, proto) == NULL) ?
42                 0 : -EBUSY;
43 }
44 EXPORT_SYMBOL_GPL(gre_add_protocol);
45
46 int gre_del_protocol(const struct gre_protocol *proto, u8 version)
47 {
48         int ret;
49
50         if (version >= GREPROTO_MAX)
51                 return -EINVAL;
52
53         ret = (cmpxchg((const struct gre_protocol **)&gre_proto[version], proto, NULL) == proto) ?
54                 0 : -EBUSY;
55
56         if (ret)
57                 return ret;
58
59         synchronize_rcu();
60         return 0;
61 }
62 EXPORT_SYMBOL_GPL(gre_del_protocol);
63
64 void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
65                       int hdr_len)
66 {
67         struct gre_base_hdr *greh;
68
69         skb_push(skb, hdr_len);
70
71         greh = (struct gre_base_hdr *)skb->data;
72         greh->flags = tnl_flags_to_gre_flags(tpi->flags);
73         greh->protocol = tpi->proto;
74
75         if (tpi->flags&(TUNNEL_KEY|TUNNEL_CSUM|TUNNEL_SEQ)) {
76                 __be32 *ptr = (__be32 *)(((u8 *)greh) + hdr_len - 4);
77
78                 if (tpi->flags&TUNNEL_SEQ) {
79                         *ptr = tpi->seq;
80                         ptr--;
81                 }
82                 if (tpi->flags&TUNNEL_KEY) {
83                         *ptr = tpi->key;
84                         ptr--;
85                 }
86                 if (tpi->flags&TUNNEL_CSUM &&
87                     !(skb_shinfo(skb)->gso_type & SKB_GSO_GRE)) {
88                         *ptr = 0;
89                         *(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
90                                                                  skb->len, 0));
91                 }
92         }
93 }
94 EXPORT_SYMBOL_GPL(gre_build_header);
95
96 struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum)
97 {
98         int err;
99
100         if (likely(!skb->encapsulation)) {
101                 skb_reset_inner_headers(skb);
102                 skb->encapsulation = 1;
103         }
104
105         if (skb_is_gso(skb)) {
106                 err = skb_unclone(skb, GFP_ATOMIC);
107                 if (unlikely(err))
108                         goto error;
109                 skb_shinfo(skb)->gso_type |= SKB_GSO_GRE;
110                 return skb;
111         } else if (skb->ip_summed == CHECKSUM_PARTIAL && gre_csum) {
112                 err = skb_checksum_help(skb);
113                 if (unlikely(err))
114                         goto error;
115         } else if (skb->ip_summed != CHECKSUM_PARTIAL)
116                 skb->ip_summed = CHECKSUM_NONE;
117
118         return skb;
119 error:
120         kfree_skb(skb);
121         return ERR_PTR(err);
122 }
123 EXPORT_SYMBOL_GPL(gre_handle_offloads);
124
125 static __sum16 check_checksum(struct sk_buff *skb)
126 {
127         __sum16 csum = 0;
128
129         switch (skb->ip_summed) {
130         case CHECKSUM_COMPLETE:
131                 csum = csum_fold(skb->csum);
132
133                 if (!csum)
134                         break;
135                 /* Fall through. */
136
137         case CHECKSUM_NONE:
138                 skb->csum = 0;
139                 csum = __skb_checksum_complete(skb);
140                 skb->ip_summed = CHECKSUM_COMPLETE;
141                 break;
142         }
143
144         return csum;
145 }
146
147 static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
148                             bool *csum_err)
149 {
150         unsigned int ip_hlen = ip_hdrlen(skb);
151         const struct gre_base_hdr *greh;
152         __be32 *options;
153         int hdr_len;
154
155         if (unlikely(!pskb_may_pull(skb, sizeof(struct gre_base_hdr))))
156                 return -EINVAL;
157
158         greh = (struct gre_base_hdr *)(skb_network_header(skb) + ip_hlen);
159         if (unlikely(greh->flags & (GRE_VERSION | GRE_ROUTING)))
160                 return -EINVAL;
161
162         tpi->flags = gre_flags_to_tnl_flags(greh->flags);
163         hdr_len = ip_gre_calc_hlen(tpi->flags);
164
165         if (!pskb_may_pull(skb, hdr_len))
166                 return -EINVAL;
167
168         greh = (struct gre_base_hdr *)(skb_network_header(skb) + ip_hlen);
169         tpi->proto = greh->protocol;
170
171         options = (__be32 *)(greh + 1);
172         if (greh->flags & GRE_CSUM) {
173                 if (check_checksum(skb)) {
174                         *csum_err = true;
175                         return -EINVAL;
176                 }
177                 options++;
178         }
179
180         if (greh->flags & GRE_KEY) {
181                 tpi->key = *options;
182                 options++;
183         } else
184                 tpi->key = 0;
185
186         if (unlikely(greh->flags & GRE_SEQ)) {
187                 tpi->seq = *options;
188                 options++;
189         } else
190                 tpi->seq = 0;
191
192         /* WCCP version 1 and 2 protocol decoding.
193          * - Change protocol to IP
194          * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
195          */
196         if (greh->flags == 0 && tpi->proto == htons(ETH_P_WCCP)) {
197                 tpi->proto = htons(ETH_P_IP);
198                 if ((*(u8 *)options & 0xF0) != 0x40) {
199                         hdr_len += 4;
200                         if (!pskb_may_pull(skb, hdr_len))
201                                 return -EINVAL;
202                 }
203         }
204         return 0;
205 }
206
207 static int gre_cisco_rcv(struct sk_buff *skb)
208 {
209         struct tnl_ptk_info tpi;
210         int i;
211         bool csum_err = false;
212
213         if (parse_gre_header(skb, &tpi, &csum_err) < 0)
214                 goto drop;
215
216         rcu_read_lock();
217         for (i = 0; i < GRE_IP_PROTO_MAX; i++) {
218                 struct gre_cisco_protocol *proto;
219                 int ret;
220
221                 proto = rcu_dereference(gre_cisco_proto_list[i]);
222                 if (!proto)
223                         continue;
224                 ret = proto->handler(skb, &tpi);
225                 if (ret == PACKET_RCVD) {
226                         rcu_read_unlock();
227                         return 0;
228                 }
229         }
230         rcu_read_unlock();
231
232         icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
233 drop:
234         kfree_skb(skb);
235         return 0;
236 }
237
238 static void gre_cisco_err(struct sk_buff *skb, u32 info)
239 {
240         /* All the routers (except for Linux) return only
241          * 8 bytes of packet payload. It means, that precise relaying of
242          * ICMP in the real Internet is absolutely infeasible.
243          *
244          * Moreover, Cisco "wise men" put GRE key to the third word
245          * in GRE header. It makes impossible maintaining even soft
246          * state for keyed
247          * GRE tunnels with enabled checksum. Tell them "thank you".
248          *
249          * Well, I wonder, rfc1812 was written by Cisco employee,
250          * what the hell these idiots break standards established
251          * by themselves???
252          */
253
254         const int type = icmp_hdr(skb)->type;
255         const int code = icmp_hdr(skb)->code;
256         struct tnl_ptk_info tpi;
257         bool csum_err = false;
258         int i;
259
260         if (parse_gre_header(skb, &tpi, &csum_err)) {
261                 if (!csum_err)          /* ignore csum errors. */
262                         return;
263         }
264
265         if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
266                 ipv4_update_pmtu(skb, dev_net(skb->dev), info,
267                                 skb->dev->ifindex, 0, IPPROTO_GRE, 0);
268                 return;
269         }
270         if (type == ICMP_REDIRECT) {
271                 ipv4_redirect(skb, dev_net(skb->dev), skb->dev->ifindex, 0,
272                                 IPPROTO_GRE, 0);
273                 return;
274         }
275
276         rcu_read_lock();
277         for (i = 0; i < GRE_IP_PROTO_MAX; i++) {
278                 struct gre_cisco_protocol *proto;
279
280                 proto = rcu_dereference(gre_cisco_proto_list[i]);
281                 if (!proto)
282                         continue;
283
284                 if (proto->err_handler(skb, info, &tpi) == PACKET_RCVD)
285                         goto out;
286
287         }
288 out:
289         rcu_read_unlock();
290 }
291
292 static int gre_rcv(struct sk_buff *skb)
293 {
294         const struct gre_protocol *proto;
295         u8 ver;
296         int ret;
297
298         if (!pskb_may_pull(skb, 12))
299                 goto drop;
300
301         ver = skb->data[1]&0x7f;
302         if (ver >= GREPROTO_MAX)
303                 goto drop;
304
305         rcu_read_lock();
306         proto = rcu_dereference(gre_proto[ver]);
307         if (!proto || !proto->handler)
308                 goto drop_unlock;
309         ret = proto->handler(skb);
310         rcu_read_unlock();
311         return ret;
312
313 drop_unlock:
314         rcu_read_unlock();
315 drop:
316         kfree_skb(skb);
317         return NET_RX_DROP;
318 }
319
320 static void gre_err(struct sk_buff *skb, u32 info)
321 {
322         const struct gre_protocol *proto;
323         const struct iphdr *iph = (const struct iphdr *)skb->data;
324         u8 ver = skb->data[(iph->ihl<<2) + 1]&0x7f;
325
326         if (ver >= GREPROTO_MAX)
327                 return;
328
329         rcu_read_lock();
330         proto = rcu_dereference(gre_proto[ver]);
331         if (proto && proto->err_handler)
332                 proto->err_handler(skb, info);
333         rcu_read_unlock();
334 }
335
336 static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
337                                        netdev_features_t features)
338 {
339         struct sk_buff *segs = ERR_PTR(-EINVAL);
340         netdev_features_t enc_features;
341         int ghl = GRE_HEADER_SECTION;
342         struct gre_base_hdr *greh;
343         int mac_len = skb->mac_len;
344         __be16 protocol = skb->protocol;
345         int tnl_hlen;
346         bool csum;
347
348         if (unlikely(skb_shinfo(skb)->gso_type &
349                                 ~(SKB_GSO_TCPV4 |
350                                   SKB_GSO_TCPV6 |
351                                   SKB_GSO_UDP |
352                                   SKB_GSO_DODGY |
353                                   SKB_GSO_TCP_ECN |
354                                   SKB_GSO_GRE)))
355                 goto out;
356
357         if (unlikely(!pskb_may_pull(skb, sizeof(*greh))))
358                 goto out;
359
360         greh = (struct gre_base_hdr *)skb_transport_header(skb);
361
362         if (greh->flags & GRE_KEY)
363                 ghl += GRE_HEADER_SECTION;
364         if (greh->flags & GRE_SEQ)
365                 ghl += GRE_HEADER_SECTION;
366         if (greh->flags & GRE_CSUM) {
367                 ghl += GRE_HEADER_SECTION;
368                 csum = true;
369         } else
370                 csum = false;
371
372         /* setup inner skb. */
373         skb->protocol = greh->protocol;
374         skb->encapsulation = 0;
375
376         if (unlikely(!pskb_may_pull(skb, ghl)))
377                 goto out;
378         __skb_pull(skb, ghl);
379         skb_reset_mac_header(skb);
380         skb_set_network_header(skb, skb_inner_network_offset(skb));
381         skb->mac_len = skb_inner_network_offset(skb);
382
383         /* segment inner packet. */
384         enc_features = skb->dev->hw_enc_features & netif_skb_features(skb);
385         segs = skb_mac_gso_segment(skb, enc_features);
386         if (!segs || IS_ERR(segs))
387                 goto out;
388
389         skb = segs;
390         tnl_hlen = skb_tnl_header_len(skb);
391         do {
392                 __skb_push(skb, ghl);
393                 if (csum) {
394                         __be32 *pcsum;
395
396                         if (skb_has_shared_frag(skb)) {
397                                 int err;
398
399                                 err = __skb_linearize(skb);
400                                 if (err) {
401                                         kfree_skb(segs);
402                                         segs = ERR_PTR(err);
403                                         goto out;
404                                 }
405                         }
406
407                         greh = (struct gre_base_hdr *)(skb->data);
408                         pcsum = (__be32 *)(greh + 1);
409                         *pcsum = 0;
410                         *(__sum16 *)pcsum = csum_fold(skb_checksum(skb, 0, skb->len, 0));
411                 }
412                 __skb_push(skb, tnl_hlen - ghl);
413
414                 skb_reset_mac_header(skb);
415                 skb_set_network_header(skb, mac_len);
416                 skb->mac_len = mac_len;
417                 skb->protocol = protocol;
418         } while ((skb = skb->next));
419 out:
420         return segs;
421 }
422
423 static int gre_gso_send_check(struct sk_buff *skb)
424 {
425         if (!skb->encapsulation)
426                 return -EINVAL;
427         return 0;
428 }
429
430 static const struct net_protocol net_gre_protocol = {
431         .handler     = gre_rcv,
432         .err_handler = gre_err,
433         .netns_ok    = 1,
434 };
435
436 static const struct net_offload gre_offload = {
437         .callbacks = {
438                 .gso_send_check =       gre_gso_send_check,
439                 .gso_segment    =       gre_gso_segment,
440         },
441 };
442
443 static const struct gre_protocol ipgre_protocol = {
444         .handler     = gre_cisco_rcv,
445         .err_handler = gre_cisco_err,
446 };
447
448 int gre_cisco_register(struct gre_cisco_protocol *newp)
449 {
450         struct gre_cisco_protocol **proto = (struct gre_cisco_protocol **)
451                                             &gre_cisco_proto_list[newp->priority];
452
453         return (cmpxchg(proto, NULL, newp) == NULL) ? 0 : -EBUSY;
454 }
455 EXPORT_SYMBOL_GPL(gre_cisco_register);
456
457 int gre_cisco_unregister(struct gre_cisco_protocol *del_proto)
458 {
459         struct gre_cisco_protocol **proto = (struct gre_cisco_protocol **)
460                                             &gre_cisco_proto_list[del_proto->priority];
461         int ret;
462
463         ret = (cmpxchg(proto, del_proto, NULL) == del_proto) ? 0 : -EINVAL;
464
465         if (ret)
466                 return ret;
467
468         synchronize_net();
469         return 0;
470 }
471 EXPORT_SYMBOL_GPL(gre_cisco_unregister);
472
473 static int __init gre_init(void)
474 {
475         pr_info("GRE over IPv4 demultiplexor driver\n");
476
477         if (inet_add_protocol(&net_gre_protocol, IPPROTO_GRE) < 0) {
478                 pr_err("can't add protocol\n");
479                 goto err;
480         }
481
482         if (gre_add_protocol(&ipgre_protocol, GREPROTO_CISCO) < 0) {
483                 pr_info("%s: can't add ipgre handler\n", __func__);
484                 goto err_gre;
485         }
486
487         if (inet_add_offload(&gre_offload, IPPROTO_GRE)) {
488                 pr_err("can't add protocol offload\n");
489                 goto err_gso;
490         }
491
492         return 0;
493 err_gso:
494         gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
495 err_gre:
496         inet_del_protocol(&net_gre_protocol, IPPROTO_GRE);
497 err:
498         return -EAGAIN;
499 }
500
501 static void __exit gre_exit(void)
502 {
503         inet_del_offload(&gre_offload, IPPROTO_GRE);
504         gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO);
505         inet_del_protocol(&net_gre_protocol, IPPROTO_GRE);
506 }
507
508 module_init(gre_init);
509 module_exit(gre_exit);
510
511 MODULE_DESCRIPTION("GRE over IPv4 demultiplexer driver");
512 MODULE_AUTHOR("D. Kozlov (xeb@mail.ru)");
513 MODULE_LICENSE("GPL");