/* { dg-require-effective-target indirect_calls } */

typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned int __u32;
typedef unsigned long __kernel_size_t;
typedef __kernel_size_t size_t;
typedef __u8 uint8_t;
typedef __u16 __be16;
typedef __u32 __be32;
struct msghdr {
    struct iovec * msg_iov;
    unsigned msg_flags;
};
enum { IPPROTO_ICMP = 1 };
struct sk_buff { };
static inline __attribute__((always_inline)) struct dst_entry *
skb_dst(const struct sk_buff *skb)
{
};
enum nf_inet_hooks { NF_INET_LOCAL_OUT };
struct net_device {
    unsigned mtu;
};
static inline __attribute__((always_inline)) int
NF_HOOK_THRESH(uint8_t pf, unsigned int hook, struct sk_buff *skb,
	       struct net_device *in, struct net_device *out,
	       int (*okfn)(struct sk_buff *), int thresh)
{
  int ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, thresh);
  if (ret == 1)
    ret = okfn(skb);
  return ret;
}
static inline __attribute__((always_inline)) int
NF_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb,
	struct net_device *in, struct net_device *out,
	int (*okfn)(struct sk_buff *))
{
  return NF_HOOK_THRESH(pf, hook, skb, in, out, okfn, (-((int)(~0U>>1)) - 1));
}
struct dst_entry {
    struct net_device *dev;
    int (*output)(struct sk_buff*);
};
static inline __attribute__((always_inline)) int dst_output(struct sk_buff *skb) {
    return skb_dst(skb)->output(skb);
};
struct iphdr {
    __u8 protocol;
};
struct inet_sock {
    __be16 inet_dport;
    __u8 recverr: 1,     hdrincl: 1;
    struct { } cork;
};
struct icmphdr {
    __u8 type;
};
struct rtable {
    union { struct dst_entry dst; } u;
    __be32 rt_dst;
};
struct sock;
struct inet_sock *inet_sk (struct sock *);
struct net *sock_net (struct sock *);
void *skb_transport_header (struct sk_buff *);
static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
			   struct rtable *rt,    unsigned int flags)
{
  struct inet_sock *inet = inet_sk(sk);
  struct net *net = sock_net(sk);
  struct iphdr *iph;
  struct sk_buff *skb;
  if (length > rt->u.dst.dev->mtu) 
    ip_local_error(sk, 90, rt->rt_dst, inet->inet_dport, rt->u.dst.dev->mtu);
  if (flags&0x10)
    goto out;
  if (iph->protocol == IPPROTO_ICMP)
    icmp_out_count(net, ((struct icmphdr *)skb_transport_header(skb))->type);
  NF_HOOK(2, NF_INET_LOCAL_OUT, skb, ((void *)0), rt->u.dst.dev,
	  dst_output);
out:
  while (0);
}
int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
  raw_send_hdrinc(sk, msg->msg_iov, len, (void *)0, msg->msg_flags);
}
