fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj);
                err = rocker_port_fib_ipv4(rocker_port, trans,
                                           htonl(fib4->dst), fib4->dst_len,
-                                          fib4->fi, fib4->tb_id, 0);
+                                          &fib4->fi, fib4->tb_id, 0);
                break;
        case SWITCHDEV_OBJ_ID_PORT_FDB:
                err = rocker_port_fdb_add(rocker_port, trans,
                fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj);
                err = rocker_port_fib_ipv4(rocker_port, NULL,
                                           htonl(fib4->dst), fib4->dst_len,
-                                          fib4->fi, fib4->tb_id,
+                                          &fib4->fi, fib4->tb_id,
                                           ROCKER_OP_FLAG_REMOVE);
                break;
        case SWITCHDEV_OBJ_ID_PORT_FDB:
        hash_for_each_safe(rocker->fdb_tbl, bkt, tmp, found, entry) {
                if (found->key.rocker_port != rocker_port)
                        continue;
-               fdb->addr = found->key.addr;
+               ether_addr_copy(fdb->addr, found->key.addr);
                fdb->ndm_state = NUD_REACHABLE;
                fdb->vid = rocker_port_vlan_to_vid(rocker_port,
                                                   found->key.vlan_id);
 
 #include <linux/netdevice.h>
 #include <linux/notifier.h>
 #include <linux/list.h>
+#include <net/ip_fib.h>
 
 #define SWITCHDEV_F_NO_RECURSE         BIT(0)
 #define SWITCHDEV_F_SKIP_EOPNOTSUPP    BIT(1)
        } u;
 };
 
-struct fib_info;
-
 enum switchdev_obj_id {
        SWITCHDEV_OBJ_ID_UNDEFINED,
        SWITCHDEV_OBJ_ID_PORT_VLAN,
        struct switchdev_obj obj;
        u32 dst;
        int dst_len;
-       struct fib_info *fi;
+       struct fib_info fi;
        u8 tos;
        u8 type;
        u32 nlflags;
 /* SWITCHDEV_OBJ_ID_PORT_FDB */
 struct switchdev_obj_port_fdb {
        struct switchdev_obj obj;
-       const unsigned char *addr;
+       unsigned char addr[ETH_ALEN];
        u16 vid;
        u16 ndm_state;
 };
 
 {
        struct switchdev_obj_port_fdb fdb = {
                .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
-               .addr = f->addr.addr,
                .vid = f->vlan_id,
        };
 
+       ether_addr_copy(fdb.addr, f->addr.addr);
        switchdev_port_obj_del(f->dst->dev, &fdb.obj);
 }
 
 
                if (ret < 0)
                        break;
 
-               fdb->addr = addr;
+               ether_addr_copy(fdb->addr, addr);
                fdb->vid = vid;
                fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;
 
 
 #include <linux/mutex.h>
 #include <linux/notifier.h>
 #include <linux/netdevice.h>
+#include <linux/etherdevice.h>
 #include <linux/if_bridge.h>
 #include <linux/list.h>
 #include <linux/workqueue.h>
 {
        struct switchdev_obj_port_fdb fdb = {
                .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
-               .addr = addr,
                .vid = vid,
        };
 
+       ether_addr_copy(fdb.addr, addr);
        return switchdev_port_obj_add(dev, &fdb.obj);
 }
 EXPORT_SYMBOL_GPL(switchdev_port_fdb_add);
 {
        struct switchdev_obj_port_fdb fdb = {
                .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
-               .addr = addr,
                .vid = vid,
        };
 
+       ether_addr_copy(fdb.addr, addr);
        return switchdev_port_obj_del(dev, &fdb.obj);
 }
 EXPORT_SYMBOL_GPL(switchdev_port_fdb_del);
                .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
                .dst = dst,
                .dst_len = dst_len,
-               .fi = fi,
                .tos = tos,
                .type = type,
                .nlflags = nlflags,
        struct net_device *dev;
        int err = 0;
 
+       memcpy(&ipv4_fib.fi, fi, sizeof(ipv4_fib.fi));
+
        /* Don't offload route if using custom ip rules or if
         * IPv4 FIB offloading has been disabled completely.
         */
                .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
                .dst = dst,
                .dst_len = dst_len,
-               .fi = fi,
                .tos = tos,
                .type = type,
                .nlflags = 0,
        struct net_device *dev;
        int err = 0;
 
+       memcpy(&ipv4_fib.fi, fi, sizeof(ipv4_fib.fi));
+
        if (!(fi->fib_flags & RTNH_F_OFFLOAD))
                return 0;