--- /dev/null
+/*
+ *  SR-IPv6 implementation
+ *
+ *  Authors:
+ *  David Lebrun <david.lebrun@uclouvain.be>
+ *  eBPF support: Mathieu Xhonneux <m.xhonneux@gmail.com>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU General Public License
+ *      as published by the Free Software Foundation; either version
+ *      2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _NET_SEG6_LOCAL_H
+#define _NET_SEG6_LOCAL_H
+
+#include <linux/net.h>
+#include <linux/ipv6.h>
+
+extern int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
+                              u32 tbl_id);
+
+#endif
 
 #ifdef CONFIG_IPV6_SEG6_HMAC
 #include <net/seg6_hmac.h>
 #endif
+#include <net/seg6_local.h>
 #include <linux/etherdevice.h>
 
 struct seg6_local_lwt;
        *daddr = *addr;
 }
 
-static void lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
-                          u32 tbl_id)
+int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
+                       u32 tbl_id)
 {
        struct net *net = dev_net(skb->dev);
        struct ipv6hdr *hdr = ipv6_hdr(skb);
 
        skb_dst_drop(skb);
        skb_dst_set(skb, dst);
+       return dst->error;
 }
 
 /* regular endpoint function */
 
        advance_nextseg(srh, &ipv6_hdr(skb)->daddr);
 
-       lookup_nexthop(skb, NULL, 0);
+       seg6_lookup_nexthop(skb, NULL, 0);
 
        return dst_input(skb);
 
 
        advance_nextseg(srh, &ipv6_hdr(skb)->daddr);
 
-       lookup_nexthop(skb, &slwt->nh6, 0);
+       seg6_lookup_nexthop(skb, &slwt->nh6, 0);
 
        return dst_input(skb);
 
 
        advance_nextseg(srh, &ipv6_hdr(skb)->daddr);
 
-       lookup_nexthop(skb, NULL, slwt->table);
+       seg6_lookup_nexthop(skb, NULL, slwt->table);
 
        return dst_input(skb);
 
        if (!ipv6_addr_any(&slwt->nh6))
                nhaddr = &slwt->nh6;
 
-       lookup_nexthop(skb, nhaddr, 0);
+       seg6_lookup_nexthop(skb, nhaddr, 0);
 
        return dst_input(skb);
 drop:
        if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
                goto drop;
 
-       lookup_nexthop(skb, NULL, slwt->table);
+       seg6_lookup_nexthop(skb, NULL, slwt->table);
 
        return dst_input(skb);
 
        ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
        skb_set_transport_header(skb, sizeof(struct ipv6hdr));
 
-       lookup_nexthop(skb, NULL, 0);
+       seg6_lookup_nexthop(skb, NULL, 0);
 
        return dst_input(skb);
 
        ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
        skb_set_transport_header(skb, sizeof(struct ipv6hdr));
 
-       lookup_nexthop(skb, NULL, 0);
+       seg6_lookup_nexthop(skb, NULL, 0);
 
        return dst_input(skb);