lkml.org 
[lkml]   [2022]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next v6 7/9] net: marvell: prestera: add stub handler neighbour events
    Date
    Actual handler will be added in next patches

    Co-developed-by: Taras Chornyi <tchornyi@marvell.com>
    Signed-off-by: Taras Chornyi <tchornyi@marvell.com>
    Co-developed-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
    Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
    Signed-off-by: Yevhen Orlov <yevhen.orlov@plvision.eu>
    ---
    .../net/ethernet/marvell/prestera/prestera.h | 1 +
    .../marvell/prestera/prestera_router.c | 59 +++++++++++++++++++
    2 files changed, 60 insertions(+)

    diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h
    index fe0d6001a6b6..2f2f80e7e358 100644
    --- a/drivers/net/ethernet/marvell/prestera/prestera.h
    +++ b/drivers/net/ethernet/marvell/prestera/prestera.h
    @@ -320,6 +320,7 @@ struct prestera_router {
    struct notifier_block inetaddr_nb;
    struct notifier_block inetaddr_valid_nb;
    struct notifier_block fib_nb;
    + struct notifier_block netevent_nb;
    u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */
    unsigned long nhgrp_hw_cache_kick; /* jiffies */
    };
    diff --git a/drivers/net/ethernet/marvell/prestera/prestera_router.c b/drivers/net/ethernet/marvell/prestera/prestera_router.c
    index 15958f83107e..a6af3b53838e 100644
    --- a/drivers/net/ethernet/marvell/prestera/prestera_router.c
    +++ b/drivers/net/ethernet/marvell/prestera/prestera_router.c
    @@ -8,6 +8,7 @@
    #include <net/switchdev.h>
    #include <linux/rhashtable.h>
    #include <net/nexthop.h>
    +#include <net/netevent.h>

    #include "prestera.h"
    #include "prestera_router_hw.h"
    @@ -610,6 +611,56 @@ static int __prestera_router_fib_event(struct notifier_block *nb,
    return NOTIFY_DONE;
    }

    +struct prestera_netevent_work {
    + struct work_struct work;
    + struct prestera_switch *sw;
    + struct neighbour *n;
    +};
    +
    +static void prestera_router_neigh_event_work(struct work_struct *work)
    +{
    + struct prestera_netevent_work *net_work =
    + container_of(work, struct prestera_netevent_work, work);
    + struct neighbour *n = net_work->n;
    +
    + /* neigh - its not hw related object. It stored only in kernel. So... */
    + rtnl_lock();
    +
    + /* TODO: handler */
    +
    + neigh_release(n);
    + rtnl_unlock();
    + kfree(net_work);
    +}
    +
    +static int prestera_router_netevent_event(struct notifier_block *nb,
    + unsigned long event, void *ptr)
    +{
    + struct prestera_netevent_work *net_work;
    + struct prestera_router *router;
    + struct neighbour *n = ptr;
    +
    + router = container_of(nb, struct prestera_router, netevent_nb);
    +
    + switch (event) {
    + case NETEVENT_NEIGH_UPDATE:
    + if (n->tbl->family != AF_INET)
    + return NOTIFY_DONE;
    +
    + net_work = kzalloc(sizeof(*net_work), GFP_ATOMIC);
    + if (WARN_ON(!net_work))
    + return NOTIFY_BAD;
    +
    + neigh_clone(n);
    + net_work->n = n;
    + net_work->sw = router->sw;
    + INIT_WORK(&net_work->work, prestera_router_neigh_event_work);
    + prestera_queue_work(&net_work->work);
    + }
    +
    + return NOTIFY_DONE;
    +}
    +
    int prestera_router_init(struct prestera_switch *sw)
    {
    struct prestera_router *router;
    @@ -648,6 +699,11 @@ int prestera_router_init(struct prestera_switch *sw)
    if (err)
    goto err_register_inetaddr_notifier;

    + router->netevent_nb.notifier_call = prestera_router_netevent_event;
    + err = register_netevent_notifier(&router->netevent_nb);
    + if (err)
    + goto err_register_netevent_notifier;
    +
    router->fib_nb.notifier_call = __prestera_router_fib_event;
    err = register_fib_notifier(&init_net, &router->fib_nb,
    /* TODO: flush fib entries */ NULL, NULL);
    @@ -657,6 +713,8 @@ int prestera_router_init(struct prestera_switch *sw)
    return 0;

    err_register_fib_notifier:
    + unregister_netevent_notifier(&router->netevent_nb);
    +err_register_netevent_notifier:
    unregister_inetaddr_notifier(&router->inetaddr_nb);
    err_register_inetaddr_notifier:
    unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
    @@ -674,6 +732,7 @@ int prestera_router_init(struct prestera_switch *sw)
    void prestera_router_fini(struct prestera_switch *sw)
    {
    unregister_fib_notifier(&init_net, &sw->router->fib_nb);
    + unregister_netevent_notifier(&sw->router->netevent_nb);
    unregister_inetaddr_notifier(&sw->router->inetaddr_nb);
    unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb);
    prestera_queue_drain();
    --
    2.17.1
    \
     
     \ /
      Last update: 2022-09-18 21:49    [W:4.570 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site