extern void seg6_local_exit(void);
 
 extern bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len, bool reduced);
+extern struct ipv6_sr_hdr *seg6_get_srh(struct sk_buff *skb, int flags);
 extern int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh,
                             int proto);
 extern int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh);
 
        return true;
 }
 
+struct ipv6_sr_hdr *seg6_get_srh(struct sk_buff *skb, int flags)
+{
+       struct ipv6_sr_hdr *srh;
+       int len, srhoff = 0;
+
+       if (ipv6_find_hdr(skb, &srhoff, IPPROTO_ROUTING, NULL, &flags) < 0)
+               return NULL;
+
+       if (!pskb_may_pull(skb, srhoff + sizeof(*srh)))
+               return NULL;
+
+       srh = (struct ipv6_sr_hdr *)(skb->data + srhoff);
+
+       len = (srh->hdrlen + 1) << 3;
+
+       if (!pskb_may_pull(skb, srhoff + len))
+               return NULL;
+
+       /* note that pskb_may_pull may change pointers in header;
+        * for this reason it is necessary to reload them when needed.
+        */
+       srh = (struct ipv6_sr_hdr *)(skb->data + srhoff);
+
+       if (!seg6_validate_srh(srh, len, true))
+               return NULL;
+
+       return srh;
+}
+
 static struct genl_family seg6_genl_family;
 
 static const struct nla_policy seg6_genl_policy[SEG6_ATTR_MAX + 1] = {
 
        return (struct seg6_local_lwt *)lwt->data;
 }
 
-static struct ipv6_sr_hdr *get_srh(struct sk_buff *skb, int flags)
-{
-       struct ipv6_sr_hdr *srh;
-       int len, srhoff = 0;
-
-       if (ipv6_find_hdr(skb, &srhoff, IPPROTO_ROUTING, NULL, &flags) < 0)
-               return NULL;
-
-       if (!pskb_may_pull(skb, srhoff + sizeof(*srh)))
-               return NULL;
-
-       srh = (struct ipv6_sr_hdr *)(skb->data + srhoff);
-
-       len = (srh->hdrlen + 1) << 3;
-
-       if (!pskb_may_pull(skb, srhoff + len))
-               return NULL;
-
-       /* note that pskb_may_pull may change pointers in header;
-        * for this reason it is necessary to reload them when needed.
-        */
-       srh = (struct ipv6_sr_hdr *)(skb->data + srhoff);
-
-       if (!seg6_validate_srh(srh, len, true))
-               return NULL;
-
-       return srh;
-}
-
 static struct ipv6_sr_hdr *get_and_validate_srh(struct sk_buff *skb)
 {
        struct ipv6_sr_hdr *srh;
 
-       srh = get_srh(skb, IP6_FH_F_SKIP_RH);
+       srh = seg6_get_srh(skb, IP6_FH_F_SKIP_RH);
        if (!srh)
                return NULL;
 
        struct ipv6_sr_hdr *srh;
        unsigned int off = 0;
 
-       srh = get_srh(skb, 0);
+       srh = seg6_get_srh(skb, 0);
        if (srh && srh->segments_left > 0)
                return false;