1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * inet fragments management 4 * 5 * Authors: Pavel Emelyanov <xemul@openvz.org> 6 * Started as consolidation of ipv4/ip_fragment.c, 7 * ipv6/reassembly. and ipv6 nf conntrack reassembly 8 */ 9 10 #include <linux/list.h> 11 #include <linux/spinlock.h> 12 #include <linux/module.h> 13 #include <linux/timer.h> 14 #include <linux/mm.h> 15 #include <linux/random.h> 16 #include <linux/skbuff.h> 17 #include <linux/rtnetlink.h> 18 #include <linux/slab.h> 19 #include <linux/rhashtable.h> 20 21 #include <net/sock.h> 22 #include <net/inet_frag.h> 23 #include <net/inet_ecn.h> 24 #include <net/ip.h> 25 #include <net/ipv6.h> 26 27 /* Use skb->cb to track consecutive/adjacent fragments coming at 28 * the end of the queue. Nodes in the rb-tree queue will 29 * contain "runs" of one or more adjacent fragments. 30 * 31 * Invariants: 32 * - next_frag is NULL at the tail of a "run"; 33 * - the head of a "run" has the sum of all fragment lengths in frag_run_len. 34 */ 35 struct ipfrag_skb_cb { 36 union { 37 struct inet_skb_parm h4; 38 struct inet6_skb_parm h6; 39 }; 40 struct sk_buff *next_frag; 41 int frag_run_len; 42 }; 43 44 #define FRAG_CB(skb) ((struct ipfrag_skb_cb *)((skb)->cb)) 45 46 static void fragcb_clear(struct sk_buff *skb) 47 { 48 RB_CLEAR_NODE(&skb->rbnode); 49 FRAG_CB(skb)->next_frag = NULL; 50 FRAG_CB(skb)->frag_run_len = skb->len; 51 } 52 53 /* Append skb to the last "run". */ 54 static void fragrun_append_to_last(struct inet_frag_queue *q, 55 struct sk_buff *skb) 56 { 57 fragcb_clear(skb); 58 59 FRAG_CB(q->last_run_head)->frag_run_len += skb->len; 60 FRAG_CB(q->fragments_tail)->next_frag = skb; 61 q->fragments_tail = skb; 62 } 63 64 /* Create a new "run" with the skb. */ 65 static void fragrun_create(struct inet_frag_queue *q, struct sk_buff *skb) 66 { 67 BUILD_BUG_ON(sizeof(struct ipfrag_skb_cb) > sizeof(skb->cb)); 68 fragcb_clear(skb); 69 70 if (q->last_run_head) 71 rb_link_node(&skb->rbnode, &q->last_run_head->rbnode, 72 &q->last_run_head->rbnode.rb_right); 73 else 74 rb_link_node(&skb->rbnode, NULL, &q->rb_fragments.rb_node); 75 rb_insert_color(&skb->rbnode, &q->rb_fragments); 76 77 q->fragments_tail = skb; 78 q->last_run_head = skb; 79 } 80 81 /* Given the OR values of all fragments, apply RFC 3168 5.3 requirements 82 * Value : 0xff if frame should be dropped. 83 * 0 or INET_ECN_CE value, to be ORed in to final iph->tos field 84 */ 85 const u8 ip_frag_ecn_table[16] = { 86 /* at least one fragment had CE, and others ECT_0 or ECT_1 */ 87 [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0] = INET_ECN_CE, 88 [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_1] = INET_ECN_CE, 89 [IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = INET_ECN_CE, 90 91 /* invalid combinations : drop frame */ 92 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE] = 0xff, 93 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_0] = 0xff, 94 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_1] = 0xff, 95 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = 0xff, 96 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0] = 0xff, 97 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_1] = 0xff, 98 [IPFRAG_ECN_NOT_ECT | IPFRAG_ECN_CE | IPFRAG_ECN_ECT_0 | IPFRAG_ECN_ECT_1] = 0xff, 99 }; 100 EXPORT_SYMBOL(ip_frag_ecn_table); 101 102 int inet_frags_init(struct inet_frags *f) 103 { 104 f->frags_cachep = kmem_cache_create(f->frags_cache_name, f->qsize, 0, 0, 105 NULL); 106 if (!f->frags_cachep) 107 return -ENOMEM; 108 109 refcount_set(&f->refcnt, 1); 110 init_completion(&f->completion); 111 return 0; 112 } 113 EXPORT_SYMBOL(inet_frags_init); 114 115 void inet_frags_fini(struct inet_frags *f) 116 { 117 if (refcount_dec_and_test(&f->refcnt)) 118 complete(&f->completion); 119 120 wait_for_completion(&f->completion); 121 122 kmem_cache_destroy(f->frags_cachep); 123 f->frags_cachep = NULL; 124 } 125 EXPORT_SYMBOL(inet_frags_fini); 126 127 /* called from rhashtable_free_and_destroy() at netns_frags dismantle */ 128 static void inet_frags_free_cb(void *ptr, void *arg) 129 { 130 struct inet_frag_queue *fq = ptr; 131 int count; 132 133 count = del_timer_sync(&fq->timer) ? 1 : 0; 134 135 spin_lock_bh(&fq->lock); 136 if (!(fq->flags & INET_FRAG_COMPLETE)) { 137 fq->flags |= INET_FRAG_COMPLETE; 138 count++; 139 } else if (fq->flags & INET_FRAG_HASH_DEAD) { 140 count++; 141 } 142 spin_unlock_bh(&fq->lock); 143 144 if (refcount_sub_and_test(count, &fq->refcnt)) 145 inet_frag_destroy(fq); 146 } 147 148 static void fqdir_rwork_fn(struct work_struct *work) 149 { 150 struct fqdir *fqdir = container_of(to_rcu_work(work), 151 struct fqdir, destroy_rwork); 152 struct inet_frags *f = fqdir->f; 153 154 rhashtable_free_and_destroy(&fqdir->rhashtable, inet_frags_free_cb, NULL); 155 156 /* We need to make sure all ongoing call_rcu(..., inet_frag_destroy_rcu) 157 * have completed, since they need to dereference fqdir. 158 * Would it not be nice to have kfree_rcu_barrier() ? :) 159 */ 160 rcu_barrier(); 161 162 if (refcount_dec_and_test(&f->refcnt)) 163 complete(&f->completion); 164 165 kfree(fqdir); 166 } 167 168 int fqdir_init(struct fqdir **fqdirp, struct inet_frags *f, struct net *net) 169 { 170 struct fqdir *fqdir = kzalloc(sizeof(*fqdir), GFP_KERNEL); 171 int res; 172 173 if (!fqdir) 174 return -ENOMEM; 175 fqdir->f = f; 176 fqdir->net = net; 177 res = rhashtable_init(&fqdir->rhashtable, &fqdir->f->rhash_params); 178 if (res < 0) { 179 kfree(fqdir); 180 return res; 181 } 182 refcount_inc(&f->refcnt); 183 *fqdirp = fqdir; 184 return 0; 185 } 186 EXPORT_SYMBOL(fqdir_init); 187 188 void fqdir_exit(struct fqdir *fqdir) 189 { 190 fqdir->high_thresh = 0; /* prevent creation of new frags */ 191 192 fqdir->dead = true; 193 194 /* call_rcu is supposed to provide memory barrier semantics, 195 * separating the setting of fqdir->dead with the destruction 196 * work. This implicit barrier is paired with inet_frag_kill(). 197 */ 198 199 INIT_RCU_WORK(&fqdir->destroy_rwork, fqdir_rwork_fn); 200 queue_rcu_work(system_wq, &fqdir->destroy_rwork); 201 202 } 203 EXPORT_SYMBOL(fqdir_exit); 204 205 void inet_frag_kill(struct inet_frag_queue *fq) 206 { 207 if (del_timer(&fq->timer)) 208 refcount_dec(&fq->refcnt); 209 210 if (!(fq->flags & INET_FRAG_COMPLETE)) { 211 struct fqdir *fqdir = fq->fqdir; 212 213 fq->flags |= INET_FRAG_COMPLETE; 214 rcu_read_lock(); 215 /* The RCU read lock provides a memory barrier 216 * guaranteeing that if fqdir->dead is false then 217 * the hash table destruction will not start until 218 * after we unlock. Paired with inet_frags_exit_net(). 219 */ 220 if (!fqdir->dead) { 221 rhashtable_remove_fast(&fqdir->rhashtable, &fq->node, 222 fqdir->f->rhash_params); 223 refcount_dec(&fq->refcnt); 224 } else { 225 fq->flags |= INET_FRAG_HASH_DEAD; 226 } 227 rcu_read_unlock(); 228 } 229 } 230 EXPORT_SYMBOL(inet_frag_kill); 231 232 static void inet_frag_destroy_rcu(struct rcu_head *head) 233 { 234 struct inet_frag_queue *q = container_of(head, struct inet_frag_queue, 235 rcu); 236 struct inet_frags *f = q->fqdir->f; 237 238 if (f->destructor) 239 f->destructor(q); 240 kmem_cache_free(f->frags_cachep, q); 241 } 242 243 unsigned int inet_frag_rbtree_purge(struct rb_root *root) 244 { 245 struct rb_node *p = rb_first(root); 246 unsigned int sum = 0; 247 248 while (p) { 249 struct sk_buff *skb = rb_entry(p, struct sk_buff, rbnode); 250 251 p = rb_next(p); 252 rb_erase(&skb->rbnode, root); 253 while (skb) { 254 struct sk_buff *next = FRAG_CB(skb)->next_frag; 255 256 sum += skb->truesize; 257 kfree_skb(skb); 258 skb = next; 259 } 260 } 261 return sum; 262 } 263 EXPORT_SYMBOL(inet_frag_rbtree_purge); 264 265 void inet_frag_destroy(struct inet_frag_queue *q) 266 { 267 struct fqdir *fqdir; 268 unsigned int sum, sum_truesize = 0; 269 struct inet_frags *f; 270 271 WARN_ON(!(q->flags & INET_FRAG_COMPLETE)); 272 WARN_ON(del_timer(&q->timer) != 0); 273 274 /* Release all fragment data. */ 275 fqdir = q->fqdir; 276 f = fqdir->f; 277 sum_truesize = inet_frag_rbtree_purge(&q->rb_fragments); 278 sum = sum_truesize + f->qsize; 279 280 call_rcu(&q->rcu, inet_frag_destroy_rcu); 281 282 sub_frag_mem_limit(fqdir, sum); 283 } 284 EXPORT_SYMBOL(inet_frag_destroy); 285 286 static struct inet_frag_queue *inet_frag_alloc(struct fqdir *fqdir, 287 struct inet_frags *f, 288 void *arg) 289 { 290 struct inet_frag_queue *q; 291 292 q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC); 293 if (!q) 294 return NULL; 295 296 q->fqdir = fqdir; 297 f->constructor(q, arg); 298 add_frag_mem_limit(fqdir, f->qsize); 299 300 timer_setup(&q->timer, f->frag_expire, 0); 301 spin_lock_init(&q->lock); 302 refcount_set(&q->refcnt, 3); 303 304 return q; 305 } 306 307 static struct inet_frag_queue *inet_frag_create(struct fqdir *fqdir, 308 void *arg, 309 struct inet_frag_queue **prev) 310 { 311 struct inet_frags *f = fqdir->f; 312 struct inet_frag_queue *q; 313 314 q = inet_frag_alloc(fqdir, f, arg); 315 if (!q) { 316 *prev = ERR_PTR(-ENOMEM); 317 return NULL; 318 } 319 mod_timer(&q->timer, jiffies + fqdir->timeout); 320 321 *prev = rhashtable_lookup_get_insert_key(&fqdir->rhashtable, &q->key, 322 &q->node, f->rhash_params); 323 if (*prev) { 324 q->flags |= INET_FRAG_COMPLETE; 325 inet_frag_kill(q); 326 inet_frag_destroy(q); 327 return NULL; 328 } 329 return q; 330 } 331 332 /* TODO : call from rcu_read_lock() and no longer use refcount_inc_not_zero() */ 333 struct inet_frag_queue *inet_frag_find(struct fqdir *fqdir, void *key) 334 { 335 struct inet_frag_queue *fq = NULL, *prev; 336 337 if (!fqdir->high_thresh || frag_mem_limit(fqdir) > fqdir->high_thresh) 338 return NULL; 339 340 rcu_read_lock(); 341 342 prev = rhashtable_lookup(&fqdir->rhashtable, key, fqdir->f->rhash_params); 343 if (!prev) 344 fq = inet_frag_create(fqdir, key, &prev); 345 if (prev && !IS_ERR(prev)) { 346 fq = prev; 347 if (!refcount_inc_not_zero(&fq->refcnt)) 348 fq = NULL; 349 } 350 rcu_read_unlock(); 351 return fq; 352 } 353 EXPORT_SYMBOL(inet_frag_find); 354 355 int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb, 356 int offset, int end) 357 { 358 struct sk_buff *last = q->fragments_tail; 359 360 /* RFC5722, Section 4, amended by Errata ID : 3089 361 * When reassembling an IPv6 datagram, if 362 * one or more its constituent fragments is determined to be an 363 * overlapping fragment, the entire datagram (and any constituent 364 * fragments) MUST be silently discarded. 365 * 366 * Duplicates, however, should be ignored (i.e. skb dropped, but the 367 * queue/fragments kept for later reassembly). 368 */ 369 if (!last) 370 fragrun_create(q, skb); /* First fragment. */ 371 else if (last->ip_defrag_offset + last->len < end) { 372 /* This is the common case: skb goes to the end. */ 373 /* Detect and discard overlaps. */ 374 if (offset < last->ip_defrag_offset + last->len) 375 return IPFRAG_OVERLAP; 376 if (offset == last->ip_defrag_offset + last->len) 377 fragrun_append_to_last(q, skb); 378 else 379 fragrun_create(q, skb); 380 } else { 381 /* Binary search. Note that skb can become the first fragment, 382 * but not the last (covered above). 383 */ 384 struct rb_node **rbn, *parent; 385 386 rbn = &q->rb_fragments.rb_node; 387 do { 388 struct sk_buff *curr; 389 int curr_run_end; 390 391 parent = *rbn; 392 curr = rb_to_skb(parent); 393 curr_run_end = curr->ip_defrag_offset + 394 FRAG_CB(curr)->frag_run_len; 395 if (end <= curr->ip_defrag_offset) 396 rbn = &parent->rb_left; 397 else if (offset >= curr_run_end) 398 rbn = &parent->rb_right; 399 else if (offset >= curr->ip_defrag_offset && 400 end <= curr_run_end) 401 return IPFRAG_DUP; 402 else 403 return IPFRAG_OVERLAP; 404 } while (*rbn); 405 /* Here we have parent properly set, and rbn pointing to 406 * one of its NULL left/right children. Insert skb. 407 */ 408 fragcb_clear(skb); 409 rb_link_node(&skb->rbnode, parent, rbn); 410 rb_insert_color(&skb->rbnode, &q->rb_fragments); 411 } 412 413 skb->ip_defrag_offset = offset; 414 415 return IPFRAG_OK; 416 } 417 EXPORT_SYMBOL(inet_frag_queue_insert); 418 419 void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb, 420 struct sk_buff *parent) 421 { 422 struct sk_buff *fp, *head = skb_rb_first(&q->rb_fragments); 423 struct sk_buff **nextp; 424 int delta; 425 426 if (head != skb) { 427 fp = skb_clone(skb, GFP_ATOMIC); 428 if (!fp) 429 return NULL; 430 FRAG_CB(fp)->next_frag = FRAG_CB(skb)->next_frag; 431 if (RB_EMPTY_NODE(&skb->rbnode)) 432 FRAG_CB(parent)->next_frag = fp; 433 else 434 rb_replace_node(&skb->rbnode, &fp->rbnode, 435 &q->rb_fragments); 436 if (q->fragments_tail == skb) 437 q->fragments_tail = fp; 438 skb_morph(skb, head); 439 FRAG_CB(skb)->next_frag = FRAG_CB(head)->next_frag; 440 rb_replace_node(&head->rbnode, &skb->rbnode, 441 &q->rb_fragments); 442 consume_skb(head); 443 head = skb; 444 } 445 WARN_ON(head->ip_defrag_offset != 0); 446 447 delta = -head->truesize; 448 449 /* Head of list must not be cloned. */ 450 if (skb_unclone(head, GFP_ATOMIC)) 451 return NULL; 452 453 delta += head->truesize; 454 if (delta) 455 add_frag_mem_limit(q->fqdir, delta); 456 457 /* If the first fragment is fragmented itself, we split 458 * it to two chunks: the first with data and paged part 459 * and the second, holding only fragments. 460 */ 461 if (skb_has_frag_list(head)) { 462 struct sk_buff *clone; 463 int i, plen = 0; 464 465 clone = alloc_skb(0, GFP_ATOMIC); 466 if (!clone) 467 return NULL; 468 skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; 469 skb_frag_list_init(head); 470 for (i = 0; i < skb_shinfo(head)->nr_frags; i++) 471 plen += skb_frag_size(&skb_shinfo(head)->frags[i]); 472 clone->data_len = head->data_len - plen; 473 clone->len = clone->data_len; 474 head->truesize += clone->truesize; 475 clone->csum = 0; 476 clone->ip_summed = head->ip_summed; 477 add_frag_mem_limit(q->fqdir, clone->truesize); 478 skb_shinfo(head)->frag_list = clone; 479 nextp = &clone->next; 480 } else { 481 nextp = &skb_shinfo(head)->frag_list; 482 } 483 484 return nextp; 485 } 486 EXPORT_SYMBOL(inet_frag_reasm_prepare); 487 488 void inet_frag_reasm_finish(struct inet_frag_queue *q, struct sk_buff *head, 489 void *reasm_data) 490 { 491 struct sk_buff **nextp = (struct sk_buff **)reasm_data; 492 struct rb_node *rbn; 493 struct sk_buff *fp; 494 495 skb_push(head, head->data - skb_network_header(head)); 496 497 /* Traverse the tree in order, to build frag_list. */ 498 fp = FRAG_CB(head)->next_frag; 499 rbn = rb_next(&head->rbnode); 500 rb_erase(&head->rbnode, &q->rb_fragments); 501 while (rbn || fp) { 502 /* fp points to the next sk_buff in the current run; 503 * rbn points to the next run. 504 */ 505 /* Go through the current run. */ 506 while (fp) { 507 *nextp = fp; 508 nextp = &fp->next; 509 fp->prev = NULL; 510 memset(&fp->rbnode, 0, sizeof(fp->rbnode)); 511 fp->sk = NULL; 512 head->data_len += fp->len; 513 head->len += fp->len; 514 if (head->ip_summed != fp->ip_summed) 515 head->ip_summed = CHECKSUM_NONE; 516 else if (head->ip_summed == CHECKSUM_COMPLETE) 517 head->csum = csum_add(head->csum, fp->csum); 518 head->truesize += fp->truesize; 519 fp = FRAG_CB(fp)->next_frag; 520 } 521 /* Move to the next run. */ 522 if (rbn) { 523 struct rb_node *rbnext = rb_next(rbn); 524 525 fp = rb_to_skb(rbn); 526 rb_erase(rbn, &q->rb_fragments); 527 rbn = rbnext; 528 } 529 } 530 sub_frag_mem_limit(q->fqdir, head->truesize); 531 532 *nextp = NULL; 533 skb_mark_not_on_list(head); 534 head->prev = NULL; 535 head->tstamp = q->stamp; 536 } 537 EXPORT_SYMBOL(inet_frag_reasm_finish); 538 539 struct sk_buff *inet_frag_pull_head(struct inet_frag_queue *q) 540 { 541 struct sk_buff *head, *skb; 542 543 head = skb_rb_first(&q->rb_fragments); 544 if (!head) 545 return NULL; 546 skb = FRAG_CB(head)->next_frag; 547 if (skb) 548 rb_replace_node(&head->rbnode, &skb->rbnode, 549 &q->rb_fragments); 550 else 551 rb_erase(&head->rbnode, &q->rb_fragments); 552 memset(&head->rbnode, 0, sizeof(head->rbnode)); 553 barrier(); 554 555 if (head == q->fragments_tail) 556 q->fragments_tail = NULL; 557 558 sub_frag_mem_limit(q->fqdir, head->truesize); 559 560 return head; 561 } 562 EXPORT_SYMBOL(inet_frag_pull_head); 563