|
48 | 48 | #include <net/neighbour.h>
|
49 | 49 | #include <net/arp.h>
|
50 | 50 | #include <net/ip_fib.h>
|
| 51 | +#include <net/ip6_fib.h> |
51 | 52 | #include <net/fib_rules.h>
|
52 | 53 | #include <net/l3mdev.h>
|
53 | 54 | #include <net/addrconf.h>
|
@@ -3087,6 +3088,23 @@ static void mlxsw_sp_router_fib4_event_work(struct work_struct *work)
|
3087 | 3088 |
|
3088 | 3089 | static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
|
3089 | 3090 | {
|
| 3091 | + struct mlxsw_sp_fib_event_work *fib_work = |
| 3092 | + container_of(work, struct mlxsw_sp_fib_event_work, work); |
| 3093 | + struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp; |
| 3094 | + struct fib_rule *rule; |
| 3095 | + |
| 3096 | + rtnl_lock(); |
| 3097 | + switch (fib_work->event) { |
| 3098 | + case FIB_EVENT_RULE_ADD: /* fall through */ |
| 3099 | + case FIB_EVENT_RULE_DEL: |
| 3100 | + rule = fib_work->fr_info.rule; |
| 3101 | + if (!fib6_rule_default(rule) && !rule->l3mdev) |
| 3102 | + mlxsw_sp_router_fib_abort(mlxsw_sp); |
| 3103 | + fib_rule_put(rule); |
| 3104 | + break; |
| 3105 | + } |
| 3106 | + rtnl_unlock(); |
| 3107 | + kfree(fib_work); |
3090 | 3108 | }
|
3091 | 3109 |
|
3092 | 3110 | static void mlxsw_sp_router_fib4_event(struct mlxsw_sp_fib_event_work *fib_work,
|
@@ -3119,6 +3137,13 @@ static void mlxsw_sp_router_fib4_event(struct mlxsw_sp_fib_event_work *fib_work,
|
3119 | 3137 | static void mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
|
3120 | 3138 | struct fib_notifier_info *info)
|
3121 | 3139 | {
|
| 3140 | + switch (fib_work->event) { |
| 3141 | + case FIB_EVENT_RULE_ADD: /* fall through */ |
| 3142 | + case FIB_EVENT_RULE_DEL: |
| 3143 | + memcpy(&fib_work->fr_info, info, sizeof(fib_work->fr_info)); |
| 3144 | + fib_rule_get(fib_work->fr_info.rule); |
| 3145 | + break; |
| 3146 | + } |
3122 | 3147 | }
|
3123 | 3148 |
|
3124 | 3149 | /* Called with rcu_read_lock() */
|
|
0 commit comments