Commit 8b1ef491 authored by Yevhen Orlov's avatar Yevhen Orlov Committed by Jakub Kicinski

net: marvell: prestera: add stub handler neighbour events

Actual handler will be added in next patches
Co-developed-by: default avatarTaras Chornyi <tchornyi@marvell.com>
Signed-off-by: default avatarTaras Chornyi <tchornyi@marvell.com>
Co-developed-by: default avatarOleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: default avatarOleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: default avatarYevhen Orlov <yevhen.orlov@plvision.eu>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 04f24a1e
...@@ -320,6 +320,7 @@ struct prestera_router { ...@@ -320,6 +320,7 @@ struct prestera_router {
struct notifier_block inetaddr_nb; struct notifier_block inetaddr_nb;
struct notifier_block inetaddr_valid_nb; struct notifier_block inetaddr_valid_nb;
struct notifier_block fib_nb; struct notifier_block fib_nb;
struct notifier_block netevent_nb;
u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */ u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */
unsigned long nhgrp_hw_cache_kick; /* jiffies */ unsigned long nhgrp_hw_cache_kick; /* jiffies */
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <net/switchdev.h> #include <net/switchdev.h>
#include <linux/rhashtable.h> #include <linux/rhashtable.h>
#include <net/nexthop.h> #include <net/nexthop.h>
#include <net/netevent.h>
#include "prestera.h" #include "prestera.h"
#include "prestera_router_hw.h" #include "prestera_router_hw.h"
...@@ -604,6 +605,56 @@ static int __prestera_router_fib_event(struct notifier_block *nb, ...@@ -604,6 +605,56 @@ static int __prestera_router_fib_event(struct notifier_block *nb,
return NOTIFY_DONE; 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) int prestera_router_init(struct prestera_switch *sw)
{ {
struct prestera_router *router; struct prestera_router *router;
...@@ -642,6 +693,11 @@ int prestera_router_init(struct prestera_switch *sw) ...@@ -642,6 +693,11 @@ int prestera_router_init(struct prestera_switch *sw)
if (err) if (err)
goto err_register_inetaddr_notifier; 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; router->fib_nb.notifier_call = __prestera_router_fib_event;
err = register_fib_notifier(&init_net, &router->fib_nb, err = register_fib_notifier(&init_net, &router->fib_nb,
/* TODO: flush fib entries */ NULL, NULL); /* TODO: flush fib entries */ NULL, NULL);
...@@ -651,6 +707,8 @@ int prestera_router_init(struct prestera_switch *sw) ...@@ -651,6 +707,8 @@ int prestera_router_init(struct prestera_switch *sw)
return 0; return 0;
err_register_fib_notifier: err_register_fib_notifier:
unregister_netevent_notifier(&router->netevent_nb);
err_register_netevent_notifier:
unregister_inetaddr_notifier(&router->inetaddr_nb); unregister_inetaddr_notifier(&router->inetaddr_nb);
err_register_inetaddr_notifier: err_register_inetaddr_notifier:
unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb); unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
...@@ -668,6 +726,7 @@ int prestera_router_init(struct prestera_switch *sw) ...@@ -668,6 +726,7 @@ int prestera_router_init(struct prestera_switch *sw)
void prestera_router_fini(struct prestera_switch *sw) void prestera_router_fini(struct prestera_switch *sw)
{ {
unregister_fib_notifier(&init_net, &sw->router->fib_nb); 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_notifier(&sw->router->inetaddr_nb);
unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb); unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb);
prestera_queue_drain(); prestera_queue_drain();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment