inline int ip_ufo_append_data(struct sock *sk, 
static inline int ip_ufo_append_data(struct sock *sk, 
inline int ip_ufo_append_data(struct sock *sk,			int getfrag(void *from, char *to, int offset, int len,			       int odd, struct sk_buff *skb),			void *from, int length, int hh_len, int fragheaderlen,			int transhdrlen, int mtu,unsigned int flags){	struct sk_buff *skb;	int err;	/* There is support for UDP fragmentation offload by network	 * device, so create one single skb packet containing complete	 * udp datagram	 */	if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {		skb = sock_alloc_send_skb(sk,			hh_len + fragheaderlen + transhdrlen + 20,			(flags & MSG_DONTWAIT), &err);		if (skb == NULL)			return err;		/* reserve space for Hardware header */		skb_reserve(skb, hh_len);		/* create space for UDP/IP header */		skb_put(skb,fragheaderlen + transhdrlen);		/* initialize network header pointer */		skb->nh.raw = skb->data;		/* initialize protocol header pointer */		skb->h.raw = skb->data + fragheaderlen;		skb->ip_summed = CHECKSUM_HW;		skb->csum = 0;		sk->sk_sndmsg_off = 0;	}	err = skb_append_datato_frags(sk,skb, getfrag, from,			       (length - transhdrlen));	if (!err) {		/* specify the length of each IP datagram fragment*/		skb_shinfo(skb)->ufo_size = (mtu - fragheaderlen);		__skb_queue_tail(&sk->sk_write_queue, skb);		return 0;	}	/* There is not enough support do UFO ,	 * so follow normal path	 */	kfree_skb(skb);	return err;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/4b30b1c6a3e58dc74f2dbb0aa39f16a23cfcdd56/ip_output.c/clean/net/ipv4/ip_output.c