Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa: deduplicate code adding / deleting the port address to fdb

The sequence
if (dsa_switch_supports_uc_filtering(ds))
dsa_port_standalone_host_fdb_add(dp, addr, 0);
if (!ether_addr_equal(addr, conduit->dev_addr))
dev_uc_add(conduit, addr);
is executed both in dsa_user_open() and dsa_user_set_mac_addr().

Its reverse is executed both in dsa_user_close() and
dsa_user_set_mac_addr().

Refactor these sequences into new functions dsa_user_host_uc_install()
and dsa_user_host_uc_uninstall().

Signed-off-by: Marek Behún <kabel@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Marek Behún and committed by
David S. Miller
77f75412 395059c5

+52 -49
+52 -49
net/dsa/user.c
··· 355 355 return READ_ONCE(dsa_user_to_conduit(dev)->ifindex); 356 356 } 357 357 358 - static int dsa_user_open(struct net_device *dev) 358 + static int dsa_user_host_uc_install(struct net_device *dev, const u8 *addr) 359 359 { 360 360 struct net_device *conduit = dsa_user_to_conduit(dev); 361 361 struct dsa_port *dp = dsa_user_to_port(dev); 362 362 struct dsa_switch *ds = dp->ds; 363 + int err; 364 + 365 + if (dsa_switch_supports_uc_filtering(ds)) { 366 + err = dsa_port_standalone_host_fdb_add(dp, addr, 0); 367 + if (err) 368 + goto out; 369 + } 370 + 371 + if (!ether_addr_equal(addr, conduit->dev_addr)) { 372 + err = dev_uc_add(conduit, addr); 373 + if (err < 0) 374 + goto del_host_addr; 375 + } 376 + 377 + return 0; 378 + 379 + del_host_addr: 380 + if (dsa_switch_supports_uc_filtering(ds)) 381 + dsa_port_standalone_host_fdb_del(dp, addr, 0); 382 + out: 383 + return err; 384 + } 385 + 386 + static void dsa_user_host_uc_uninstall(struct net_device *dev) 387 + { 388 + struct net_device *conduit = dsa_user_to_conduit(dev); 389 + struct dsa_port *dp = dsa_user_to_port(dev); 390 + struct dsa_switch *ds = dp->ds; 391 + 392 + if (!ether_addr_equal(dev->dev_addr, conduit->dev_addr)) 393 + dev_uc_del(conduit, dev->dev_addr); 394 + 395 + if (dsa_switch_supports_uc_filtering(ds)) 396 + dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0); 397 + } 398 + 399 + static int dsa_user_open(struct net_device *dev) 400 + { 401 + struct net_device *conduit = dsa_user_to_conduit(dev); 402 + struct dsa_port *dp = dsa_user_to_port(dev); 363 403 int err; 364 404 365 405 err = dev_open(conduit, NULL); ··· 408 368 goto out; 409 369 } 410 370 411 - if (dsa_switch_supports_uc_filtering(ds)) { 412 - err = dsa_port_standalone_host_fdb_add(dp, dev->dev_addr, 0); 413 - if (err) 414 - goto out; 415 - } 416 - 417 - if (!ether_addr_equal(dev->dev_addr, conduit->dev_addr)) { 418 - err = dev_uc_add(conduit, dev->dev_addr); 419 - if (err < 0) 420 - goto del_host_addr; 421 - } 371 + err = dsa_user_host_uc_install(dev, dev->dev_addr); 372 + if (err) 373 + goto out; 422 374 423 375 err = dsa_port_enable_rt(dp, dev->phydev); 424 376 if (err) 425 - goto del_unicast; 377 + goto out_del_host_uc; 426 378 427 379 return 0; 428 380 429 - del_unicast: 430 - if (!ether_addr_equal(dev->dev_addr, conduit->dev_addr)) 431 - dev_uc_del(conduit, dev->dev_addr); 432 - del_host_addr: 433 - if (dsa_switch_supports_uc_filtering(ds)) 434 - dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0); 381 + out_del_host_uc: 382 + dsa_user_host_uc_uninstall(dev); 435 383 out: 436 384 return err; 437 385 } 438 386 439 387 static int dsa_user_close(struct net_device *dev) 440 388 { 441 - struct net_device *conduit = dsa_user_to_conduit(dev); 442 389 struct dsa_port *dp = dsa_user_to_port(dev); 443 - struct dsa_switch *ds = dp->ds; 444 390 445 391 dsa_port_disable_rt(dp); 446 392 447 - if (!ether_addr_equal(dev->dev_addr, conduit->dev_addr)) 448 - dev_uc_del(conduit, dev->dev_addr); 449 - 450 - if (dsa_switch_supports_uc_filtering(ds)) 451 - dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0); 393 + dsa_user_host_uc_uninstall(dev); 452 394 453 395 return 0; 454 396 } ··· 470 448 471 449 static int dsa_user_set_mac_address(struct net_device *dev, void *a) 472 450 { 473 - struct net_device *conduit = dsa_user_to_conduit(dev); 474 451 struct dsa_port *dp = dsa_user_to_port(dev); 475 452 struct dsa_switch *ds = dp->ds; 476 453 struct sockaddr *addr = a; ··· 491 470 if (!(dev->flags & IFF_UP)) 492 471 goto out_change_dev_addr; 493 472 494 - if (dsa_switch_supports_uc_filtering(ds)) { 495 - err = dsa_port_standalone_host_fdb_add(dp, addr->sa_data, 0); 496 - if (err) 497 - return err; 498 - } 473 + err = dsa_user_host_uc_install(dev, addr->sa_data); 474 + if (err) 475 + return err; 499 476 500 - if (!ether_addr_equal(addr->sa_data, conduit->dev_addr)) { 501 - err = dev_uc_add(conduit, addr->sa_data); 502 - if (err < 0) 503 - goto del_unicast; 504 - } 505 - 506 - if (!ether_addr_equal(dev->dev_addr, conduit->dev_addr)) 507 - dev_uc_del(conduit, dev->dev_addr); 508 - 509 - if (dsa_switch_supports_uc_filtering(ds)) 510 - dsa_port_standalone_host_fdb_del(dp, dev->dev_addr, 0); 477 + dsa_user_host_uc_uninstall(dev); 511 478 512 479 out_change_dev_addr: 513 480 eth_hw_addr_set(dev, addr->sa_data); 514 481 515 482 return 0; 516 - 517 - del_unicast: 518 - if (dsa_switch_supports_uc_filtering(ds)) 519 - dsa_port_standalone_host_fdb_del(dp, addr->sa_data, 0); 520 - 521 - return err; 522 483 } 523 484 524 485 struct dsa_user_dump_ctx {