NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp cork app bug 2\n")); 
LIMIT_NETDEBUG(printk(KERN_DEBUG "udp cork app bug 2\n")); 
int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,		size_t len){	struct inet_sock *inet = inet_sk(sk);	struct udp_sock *up = udp_sk(sk);	int ulen = len;	struct ipcm_cookie ipc;	struct rtable *rt = NULL;	int free = 0;	int connected = 0;	u32 daddr, faddr, saddr;	u16 dport;	u8  tos;	int err;	int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;	if (len > 0xFFFF)		return -EMSGSIZE;	/* 	 *	Check the flags.	 */	if (msg->msg_flags&MSG_OOB)	/* Mirror BSD error message compatibility */		return -EOPNOTSUPP;	ipc.opt = NULL;	if (up->pending) {		/*		 * There are pending frames.	 	 * The socket lock must be held while it's corked.		 */		lock_sock(sk);		if (likely(up->pending)) {			if (unlikely(up->pending != AF_INET)) {				release_sock(sk);				return -EINVAL;			} 			goto do_append_data;		}		release_sock(sk);	}	ulen += sizeof(struct udphdr);	/*	 *	Get and verify the address. 	 */	if (msg->msg_name) {		struct sockaddr_in * usin = (struct sockaddr_in*)msg->msg_name;		if (msg->msg_namelen < sizeof(*usin))			return -EINVAL;		if (usin->sin_family != AF_INET) {			if (usin->sin_family != AF_UNSPEC)				return -EAFNOSUPPORT;		}		daddr = usin->sin_addr.s_addr;		dport = usin->sin_port;		if (dport == 0)			return -EINVAL;	} else {		if (sk->sk_state != TCP_ESTABLISHED)			return -EDESTADDRREQ;		daddr = inet->daddr;		dport = inet->dport;		/* Open fast path for connected socket.		   Route will not be used, if at least one option is set.		 */		connected = 1;  	}	ipc.addr = inet->saddr;	ipc.oif = sk->sk_bound_dev_if;	if (msg->msg_controllen) {		err = ip_cmsg_send(msg, &ipc);		if (err)			return err;		if (ipc.opt)			free = 1;		connected = 0;	}	if (!ipc.opt)		ipc.opt = inet->opt;	saddr = ipc.addr;	ipc.addr = faddr = daddr;	if (ipc.opt && ipc.opt->srr) {		if (!daddr)			return -EINVAL;		faddr = ipc.opt->faddr;		connected = 0;	}	tos = RT_TOS(inet->tos);	if (sock_flag(sk, SOCK_LOCALROUTE) ||	    (msg->msg_flags & MSG_DONTROUTE) || 	    (ipc.opt && ipc.opt->is_strictroute)) {		tos |= RTO_ONLINK;		connected = 0;	}	if (MULTICAST(daddr)) {		if (!ipc.oif)			ipc.oif = inet->mc_index;		if (!saddr)			saddr = inet->mc_addr;		connected = 0;	}	if (connected)		rt = (struct rtable*)sk_dst_check(sk, 0);	if (rt == NULL) {		struct flowi fl = { .oif = ipc.oif,				    .nl_u = { .ip4_u =					      { .daddr = faddr,						.saddr = saddr,						.tos = tos } },				    .proto = IPPROTO_UDP,				    .uli_u = { .ports =					       { .sport = inet->sport,						 .dport = dport } } };		err = ip_route_output_flow(&rt, &fl, sk, !(msg->msg_flags&MSG_DONTWAIT));		if (err)			goto out;		err = -EACCES;		if ((rt->rt_flags & RTCF_BROADCAST) &&		    !sock_flag(sk, SOCK_BROADCAST))			goto out;		if (connected)			sk_dst_set(sk, dst_clone(&rt->u.dst));	}	if (msg->msg_flags&MSG_CONFIRM)		goto do_confirm;back_from_confirm:	saddr = rt->rt_src;	if (!ipc.addr)		daddr = ipc.addr = rt->rt_dst;	lock_sock(sk);	if (unlikely(up->pending)) {		/* The socket is already corked while preparing it. */		/* ... which is an evident application bug. --ANK */		release_sock(sk);		NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp cork app bug 2\n"));		err = -EINVAL;		goto out;	}	/*	 *	Now cork the socket to pend data.	 */	inet->cork.fl.fl4_dst = daddr;	inet->cork.fl.fl_ip_dport = dport;	inet->cork.fl.fl4_src = saddr;	inet->cork.fl.fl_ip_sport = inet->sport;	up->pending = AF_INET;do_append_data:	up->len += ulen;	err = ip_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen, 			sizeof(struct udphdr), &ipc, rt, 			corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);	if (err)		udp_flush_pending_frames(sk);	else if (!corkreq)		err = udp_push_pending_frames(sk, up);	release_sock(sk);out:	ip_rt_put(rt);	if (free)		kfree(ipc.opt);	if (!err) {		UDP_INC_STATS_USER(UDP_MIB_OUTDATAGRAMS);		return len;	}	return err;do_confirm:	dst_confirm(&rt->u.dst);	if (!(msg->msg_flags&MSG_PROBE) || len)		goto back_from_confirm;	err = 0;	goto out;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/ca9334523c853e407da7b3a0bd02f54d0fa59414/udp.c/clean/net/ipv4/udp.c