1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright (c) 2020 Facebook Inc. 3 4 #include <linux/ethtool_netlink.h> 5 #include <linux/netdevice.h> 6 #include <linux/slab.h> 7 #include <linux/types.h> 8 #include <linux/workqueue.h> 9 #include <net/udp_tunnel.h> 10 #include <net/vxlan.h> 11 12 enum udp_tunnel_nic_table_entry_flags { 13 UDP_TUNNEL_NIC_ENTRY_ADD = BIT(0), 14 UDP_TUNNEL_NIC_ENTRY_DEL = BIT(1), 15 UDP_TUNNEL_NIC_ENTRY_OP_FAIL = BIT(2), 16 UDP_TUNNEL_NIC_ENTRY_FROZEN = BIT(3), 17 }; 18 19 struct udp_tunnel_nic_table_entry { 20 __be16 port; 21 u8 type; 22 u8 use_cnt; 23 u8 flags; 24 u8 hw_priv; 25 }; 26 27 /** 28 * struct udp_tunnel_nic - UDP tunnel port offload state 29 * @work: async work for talking to hardware from process context 30 * @dev: netdev pointer 31 * @need_sync: at least one port start changed 32 * @need_replay: space was freed, we need a replay of all ports 33 * @work_pending: @work is currently scheduled 34 * @n_tables: number of tables under @entries 35 * @missed: bitmap of tables which overflown 36 * @entries: table of tables of ports currently offloaded 37 */ 38 struct udp_tunnel_nic { 39 struct work_struct work; 40 41 struct net_device *dev; 42 43 u8 need_sync:1; 44 u8 need_replay:1; 45 u8 work_pending:1; 46 47 unsigned int n_tables; 48 unsigned long missed; 49 struct udp_tunnel_nic_table_entry **entries; 50 }; 51 52 /* We ensure all work structs are done using driver state, but not the code. 53 * We need a workqueue we can flush before module gets removed. 54 */ 55 static struct workqueue_struct *udp_tunnel_nic_workqueue; 56 57 static const char *udp_tunnel_nic_tunnel_type_name(unsigned int type) 58 { 59 switch (type) { 60 case UDP_TUNNEL_TYPE_VXLAN: 61 return "vxlan"; 62 case UDP_TUNNEL_TYPE_GENEVE: 63 return "geneve"; 64 case UDP_TUNNEL_TYPE_VXLAN_GPE: 65 return "vxlan-gpe"; 66 default: 67 return "unknown"; 68 } 69 } 70 71 static bool 72 udp_tunnel_nic_entry_is_free(struct udp_tunnel_nic_table_entry *entry) 73 { 74 return entry->use_cnt == 0 && !entry->flags; 75 } 76 77 static bool 78 udp_tunnel_nic_entry_is_present(struct udp_tunnel_nic_table_entry *entry) 79 { 80 return entry->use_cnt && !(entry->flags & ~UDP_TUNNEL_NIC_ENTRY_FROZEN); 81 } 82 83 static bool 84 udp_tunnel_nic_entry_is_frozen(struct udp_tunnel_nic_table_entry *entry) 85 { 86 return entry->flags & UDP_TUNNEL_NIC_ENTRY_FROZEN; 87 } 88 89 static void 90 udp_tunnel_nic_entry_freeze_used(struct udp_tunnel_nic_table_entry *entry) 91 { 92 if (!udp_tunnel_nic_entry_is_free(entry)) 93 entry->flags |= UDP_TUNNEL_NIC_ENTRY_FROZEN; 94 } 95 96 static void 97 udp_tunnel_nic_entry_unfreeze(struct udp_tunnel_nic_table_entry *entry) 98 { 99 entry->flags &= ~UDP_TUNNEL_NIC_ENTRY_FROZEN; 100 } 101 102 static bool 103 udp_tunnel_nic_entry_is_queued(struct udp_tunnel_nic_table_entry *entry) 104 { 105 return entry->flags & (UDP_TUNNEL_NIC_ENTRY_ADD | 106 UDP_TUNNEL_NIC_ENTRY_DEL); 107 } 108 109 static void 110 udp_tunnel_nic_entry_queue(struct udp_tunnel_nic *utn, 111 struct udp_tunnel_nic_table_entry *entry, 112 unsigned int flag) 113 { 114 entry->flags |= flag; 115 utn->need_sync = 1; 116 } 117 118 static void 119 udp_tunnel_nic_ti_from_entry(struct udp_tunnel_nic_table_entry *entry, 120 struct udp_tunnel_info *ti) 121 { 122 memset(ti, 0, sizeof(*ti)); 123 ti->port = entry->port; 124 ti->type = entry->type; 125 ti->hw_priv = entry->hw_priv; 126 } 127 128 static bool 129 udp_tunnel_nic_is_empty(struct net_device *dev, struct udp_tunnel_nic *utn) 130 { 131 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 132 unsigned int i, j; 133 134 for (i = 0; i < utn->n_tables; i++) 135 for (j = 0; j < info->tables[i].n_entries; j++) 136 if (!udp_tunnel_nic_entry_is_free(&utn->entries[i][j])) 137 return false; 138 return true; 139 } 140 141 static bool 142 udp_tunnel_nic_should_replay(struct net_device *dev, struct udp_tunnel_nic *utn) 143 { 144 const struct udp_tunnel_nic_table_info *table; 145 unsigned int i, j; 146 147 if (!utn->missed) 148 return false; 149 150 for (i = 0; i < utn->n_tables; i++) { 151 table = &dev->udp_tunnel_nic_info->tables[i]; 152 if (!test_bit(i, &utn->missed)) 153 continue; 154 155 for (j = 0; j < table->n_entries; j++) 156 if (udp_tunnel_nic_entry_is_free(&utn->entries[i][j])) 157 return true; 158 } 159 160 return false; 161 } 162 163 static void 164 __udp_tunnel_nic_get_port(struct net_device *dev, unsigned int table, 165 unsigned int idx, struct udp_tunnel_info *ti) 166 { 167 struct udp_tunnel_nic_table_entry *entry; 168 struct udp_tunnel_nic *utn; 169 170 utn = dev->udp_tunnel_nic; 171 entry = &utn->entries[table][idx]; 172 173 if (entry->use_cnt) 174 udp_tunnel_nic_ti_from_entry(entry, ti); 175 } 176 177 static void 178 __udp_tunnel_nic_set_port_priv(struct net_device *dev, unsigned int table, 179 unsigned int idx, u8 priv) 180 { 181 dev->udp_tunnel_nic->entries[table][idx].hw_priv = priv; 182 } 183 184 static void 185 udp_tunnel_nic_entry_update_done(struct udp_tunnel_nic_table_entry *entry, 186 int err) 187 { 188 bool dodgy = entry->flags & UDP_TUNNEL_NIC_ENTRY_OP_FAIL; 189 190 WARN_ON_ONCE(entry->flags & UDP_TUNNEL_NIC_ENTRY_ADD && 191 entry->flags & UDP_TUNNEL_NIC_ENTRY_DEL); 192 193 if (entry->flags & UDP_TUNNEL_NIC_ENTRY_ADD && 194 (!err || (err == -EEXIST && dodgy))) 195 entry->flags &= ~UDP_TUNNEL_NIC_ENTRY_ADD; 196 197 if (entry->flags & UDP_TUNNEL_NIC_ENTRY_DEL && 198 (!err || (err == -ENOENT && dodgy))) 199 entry->flags &= ~UDP_TUNNEL_NIC_ENTRY_DEL; 200 201 if (!err) 202 entry->flags &= ~UDP_TUNNEL_NIC_ENTRY_OP_FAIL; 203 else 204 entry->flags |= UDP_TUNNEL_NIC_ENTRY_OP_FAIL; 205 } 206 207 static void 208 udp_tunnel_nic_device_sync_one(struct net_device *dev, 209 struct udp_tunnel_nic *utn, 210 unsigned int table, unsigned int idx) 211 { 212 struct udp_tunnel_nic_table_entry *entry; 213 struct udp_tunnel_info ti; 214 int err; 215 216 entry = &utn->entries[table][idx]; 217 if (!udp_tunnel_nic_entry_is_queued(entry)) 218 return; 219 220 udp_tunnel_nic_ti_from_entry(entry, &ti); 221 if (entry->flags & UDP_TUNNEL_NIC_ENTRY_ADD) 222 err = dev->udp_tunnel_nic_info->set_port(dev, table, idx, &ti); 223 else 224 err = dev->udp_tunnel_nic_info->unset_port(dev, table, idx, 225 &ti); 226 udp_tunnel_nic_entry_update_done(entry, err); 227 228 if (err) 229 netdev_warn(dev, 230 "UDP tunnel port sync failed port %d type %s: %d\n", 231 be16_to_cpu(entry->port), 232 udp_tunnel_nic_tunnel_type_name(entry->type), 233 err); 234 } 235 236 static void 237 udp_tunnel_nic_device_sync_by_port(struct net_device *dev, 238 struct udp_tunnel_nic *utn) 239 { 240 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 241 unsigned int i, j; 242 243 for (i = 0; i < utn->n_tables; i++) 244 for (j = 0; j < info->tables[i].n_entries; j++) 245 udp_tunnel_nic_device_sync_one(dev, utn, i, j); 246 } 247 248 static void 249 udp_tunnel_nic_device_sync_by_table(struct net_device *dev, 250 struct udp_tunnel_nic *utn) 251 { 252 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 253 unsigned int i, j; 254 int err; 255 256 for (i = 0; i < utn->n_tables; i++) { 257 /* Find something that needs sync in this table */ 258 for (j = 0; j < info->tables[i].n_entries; j++) 259 if (udp_tunnel_nic_entry_is_queued(&utn->entries[i][j])) 260 break; 261 if (j == info->tables[i].n_entries) 262 continue; 263 264 err = info->sync_table(dev, i); 265 if (err) 266 netdev_warn(dev, "UDP tunnel port sync failed for table %d: %d\n", 267 i, err); 268 269 for (j = 0; j < info->tables[i].n_entries; j++) { 270 struct udp_tunnel_nic_table_entry *entry; 271 272 entry = &utn->entries[i][j]; 273 if (udp_tunnel_nic_entry_is_queued(entry)) 274 udp_tunnel_nic_entry_update_done(entry, err); 275 } 276 } 277 } 278 279 static void 280 __udp_tunnel_nic_device_sync(struct net_device *dev, struct udp_tunnel_nic *utn) 281 { 282 if (!utn->need_sync) 283 return; 284 285 if (dev->udp_tunnel_nic_info->sync_table) 286 udp_tunnel_nic_device_sync_by_table(dev, utn); 287 else 288 udp_tunnel_nic_device_sync_by_port(dev, utn); 289 290 utn->need_sync = 0; 291 /* Can't replay directly here, in case we come from the tunnel driver's 292 * notification - trying to replay may deadlock inside tunnel driver. 293 */ 294 utn->need_replay = udp_tunnel_nic_should_replay(dev, utn); 295 } 296 297 static void 298 udp_tunnel_nic_device_sync(struct net_device *dev, struct udp_tunnel_nic *utn) 299 { 300 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 301 bool may_sleep; 302 303 if (!utn->need_sync) 304 return; 305 306 /* Drivers which sleep in the callback need to update from 307 * the workqueue, if we come from the tunnel driver's notification. 308 */ 309 may_sleep = info->flags & UDP_TUNNEL_NIC_INFO_MAY_SLEEP; 310 if (!may_sleep) 311 __udp_tunnel_nic_device_sync(dev, utn); 312 if (may_sleep || utn->need_replay) { 313 queue_work(udp_tunnel_nic_workqueue, &utn->work); 314 utn->work_pending = 1; 315 } 316 } 317 318 static bool 319 udp_tunnel_nic_table_is_capable(const struct udp_tunnel_nic_table_info *table, 320 struct udp_tunnel_info *ti) 321 { 322 return table->tunnel_types & ti->type; 323 } 324 325 static bool 326 udp_tunnel_nic_is_capable(struct net_device *dev, struct udp_tunnel_nic *utn, 327 struct udp_tunnel_info *ti) 328 { 329 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 330 unsigned int i; 331 332 /* Special case IPv4-only NICs */ 333 if (info->flags & UDP_TUNNEL_NIC_INFO_IPV4_ONLY && 334 ti->sa_family != AF_INET) 335 return false; 336 337 for (i = 0; i < utn->n_tables; i++) 338 if (udp_tunnel_nic_table_is_capable(&info->tables[i], ti)) 339 return true; 340 return false; 341 } 342 343 static int 344 udp_tunnel_nic_has_collision(struct net_device *dev, struct udp_tunnel_nic *utn, 345 struct udp_tunnel_info *ti) 346 { 347 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 348 struct udp_tunnel_nic_table_entry *entry; 349 unsigned int i, j; 350 351 for (i = 0; i < utn->n_tables; i++) 352 for (j = 0; j < info->tables[i].n_entries; j++) { 353 entry = &utn->entries[i][j]; 354 355 if (!udp_tunnel_nic_entry_is_free(entry) && 356 entry->port == ti->port && 357 entry->type != ti->type) { 358 __set_bit(i, &utn->missed); 359 return true; 360 } 361 } 362 return false; 363 } 364 365 static void 366 udp_tunnel_nic_entry_adj(struct udp_tunnel_nic *utn, 367 unsigned int table, unsigned int idx, int use_cnt_adj) 368 { 369 struct udp_tunnel_nic_table_entry *entry = &utn->entries[table][idx]; 370 bool dodgy = entry->flags & UDP_TUNNEL_NIC_ENTRY_OP_FAIL; 371 unsigned int from, to; 372 373 /* If not going from used to unused or vice versa - all done. 374 * For dodgy entries make sure we try to sync again (queue the entry). 375 */ 376 entry->use_cnt += use_cnt_adj; 377 if (!dodgy && !entry->use_cnt == !(entry->use_cnt - use_cnt_adj)) 378 return; 379 380 /* Cancel the op before it was sent to the device, if possible, 381 * otherwise we'd need to take special care to issue commands 382 * in the same order the ports arrived. 383 */ 384 if (use_cnt_adj < 0) { 385 from = UDP_TUNNEL_NIC_ENTRY_ADD; 386 to = UDP_TUNNEL_NIC_ENTRY_DEL; 387 } else { 388 from = UDP_TUNNEL_NIC_ENTRY_DEL; 389 to = UDP_TUNNEL_NIC_ENTRY_ADD; 390 } 391 392 if (entry->flags & from) { 393 entry->flags &= ~from; 394 if (!dodgy) 395 return; 396 } 397 398 udp_tunnel_nic_entry_queue(utn, entry, to); 399 } 400 401 static bool 402 udp_tunnel_nic_entry_try_adj(struct udp_tunnel_nic *utn, 403 unsigned int table, unsigned int idx, 404 struct udp_tunnel_info *ti, int use_cnt_adj) 405 { 406 struct udp_tunnel_nic_table_entry *entry = &utn->entries[table][idx]; 407 408 if (udp_tunnel_nic_entry_is_free(entry) || 409 entry->port != ti->port || 410 entry->type != ti->type) 411 return false; 412 413 if (udp_tunnel_nic_entry_is_frozen(entry)) 414 return true; 415 416 udp_tunnel_nic_entry_adj(utn, table, idx, use_cnt_adj); 417 return true; 418 } 419 420 /* Try to find existing matching entry and adjust its use count, instead of 421 * adding a new one. Returns true if entry was found. In case of delete the 422 * entry may have gotten removed in the process, in which case it will be 423 * queued for removal. 424 */ 425 static bool 426 udp_tunnel_nic_try_existing(struct net_device *dev, struct udp_tunnel_nic *utn, 427 struct udp_tunnel_info *ti, int use_cnt_adj) 428 { 429 const struct udp_tunnel_nic_table_info *table; 430 unsigned int i, j; 431 432 for (i = 0; i < utn->n_tables; i++) { 433 table = &dev->udp_tunnel_nic_info->tables[i]; 434 if (!udp_tunnel_nic_table_is_capable(table, ti)) 435 continue; 436 437 for (j = 0; j < table->n_entries; j++) 438 if (udp_tunnel_nic_entry_try_adj(utn, i, j, ti, 439 use_cnt_adj)) 440 return true; 441 } 442 443 return false; 444 } 445 446 static bool 447 udp_tunnel_nic_add_existing(struct net_device *dev, struct udp_tunnel_nic *utn, 448 struct udp_tunnel_info *ti) 449 { 450 return udp_tunnel_nic_try_existing(dev, utn, ti, +1); 451 } 452 453 static bool 454 udp_tunnel_nic_del_existing(struct net_device *dev, struct udp_tunnel_nic *utn, 455 struct udp_tunnel_info *ti) 456 { 457 return udp_tunnel_nic_try_existing(dev, utn, ti, -1); 458 } 459 460 static bool 461 udp_tunnel_nic_add_new(struct net_device *dev, struct udp_tunnel_nic *utn, 462 struct udp_tunnel_info *ti) 463 { 464 const struct udp_tunnel_nic_table_info *table; 465 unsigned int i, j; 466 467 for (i = 0; i < utn->n_tables; i++) { 468 table = &dev->udp_tunnel_nic_info->tables[i]; 469 if (!udp_tunnel_nic_table_is_capable(table, ti)) 470 continue; 471 472 for (j = 0; j < table->n_entries; j++) { 473 struct udp_tunnel_nic_table_entry *entry; 474 475 entry = &utn->entries[i][j]; 476 if (!udp_tunnel_nic_entry_is_free(entry)) 477 continue; 478 479 entry->port = ti->port; 480 entry->type = ti->type; 481 entry->use_cnt = 1; 482 udp_tunnel_nic_entry_queue(utn, entry, 483 UDP_TUNNEL_NIC_ENTRY_ADD); 484 return true; 485 } 486 487 /* The different table may still fit this port in, but there 488 * are no devices currently which have multiple tables accepting 489 * the same tunnel type, and false positives are okay. 490 */ 491 __set_bit(i, &utn->missed); 492 } 493 494 return false; 495 } 496 497 static void 498 __udp_tunnel_nic_add_port(struct net_device *dev, struct udp_tunnel_info *ti) 499 { 500 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 501 struct udp_tunnel_nic *utn; 502 503 utn = dev->udp_tunnel_nic; 504 if (!utn) 505 return; 506 if (!netif_running(dev) && info->flags & UDP_TUNNEL_NIC_INFO_OPEN_ONLY) 507 return; 508 if (info->flags & UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN && 509 ti->port == htons(IANA_VXLAN_UDP_PORT)) { 510 if (ti->type != UDP_TUNNEL_TYPE_VXLAN) 511 netdev_warn(dev, "device assumes port 4789 will be used by vxlan tunnels\n"); 512 return; 513 } 514 515 if (!udp_tunnel_nic_is_capable(dev, utn, ti)) 516 return; 517 518 /* It may happen that a tunnel of one type is removed and different 519 * tunnel type tries to reuse its port before the device was informed. 520 * Rely on utn->missed to re-add this port later. 521 */ 522 if (udp_tunnel_nic_has_collision(dev, utn, ti)) 523 return; 524 525 if (!udp_tunnel_nic_add_existing(dev, utn, ti)) 526 udp_tunnel_nic_add_new(dev, utn, ti); 527 528 udp_tunnel_nic_device_sync(dev, utn); 529 } 530 531 static void 532 __udp_tunnel_nic_del_port(struct net_device *dev, struct udp_tunnel_info *ti) 533 { 534 struct udp_tunnel_nic *utn; 535 536 utn = dev->udp_tunnel_nic; 537 if (!utn) 538 return; 539 540 if (!udp_tunnel_nic_is_capable(dev, utn, ti)) 541 return; 542 543 udp_tunnel_nic_del_existing(dev, utn, ti); 544 545 udp_tunnel_nic_device_sync(dev, utn); 546 } 547 548 static void __udp_tunnel_nic_reset_ntf(struct net_device *dev) 549 { 550 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 551 struct udp_tunnel_nic *utn; 552 unsigned int i, j; 553 554 ASSERT_RTNL(); 555 556 utn = dev->udp_tunnel_nic; 557 if (!utn) 558 return; 559 560 utn->need_sync = false; 561 for (i = 0; i < utn->n_tables; i++) 562 for (j = 0; j < info->tables[i].n_entries; j++) { 563 struct udp_tunnel_nic_table_entry *entry; 564 565 entry = &utn->entries[i][j]; 566 567 entry->flags &= ~(UDP_TUNNEL_NIC_ENTRY_DEL | 568 UDP_TUNNEL_NIC_ENTRY_OP_FAIL); 569 /* We don't release rtnl across ops */ 570 WARN_ON(entry->flags & UDP_TUNNEL_NIC_ENTRY_FROZEN); 571 if (!entry->use_cnt) 572 continue; 573 574 udp_tunnel_nic_entry_queue(utn, entry, 575 UDP_TUNNEL_NIC_ENTRY_ADD); 576 } 577 578 __udp_tunnel_nic_device_sync(dev, utn); 579 } 580 581 static size_t 582 __udp_tunnel_nic_dump_size(struct net_device *dev, unsigned int table) 583 { 584 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 585 struct udp_tunnel_nic *utn; 586 unsigned int j; 587 size_t size; 588 589 utn = dev->udp_tunnel_nic; 590 if (!utn) 591 return 0; 592 593 size = 0; 594 for (j = 0; j < info->tables[table].n_entries; j++) { 595 if (!udp_tunnel_nic_entry_is_present(&utn->entries[table][j])) 596 continue; 597 598 size += nla_total_size(0) + /* _TABLE_ENTRY */ 599 nla_total_size(sizeof(__be16)) + /* _ENTRY_PORT */ 600 nla_total_size(sizeof(u32)); /* _ENTRY_TYPE */ 601 } 602 603 return size; 604 } 605 606 static int 607 __udp_tunnel_nic_dump_write(struct net_device *dev, unsigned int table, 608 struct sk_buff *skb) 609 { 610 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 611 struct udp_tunnel_nic *utn; 612 struct nlattr *nest; 613 unsigned int j; 614 615 utn = dev->udp_tunnel_nic; 616 if (!utn) 617 return 0; 618 619 for (j = 0; j < info->tables[table].n_entries; j++) { 620 if (!udp_tunnel_nic_entry_is_present(&utn->entries[table][j])) 621 continue; 622 623 nest = nla_nest_start(skb, ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY); 624 625 if (nla_put_be16(skb, ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT, 626 utn->entries[table][j].port) || 627 nla_put_u32(skb, ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE, 628 ilog2(utn->entries[table][j].type))) 629 goto err_cancel; 630 631 nla_nest_end(skb, nest); 632 } 633 634 return 0; 635 636 err_cancel: 637 nla_nest_cancel(skb, nest); 638 return -EMSGSIZE; 639 } 640 641 static const struct udp_tunnel_nic_ops __udp_tunnel_nic_ops = { 642 .get_port = __udp_tunnel_nic_get_port, 643 .set_port_priv = __udp_tunnel_nic_set_port_priv, 644 .add_port = __udp_tunnel_nic_add_port, 645 .del_port = __udp_tunnel_nic_del_port, 646 .reset_ntf = __udp_tunnel_nic_reset_ntf, 647 .dump_size = __udp_tunnel_nic_dump_size, 648 .dump_write = __udp_tunnel_nic_dump_write, 649 }; 650 651 static void 652 udp_tunnel_nic_flush(struct net_device *dev, struct udp_tunnel_nic *utn) 653 { 654 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 655 unsigned int i, j; 656 657 for (i = 0; i < utn->n_tables; i++) 658 for (j = 0; j < info->tables[i].n_entries; j++) { 659 int adj_cnt = -utn->entries[i][j].use_cnt; 660 661 if (adj_cnt) 662 udp_tunnel_nic_entry_adj(utn, i, j, adj_cnt); 663 } 664 665 __udp_tunnel_nic_device_sync(dev, utn); 666 667 for (i = 0; i < utn->n_tables; i++) 668 memset(utn->entries[i], 0, array_size(info->tables[i].n_entries, 669 sizeof(**utn->entries))); 670 WARN_ON(utn->need_sync); 671 utn->need_replay = 0; 672 } 673 674 static void 675 udp_tunnel_nic_replay(struct net_device *dev, struct udp_tunnel_nic *utn) 676 { 677 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 678 unsigned int i, j; 679 680 /* Freeze all the ports we are already tracking so that the replay 681 * does not double up the refcount. 682 */ 683 for (i = 0; i < utn->n_tables; i++) 684 for (j = 0; j < info->tables[i].n_entries; j++) 685 udp_tunnel_nic_entry_freeze_used(&utn->entries[i][j]); 686 utn->missed = 0; 687 utn->need_replay = 0; 688 689 udp_tunnel_get_rx_info(dev); 690 691 for (i = 0; i < utn->n_tables; i++) 692 for (j = 0; j < info->tables[i].n_entries; j++) 693 udp_tunnel_nic_entry_unfreeze(&utn->entries[i][j]); 694 } 695 696 static void udp_tunnel_nic_device_sync_work(struct work_struct *work) 697 { 698 struct udp_tunnel_nic *utn = 699 container_of(work, struct udp_tunnel_nic, work); 700 701 rtnl_lock(); 702 utn->work_pending = 0; 703 __udp_tunnel_nic_device_sync(utn->dev, utn); 704 705 if (utn->need_replay) 706 udp_tunnel_nic_replay(utn->dev, utn); 707 rtnl_unlock(); 708 } 709 710 static struct udp_tunnel_nic * 711 udp_tunnel_nic_alloc(const struct udp_tunnel_nic_info *info, 712 unsigned int n_tables) 713 { 714 struct udp_tunnel_nic *utn; 715 unsigned int i; 716 717 utn = kzalloc(sizeof(*utn), GFP_KERNEL); 718 if (!utn) 719 return NULL; 720 utn->n_tables = n_tables; 721 INIT_WORK(&utn->work, udp_tunnel_nic_device_sync_work); 722 723 utn->entries = kmalloc_array(n_tables, sizeof(void *), GFP_KERNEL); 724 if (!utn->entries) 725 goto err_free_utn; 726 727 for (i = 0; i < n_tables; i++) { 728 utn->entries[i] = kcalloc(info->tables[i].n_entries, 729 sizeof(*utn->entries[i]), GFP_KERNEL); 730 if (!utn->entries[i]) 731 goto err_free_prev_entries; 732 } 733 734 return utn; 735 736 err_free_prev_entries: 737 while (i--) 738 kfree(utn->entries[i]); 739 kfree(utn->entries); 740 err_free_utn: 741 kfree(utn); 742 return NULL; 743 } 744 745 static int udp_tunnel_nic_register(struct net_device *dev) 746 { 747 const struct udp_tunnel_nic_info *info = dev->udp_tunnel_nic_info; 748 struct udp_tunnel_nic *utn; 749 unsigned int n_tables, i; 750 751 BUILD_BUG_ON(sizeof(utn->missed) * BITS_PER_BYTE < 752 UDP_TUNNEL_NIC_MAX_TABLES); 753 754 if (WARN_ON(!info->set_port != !info->unset_port) || 755 WARN_ON(!info->set_port == !info->sync_table) || 756 WARN_ON(!info->tables[0].n_entries)) 757 return -EINVAL; 758 759 n_tables = 1; 760 for (i = 1; i < UDP_TUNNEL_NIC_MAX_TABLES; i++) { 761 if (!info->tables[i].n_entries) 762 continue; 763 764 n_tables++; 765 if (WARN_ON(!info->tables[i - 1].n_entries)) 766 return -EINVAL; 767 } 768 769 utn = udp_tunnel_nic_alloc(info, n_tables); 770 if (!utn) 771 return -ENOMEM; 772 773 utn->dev = dev; 774 dev_hold(dev); 775 dev->udp_tunnel_nic = utn; 776 777 if (!(info->flags & UDP_TUNNEL_NIC_INFO_OPEN_ONLY)) 778 udp_tunnel_get_rx_info(dev); 779 780 return 0; 781 } 782 783 static void 784 udp_tunnel_nic_unregister(struct net_device *dev, struct udp_tunnel_nic *utn) 785 { 786 unsigned int i; 787 788 /* Flush before we check work, so we don't waste time adding entries 789 * from the work which we will boot immediately. 790 */ 791 udp_tunnel_nic_flush(dev, utn); 792 793 /* Wait for the work to be done using the state, netdev core will 794 * retry unregister until we give up our reference on this device. 795 */ 796 if (utn->work_pending) 797 return; 798 799 for (i = 0; i < utn->n_tables; i++) 800 kfree(utn->entries[i]); 801 kfree(utn->entries); 802 kfree(utn); 803 dev->udp_tunnel_nic = NULL; 804 dev_put(dev); 805 } 806 807 static int 808 udp_tunnel_nic_netdevice_event(struct notifier_block *unused, 809 unsigned long event, void *ptr) 810 { 811 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 812 const struct udp_tunnel_nic_info *info; 813 struct udp_tunnel_nic *utn; 814 815 info = dev->udp_tunnel_nic_info; 816 if (!info) 817 return NOTIFY_DONE; 818 819 if (event == NETDEV_REGISTER) { 820 int err; 821 822 err = udp_tunnel_nic_register(dev); 823 if (err) 824 netdev_WARN(dev, "failed to register for UDP tunnel offloads: %d", err); 825 return notifier_from_errno(err); 826 } 827 /* All other events will need the udp_tunnel_nic state */ 828 utn = dev->udp_tunnel_nic; 829 if (!utn) 830 return NOTIFY_DONE; 831 832 if (event == NETDEV_UNREGISTER) { 833 udp_tunnel_nic_unregister(dev, utn); 834 return NOTIFY_OK; 835 } 836 837 /* All other events only matter if NIC has to be programmed open */ 838 if (!(info->flags & UDP_TUNNEL_NIC_INFO_OPEN_ONLY)) 839 return NOTIFY_DONE; 840 841 if (event == NETDEV_UP) { 842 WARN_ON(!udp_tunnel_nic_is_empty(dev, utn)); 843 udp_tunnel_get_rx_info(dev); 844 return NOTIFY_OK; 845 } 846 if (event == NETDEV_GOING_DOWN) { 847 udp_tunnel_nic_flush(dev, utn); 848 return NOTIFY_OK; 849 } 850 851 return NOTIFY_DONE; 852 } 853 854 static struct notifier_block udp_tunnel_nic_notifier_block __read_mostly = { 855 .notifier_call = udp_tunnel_nic_netdevice_event, 856 }; 857 858 static int __init udp_tunnel_nic_init_module(void) 859 { 860 int err; 861 862 udp_tunnel_nic_workqueue = alloc_workqueue("udp_tunnel_nic", 0, 0); 863 if (!udp_tunnel_nic_workqueue) 864 return -ENOMEM; 865 866 rtnl_lock(); 867 udp_tunnel_nic_ops = &__udp_tunnel_nic_ops; 868 rtnl_unlock(); 869 870 err = register_netdevice_notifier(&udp_tunnel_nic_notifier_block); 871 if (err) 872 goto err_unset_ops; 873 874 return 0; 875 876 err_unset_ops: 877 rtnl_lock(); 878 udp_tunnel_nic_ops = NULL; 879 rtnl_unlock(); 880 destroy_workqueue(udp_tunnel_nic_workqueue); 881 return err; 882 } 883 late_initcall(udp_tunnel_nic_init_module); 884 885 static void __exit udp_tunnel_nic_cleanup_module(void) 886 { 887 unregister_netdevice_notifier(&udp_tunnel_nic_notifier_block); 888 889 rtnl_lock(); 890 udp_tunnel_nic_ops = NULL; 891 rtnl_unlock(); 892 893 destroy_workqueue(udp_tunnel_nic_workqueue); 894 } 895 module_exit(udp_tunnel_nic_cleanup_module); 896 897 MODULE_LICENSE("GPL"); 898