您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ tipc_sk函数代码示例

51自学网 2021-06-03 08:52:14
  C++
这篇教程C++ tipc_sk函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中tipc_sk函数的典型用法代码示例。如果您正苦于以下问题:C++ tipc_sk函数的具体用法?C++ tipc_sk怎么用?C++ tipc_sk使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了tipc_sk函数的25个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: filter_rcv

/** * filter_rcv - validate incoming message * @sk: socket * @buf: message * * Enqueues message on receive queue if acceptable; optionally handles * disconnect indication for a connected socket. * * Called with socket lock already taken; port lock may also be taken. * * Returns TIPC error status code (TIPC_OK if message is not to be rejected) */static u32 filter_rcv(struct sock *sk, struct sk_buff *buf){	struct socket *sock = sk->sk_socket;	struct tipc_msg *msg = buf_msg(buf);	unsigned int limit = rcvbuf_limit(sk, buf);	u32 res = TIPC_OK;	/* Reject message if it is wrong sort of message for socket */	if (msg_type(msg) > TIPC_DIRECT_MSG)		return TIPC_ERR_NO_PORT;	if (sock->state == SS_READY) {		if (msg_connected(msg))			return TIPC_ERR_NO_PORT;	} else {		res = filter_connect(tipc_sk(sk), &buf);		if (res != TIPC_OK || buf == NULL)			return res;	}	/* Reject message if there isn't room to queue it */	if (sk_rmem_alloc_get(sk) + buf->truesize >= limit)		return TIPC_ERR_OVERLOAD;	/* Enqueue message */	TIPC_SKB_CB(buf)->handle = 0;	__skb_queue_tail(&sk->sk_receive_queue, buf);	skb_set_owner_r(buf, sk);	sk->sk_data_ready(sk, 0);	return TIPC_OK;}
开发者ID:BitOBSessiOn,项目名称:android_kernel_asus_P01M,代码行数:44,


示例2: tipc_create

/** * tipc_create - create a TIPC socket * @sock: pre-allocated socket structure * @protocol: protocol indicator (must be 0) * * This routine creates and attaches a 'struct sock' to the 'struct socket', * then create and attaches a TIPC port to the 'struct sock' part. * * Returns 0 on success, errno otherwise */static int tipc_create(struct socket *sock, int protocol){	struct tipc_sock *tsock;	struct tipc_port *port;	struct sock *sk;	u32 ref;	if (unlikely(protocol != 0))		return -EPROTONOSUPPORT;	ref = tipc_createport_raw(NULL, &dispatch, &wakeupdispatch, TIPC_LOW_IMPORTANCE);	if (unlikely(!ref))		return -ENOMEM;	sock->state = SS_UNCONNECTED;	switch (sock->type) {	case SOCK_STREAM:		sock->ops = &stream_ops;		break;	case SOCK_SEQPACKET:		sock->ops = &packet_ops;		break;	case SOCK_DGRAM:		tipc_set_portunreliable(ref, 1);		/* fall through */	case SOCK_RDM:		tipc_set_portunreturnable(ref, 1);		sock->ops = &msg_ops;		sock->state = SS_READY;		break;	default:		tipc_deleteport(ref);		return -EPROTOTYPE;	}	sk = sk_alloc(AF_TIPC, GFP_KERNEL, &tipc_proto, 1);	if (!sk) {		tipc_deleteport(ref);		return -ENOMEM;	}	sock_init_data(sock, sk);	init_waitqueue_head(sk->sk_sleep);	sk->sk_rcvtimeo = 8 * HZ;   /* default connect timeout = 8s */	tsock = tipc_sk(sk);	port = tipc_get_port(ref);	tsock->p = port;	port->usr_handle = tsock;	init_MUTEX(&tsock->sem);	dbg("sock_create: %x/n",tsock);	atomic_inc(&tipc_user_count);	return 0;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:70,


示例3: get_name

static int get_name(struct socket *sock, struct sockaddr *uaddr,		    int *uaddr_len, int peer){	struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;	struct tipc_sock *tsock = tipc_sk(sock->sk);	memset(addr, 0, sizeof(*addr));	if (peer) {		if ((sock->state != SS_CONNECTED) &&			((peer != 2) || (sock->state != SS_DISCONNECTING)))			return -ENOTCONN;		addr->addr.id.ref = tsock->peer_name.ref;		addr->addr.id.node = tsock->peer_name.node;	} else {		addr->addr.id.ref = tsock->p->ref;		addr->addr.id.node = tipc_own_addr;	}	*uaddr_len = sizeof(*addr);	addr->addrtype = TIPC_ADDR_ID;	addr->family = AF_TIPC;	addr->scope = 0;	addr->addr.name.domain = 0;	return 0;}
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:26,


示例4: getsockopt

static int getsockopt(struct socket *sock,		      int lvl, int opt, char __user *ov, int __user *ol){	struct sock *sk = sock->sk;	struct tipc_port *tport = tipc_sk_port(sk);	int len;	u32 value;	int res;	if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))		return put_user(0, ol);	if (lvl != SOL_TIPC)		return -ENOPROTOOPT;	if ((res = get_user(len, ol)))		return res;	lock_sock(sk);	switch (opt) {	case TIPC_IMPORTANCE:		res = tipc_portimportance(tport->ref, &value);		break;	case TIPC_SRC_DROPPABLE:		res = tipc_portunreliable(tport->ref, &value);		break;	case TIPC_DEST_DROPPABLE:		res = tipc_portunreturnable(tport->ref, &value);		break;	case TIPC_CONN_TIMEOUT:		value = jiffies_to_msecs(tipc_sk(sk)->conn_timeout);		/* no need to set "res", since already 0 at this point */		break;	 case TIPC_NODE_RECVQ_DEPTH:		value = (u32)atomic_read(&tipc_queue_size);		break;	 case TIPC_SOCK_RECVQ_DEPTH:		value = skb_queue_len(&sk->sk_receive_queue);		break;	default:		res = -EINVAL;	}	release_sock(sk);	if (res) {		/* "get" failed */	}	else if (len < sizeof(value)) {		res = -EINVAL;	}	else if (copy_to_user(ov, &value, sizeof(value))) {		res = -EFAULT;	}	else {		res = put_user(sizeof(value), ol);	}	return res;}
开发者ID:Adjustxx,项目名称:Savaged-Zen,代码行数:59,


示例5: release

static int release(struct socket *sock){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sock *sk = sock->sk;	int res = TIPC_OK;	struct sk_buff *buf;	dbg("sock_delete: %x/n",tsock);	if (!tsock)		return 0;	down_interruptible(&tsock->sem);	if (!sock->sk) {		up(&tsock->sem);		return 0;	}	/* Reject unreceived messages, unless no longer connected */	while (sock->state != SS_DISCONNECTING) {		sock_lock(tsock);		buf = skb_dequeue(&sk->sk_receive_queue);		if (!buf)			tsock->p->usr_handle = NULL;		sock_unlock(tsock);		if (!buf)			break;		if (TIPC_SKB_CB(buf)->handle != msg_data(buf_msg(buf)))			buf_discard(buf);		else			tipc_reject_msg(buf, TIPC_ERR_NO_PORT);		atomic_dec(&tipc_queue_size);	}	/* Delete TIPC port */	res = tipc_deleteport(tsock->p->ref);	sock->sk = NULL;	/* Discard any remaining messages */	while ((buf = skb_dequeue(&sk->sk_receive_queue))) {		buf_discard(buf);		atomic_dec(&tipc_queue_size);	}	up(&tsock->sem);	sock_put(sk);	atomic_dec(&tipc_user_count);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:52,


示例6: getsockopt

static int getsockopt(struct socket *sock,		      int lvl, int opt, char __user *ov, int __user *ol){	struct tipc_sock *tsock = tipc_sk(sock->sk);	int len;	u32 value;	int res;	if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))		return put_user(0, ol);	if (lvl != SOL_TIPC)		return -ENOPROTOOPT;	if ((res = get_user(len, ol)))		return res;	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	switch (opt) {	case TIPC_IMPORTANCE:		res = tipc_portimportance(tsock->p->ref, &value);		break;	case TIPC_SRC_DROPPABLE:		res = tipc_portunreliable(tsock->p->ref, &value);		break;	case TIPC_DEST_DROPPABLE:		res = tipc_portunreturnable(tsock->p->ref, &value);		break;	case TIPC_CONN_TIMEOUT:		value = (sock->sk->sk_rcvtimeo * 1000) / HZ;		break;	default:		res = -EINVAL;	}	if (res) {		/* "get" failed */	}	else if (len < sizeof(value)) {		res = -EINVAL;	}	else if ((res = copy_to_user(ov, &value, sizeof(value)))) {		/* couldn't return value */	}	else {		res = put_user(sizeof(value), ol);	}	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:51,


示例7: auto_connect

static int auto_connect(struct socket *sock, struct tipc_msg *msg){	struct tipc_sock *tsock = tipc_sk(sock->sk);	if (msg_errcode(msg)) {		sock->state = SS_DISCONNECTING;		return -ECONNREFUSED;	}	tsock->peer_name.ref = msg_origport(msg);	tsock->peer_name.node = msg_orignode(msg);	tipc_connect2port(tsock->p->ref, &tsock->peer_name);	tipc_set_portimportance(tsock->p->ref, msg_importance(msg));	sock->state = SS_CONNECTED;	return 0;}
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:16,


示例8: setsockopt

static int setsockopt(struct socket *sock,		      int lvl, int opt, char __user *ov, unsigned int ol){	struct sock *sk = sock->sk;	struct tipc_port *tport = tipc_sk_port(sk);	u32 value;	int res;	if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))		return 0;	if (lvl != SOL_TIPC)		return -ENOPROTOOPT;	if (ol < sizeof(value))		return -EINVAL;	res = get_user(value, (u32 __user *)ov);	if (res)		return res;	lock_sock(sk);	switch (opt) {	case TIPC_IMPORTANCE:		res = tipc_set_portimportance(tport->ref, value);		break;	case TIPC_SRC_DROPPABLE:		if (sock->type != SOCK_STREAM)			res = tipc_set_portunreliable(tport->ref, value);		else			res = -ENOPROTOOPT;		break;	case TIPC_DEST_DROPPABLE:		res = tipc_set_portunreturnable(tport->ref, value);		break;	case TIPC_CONN_TIMEOUT:		tipc_sk(sk)->conn_timeout = value;		/* no need to set "res", since already 0 at this point */		break;	default:		res = -EINVAL;	}	release_sock(sk);	return res;}
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:45,


示例9: auto_connect

/** * auto_connect - complete connection setup to a remote port * @sock: socket structure * @msg: peer's response message * * Returns 0 on success, errno otherwise */static int auto_connect(struct socket *sock, struct tipc_msg *msg){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct tipc_port *p_ptr;	tsock->peer_name.ref = msg_origport(msg);	tsock->peer_name.node = msg_orignode(msg);	p_ptr = tipc_port_deref(tsock->p->ref);	if (!p_ptr)		return -EINVAL;	__tipc_connect(tsock->p->ref, p_ptr, &tsock->peer_name);	if (msg_importance(msg) > TIPC_CRITICAL_IMPORTANCE)		return -EINVAL;	msg_set_importance(&p_ptr->phdr, (u32)msg_importance(msg));	sock->state = SS_CONNECTED;	return 0;}
开发者ID:BitOBSessiOn,项目名称:android_kernel_asus_P01M,代码行数:26,


示例10: setsockopt

static int setsockopt(struct socket *sock,		      int lvl, int opt, char __user *ov, int ol){	struct tipc_sock *tsock = tipc_sk(sock->sk);	u32 value;	int res;	if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))		return 0;	if (lvl != SOL_TIPC)		return -ENOPROTOOPT;	if (ol < sizeof(value))		return -EINVAL;	if ((res = get_user(value, (u32 __user *)ov)))		return res;	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	switch (opt) {	case TIPC_IMPORTANCE:		res = tipc_set_portimportance(tsock->p->ref, value);		break;	case TIPC_SRC_DROPPABLE:		if (sock->type != SOCK_STREAM)			res = tipc_set_portunreliable(tsock->p->ref, value);		else			res = -ENOPROTOOPT;		break;	case TIPC_DEST_DROPPABLE:		res = tipc_set_portunreturnable(tsock->p->ref, value);		break;	case TIPC_CONN_TIMEOUT:		sock->sk->sk_rcvtimeo = (value * HZ / 1000);		break;	default:		res = -EINVAL;	}	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:42,


示例11: send_packet

static int send_packet(struct kiocb *iocb, struct socket *sock,		       struct msghdr *m, size_t total_len){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;	int res;	/* Handle implied connection establishment */	if (unlikely(dest))		return send_msg(iocb, sock, m, total_len);	if (down_interruptible(&tsock->sem)) {		return -ERESTARTSYS;	}	do {		if (unlikely(sock->state != SS_CONNECTED)) {			if (sock->state == SS_DISCONNECTING)				res = -EPIPE;			else				res = -ENOTCONN;			goto exit;		}		res = tipc_send(tsock->p->ref, m->msg_iovlen, m->msg_iov);		if (likely(res != -ELINKCONG)) {exit:			up(&tsock->sem);			return res;		}		if (m->msg_flags & MSG_DONTWAIT) {			res = -EWOULDBLOCK;			goto exit;		}		if (wait_event_interruptible(*sock->sk->sk_sleep,					     !tsock->p->congested)) {		    res = -ERESTARTSYS;		    goto exit;		}	} while (1);}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:42,


示例12: bind

static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;	int res;	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	if (unlikely(!uaddr_len)) {		res = tipc_withdraw(tsock->p->ref, 0, NULL);		goto exit;	}	if (uaddr_len < sizeof(struct sockaddr_tipc)) {		res = -EINVAL;		goto exit;	}	if (addr->family != AF_TIPC) {		res = -EAFNOSUPPORT;		goto exit;	}	if (addr->addrtype == TIPC_ADDR_NAME)		addr->addr.nameseq.upper = addr->addr.nameseq.lower;	else if (addr->addrtype != TIPC_ADDR_NAMESEQ) {		res = -EAFNOSUPPORT;		goto exit;	}	if (addr->scope > 0)		res = tipc_publish(tsock->p->ref, addr->scope,				   &addr->addr.nameseq);	else		res = tipc_withdraw(tsock->p->ref, -addr->scope,				    &addr->addr.nameseq);exit:	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:40,


示例13: get_name

static int get_name(struct socket *sock, struct sockaddr *uaddr,		    int *uaddr_len, int peer){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;	u32 res;	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	*uaddr_len = sizeof(*addr);	addr->addrtype = TIPC_ADDR_ID;	addr->family = AF_TIPC;	addr->scope = 0;	if (peer)		res = tipc_peer(tsock->p->ref, &addr->addr.id);	else		res = tipc_ownidentity(tsock->p->ref, &addr->addr.id);	addr->addr.name.domain = 0;	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:23,


示例14: connect

static int connect(struct socket *sock, struct sockaddr *dest, int destlen, 		   int flags){   struct tipc_sock *tsock = tipc_sk(sock->sk);   struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;   struct msghdr m = {0,};   struct sk_buff *buf;   struct tipc_msg *msg;   int res;   /* For now, TIPC does not allow use of connect() with DGRAM or RDM types */   if (sock->state == SS_READY)	   return -EOPNOTSUPP;   /* MOVE THE REST OF THIS ERROR CHECKING TO send_msg()? */   if (sock->state == SS_LISTENING)	   return -EOPNOTSUPP;   if (sock->state == SS_CONNECTING)	   return -EALREADY;   if (sock->state != SS_UNCONNECTED)           return -EISCONN;   if ((dst->family != AF_TIPC) ||       ((dst->addrtype != TIPC_ADDR_NAME) && (dst->addrtype != TIPC_ADDR_ID)))           return -EINVAL;   /* Send a 'SYN-' to destination */   m.msg_name = dest;   if ((res = send_msg(0, sock, &m, 0)) < 0) {	   sock->state = SS_DISCONNECTING;	   return res;   }   if (down_interruptible(&tsock->sem))            return -ERESTARTSYS;	   /* Wait for destination's 'ACK' response */   res = wait_event_interruptible_timeout(*sock->sk->sk_sleep,                                          skb_queue_len(&sock->sk->sk_receive_queue),					  sock->sk->sk_rcvtimeo);   buf = skb_peek(&sock->sk->sk_receive_queue);   if (res > 0) {	   msg = buf_msg(buf);           res = auto_connect(sock, tsock, msg);           if (!res) {		   if (dst->addrtype == TIPC_ADDR_NAME) {			   tsock->p->conn_type = dst->addr.name.name.type;			   tsock->p->conn_instance = dst->addr.name.name.instance;		   }		   if (!msg_data_sz(msg))			   advance_queue(tsock);	   }   } else {	   if (res == 0) {		   res = -ETIMEDOUT;	   } else	           { /* leave "res" unchanged */ }	   sock->state = SS_DISCONNECTING;   }   up(&tsock->sem);   return res;}
开发者ID:jameshilliard,项目名称:actiontec_opensrc_mi424wr-rev-e-f_fw-20-10-7-5,代码行数:66,


示例15: connect

static int connect(struct socket *sock, struct sockaddr *dest, int destlen,		   int flags){   struct tipc_sock *tsock = tipc_sk(sock->sk);   struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;   struct msghdr m = {NULL,};   struct sk_buff *buf;   struct tipc_msg *msg;   int res;   /* For now, TIPC does not allow use of connect() with DGRAM or RDM types */   if (sock->state == SS_READY)	   return -EOPNOTSUPP;   /* Issue Posix-compliant error code if socket is in the wrong state */   if (sock->state == SS_LISTENING)	   return -EOPNOTSUPP;   if (sock->state == SS_CONNECTING)	   return -EALREADY;   if (sock->state != SS_UNCONNECTED)	   return -EISCONN;   /*    * Reject connection attempt using multicast address    *    * Note: send_msg() validates the rest of the address fields,    *       so there's no need to do it here    */   if (dst->addrtype == TIPC_ADDR_MCAST)	   return -EINVAL;   /* Send a 'SYN-' to destination */   m.msg_name = dest;   m.msg_namelen = destlen;   if ((res = send_msg(NULL, sock, &m, 0)) < 0) {	   sock->state = SS_DISCONNECTING;	   return res;   }   if (down_interruptible(&tsock->sem))	   return -ERESTARTSYS;   /* Wait for destination's 'ACK' response */   res = wait_event_interruptible_timeout(*sock->sk->sk_sleep,					  skb_queue_len(&sock->sk->sk_receive_queue),					  sock->sk->sk_rcvtimeo);   buf = skb_peek(&sock->sk->sk_receive_queue);   if (res > 0) {	   msg = buf_msg(buf);	   res = auto_connect(sock, tsock, msg);	   if (!res) {		   if (!msg_data_sz(msg))			   advance_queue(tsock);	   }   } else {	   if (res == 0) {		   res = -ETIMEDOUT;	   } else		   { /* leave "res" unchanged */ }	   sock->state = SS_DISCONNECTING;   }   up(&tsock->sem);   return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:70,


示例16: tipc_create

static int tipc_create(struct net *net, struct socket *sock, int protocol,		       int kern){	const struct proto_ops *ops;	socket_state state;	struct sock *sk;	struct tipc_port *tp_ptr;	/* Validate arguments */	if (unlikely(protocol != 0))		return -EPROTONOSUPPORT;	switch (sock->type) {	case SOCK_STREAM:		ops = &stream_ops;		state = SS_UNCONNECTED;		break;	case SOCK_SEQPACKET:		ops = &packet_ops;		state = SS_UNCONNECTED;		break;	case SOCK_DGRAM:	case SOCK_RDM:		ops = &msg_ops;		state = SS_READY;		break;	default:		return -EPROTOTYPE;	}	/* Allocate socket's protocol area */	sk = sk_alloc(net, AF_TIPC, GFP_KERNEL, &tipc_proto);	if (sk == NULL)		return -ENOMEM;	/* Allocate TIPC port for socket to use */	tp_ptr = tipc_createport_raw(sk, &dispatch, &wakeupdispatch,				     TIPC_LOW_IMPORTANCE);	if (unlikely(!tp_ptr)) {		sk_free(sk);		return -ENOMEM;	}	/* Finish initializing socket data structures */	sock->ops = ops;	sock->state = state;	sock_init_data(sock, sk);	sk->sk_backlog_rcv = backlog_rcv;	tipc_sk(sk)->p = tp_ptr;	tipc_sk(sk)->conn_timeout = CONN_TIMEOUT_DEFAULT;	spin_unlock_bh(tp_ptr->lock);	if (sock->state == SS_READY) {		tipc_set_portunreturnable(tp_ptr->ref, 1);		if (sock->type == SOCK_DGRAM)			tipc_set_portunreliable(tp_ptr->ref, 1);	}	return 0;}
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:66,


示例17: accept

static int accept(struct socket *sock, struct socket *newsock, int flags){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sk_buff *buf;	int res = -EFAULT;	if (sock->state == SS_READY)		return -EOPNOTSUPP;	if (sock->state != SS_LISTENING)		return -EINVAL;	if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) &&		     (flags & O_NONBLOCK)))		return -EWOULDBLOCK;	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	if (wait_event_interruptible(*sock->sk->sk_sleep,				     skb_queue_len(&sock->sk->sk_receive_queue))) {		res = -ERESTARTSYS;		goto exit;	}	buf = skb_peek(&sock->sk->sk_receive_queue);	res = tipc_create(newsock, 0);	if (!res) {		struct tipc_sock *new_tsock = tipc_sk(newsock->sk);		struct tipc_portid id;		struct tipc_msg *msg = buf_msg(buf);		u32 new_ref = new_tsock->p->ref;		id.ref = msg_origport(msg);		id.node = msg_orignode(msg);		tipc_connect2port(new_ref, &id);		newsock->state = SS_CONNECTED;		tipc_set_portimportance(new_ref, msg_importance(msg));		if (msg_named(msg)) {			new_tsock->p->conn_type = msg_nametype(msg);			new_tsock->p->conn_instance = msg_nameinst(msg);		}	       /*		 * Respond to 'SYN-' by discarding it & returning 'ACK'-.		 * Respond to 'SYN+' by queuing it on new socket.		 */		msg_dbg(msg,"<ACC<: ");		if (!msg_data_sz(msg)) {			struct msghdr m = {NULL,};			send_packet(NULL, newsock, &m, 0);			advance_queue(tsock);		} else {			sock_lock(tsock);			skb_dequeue(&sock->sk->sk_receive_queue);			sock_unlock(tsock);			skb_queue_head(&newsock->sk->sk_receive_queue, buf);		}	}exit:	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:65,


示例18: accept

static int accept(struct socket *sock, struct socket *new_sock, int flags){	struct sock *sk = sock->sk;	struct sk_buff *buf;	int res;	lock_sock(sk);	if (sock->state != SS_LISTENING) {		res = -EINVAL;		goto exit;	}	while (skb_queue_empty(&sk->sk_receive_queue)) {		if (flags & O_NONBLOCK) {			res = -EWOULDBLOCK;			goto exit;		}		release_sock(sk);		res = wait_event_interruptible(*sk_sleep(sk),				(!skb_queue_empty(&sk->sk_receive_queue)));		lock_sock(sk);		if (res)			goto exit;	}	buf = skb_peek(&sk->sk_receive_queue);	res = tipc_create(sock_net(sock->sk), new_sock, 0, 0);	if (!res) {		struct sock *new_sk = new_sock->sk;		struct tipc_sock *new_tsock = tipc_sk(new_sk);		struct tipc_port *new_tport = new_tsock->p;		u32 new_ref = new_tport->ref;		struct tipc_msg *msg = buf_msg(buf);		lock_sock(new_sk);		/*		 * Reject any stray messages received by new socket		 * before the socket lock was taken (very, very unlikely)		 */		reject_rx_queue(new_sk);		/* Connect new socket to it's peer */		new_tsock->peer_name.ref = msg_origport(msg);		new_tsock->peer_name.node = msg_orignode(msg);		tipc_connect2port(new_ref, &new_tsock->peer_name);		new_sock->state = SS_CONNECTED;		tipc_set_portimportance(new_ref, msg_importance(msg));		if (msg_named(msg)) {			new_tport->conn_type = msg_nametype(msg);			new_tport->conn_instance = msg_nameinst(msg);		}		/*		 * Respond to 'SYN-' by discarding it & returning 'ACK'-.		 * Respond to 'SYN+' by queuing it on new socket.		 */		if (!msg_data_sz(msg)) {			struct msghdr m = {NULL,};			advance_rx_queue(sk);			send_packet(NULL, new_sock, &m, 0);		} else {			__skb_dequeue(&sk->sk_receive_queue);			__skb_queue_head(&new_sk->sk_receive_queue, buf);		}		release_sock(new_sk);	}exit:	release_sock(sk);	return res;}
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:78,


示例19: connect

static int connect(struct socket *sock, struct sockaddr *dest, int destlen,		   int flags){	struct sock *sk = sock->sk;	struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;	struct msghdr m = {NULL,};	struct sk_buff *buf;	struct tipc_msg *msg;	unsigned int timeout;	int res;	lock_sock(sk);	/* For now, TIPC does not allow use of connect() with DGRAM/RDM types */	if (sock->state == SS_READY) {		res = -EOPNOTSUPP;		goto exit;	}	/* For now, TIPC does not support the non-blocking form of connect() */	if (flags & O_NONBLOCK) {		res = -EOPNOTSUPP;		goto exit;	}	/* Issue Posix-compliant error code if socket is in the wrong state */	if (sock->state == SS_LISTENING) {		res = -EOPNOTSUPP;		goto exit;	}	if (sock->state == SS_CONNECTING) {		res = -EALREADY;		goto exit;	}	if (sock->state != SS_UNCONNECTED) {		res = -EISCONN;		goto exit;	}	/*	 * Reject connection attempt using multicast address	 *	 * Note: send_msg() validates the rest of the address fields,	 *       so there's no need to do it here	 */	if (dst->addrtype == TIPC_ADDR_MCAST) {		res = -EINVAL;		goto exit;	}	/* Reject any messages already in receive queue (very unlikely) */	reject_rx_queue(sk);	/* Send a 'SYN-' to destination */	m.msg_name = dest;	m.msg_namelen = destlen;	res = send_msg(NULL, sock, &m, 0);	if (res < 0)		goto exit;	/* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */	timeout = tipc_sk(sk)->conn_timeout;	release_sock(sk);	res = wait_event_interruptible_timeout(*sk_sleep(sk),			(!skb_queue_empty(&sk->sk_receive_queue) ||			(sock->state != SS_CONNECTING)),			timeout ? (long)msecs_to_jiffies(timeout)				: MAX_SCHEDULE_TIMEOUT);	lock_sock(sk);	if (res > 0) {		buf = skb_peek(&sk->sk_receive_queue);		if (buf != NULL) {			msg = buf_msg(buf);			res = auto_connect(sock, msg);			if (!res) {				if (!msg_data_sz(msg))					advance_rx_queue(sk);			}		} else {			if (sock->state == SS_CONNECTED)				res = -EISCONN;			else				res = -ECONNREFUSED;		}	} else {		if (res == 0)			res = -ETIMEDOUT;		else			; /* leave "res" unchanged */		sock->state = SS_DISCONNECTING;	}//.........这里部分代码省略.........
开发者ID:0xroot,项目名称:Blackphone-BP1-Kernel,代码行数:101,


示例20: shutdown

static int shutdown(struct socket *sock, int how){	struct tipc_sock* tsock = tipc_sk(sock->sk);	struct sk_buff *buf;	int res;	/* Could return -EINVAL for an invalid "how", but why bother? */	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	sock_lock(tsock);	switch (sock->state) {	case SS_CONNECTED:		/* Send 'FIN+' or 'FIN-' message to peer */		sock_unlock(tsock);restart:		if ((buf = skb_dequeue(&sock->sk->sk_receive_queue))) {			atomic_dec(&tipc_queue_size);			if (TIPC_SKB_CB(buf)->handle != msg_data(buf_msg(buf))) {				buf_discard(buf);				goto restart;			}			tipc_reject_msg(buf, TIPC_CONN_SHUTDOWN);		}		else {			tipc_shutdown(tsock->p->ref);		}		sock_lock(tsock);		/* fall through */	case SS_DISCONNECTING:		/* Discard any unreceived messages */		while ((buf = skb_dequeue(&sock->sk->sk_receive_queue))) {			atomic_dec(&tipc_queue_size);			buf_discard(buf);		}		tsock->p->conn_unacked = 0;		/* fall through */	case SS_CONNECTING:		sock->state = SS_DISCONNECTING;		res = 0;		break;	default:		res = -ENOTCONN;	}	sock_unlock(tsock);	up(&tsock->sem);	return res;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:61,


示例21: connect

/** * connect - establish a connection to another TIPC port * @sock: socket structure * @dest: socket address for destination port * @destlen: size of socket address data structure * @flags: file-related flags associated with socket * * Returns 0 on success, errno otherwise */static int connect(struct socket *sock, struct sockaddr *dest, int destlen,		   int flags){	struct sock *sk = sock->sk;	struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;	struct msghdr m = {NULL,};	unsigned int timeout;	int res;	lock_sock(sk);	/* For now, TIPC does not allow use of connect() with DGRAM/RDM types */	if (sock->state == SS_READY) {		res = -EOPNOTSUPP;		goto exit;	}	/*	 * Reject connection attempt using multicast address	 *	 * Note: send_msg() validates the rest of the address fields,	 *       so there's no need to do it here	 */	if (dst->addrtype == TIPC_ADDR_MCAST) {		res = -EINVAL;		goto exit;	}	timeout = (flags & O_NONBLOCK) ? 0 : tipc_sk(sk)->conn_timeout;	switch (sock->state) {	case SS_UNCONNECTED:		/* Send a 'SYN-' to destination */		m.msg_name = dest;		m.msg_namelen = destlen;		/* If connect is in non-blocking case, set MSG_DONTWAIT to		 * indicate send_msg() is never blocked.		 */		if (!timeout)			m.msg_flags = MSG_DONTWAIT;		res = send_msg(NULL, sock, &m, 0);		if ((res < 0) && (res != -EWOULDBLOCK))			goto exit;		/* Just entered SS_CONNECTING state; the only		 * difference is that return value in non-blocking		 * case is EINPROGRESS, rather than EALREADY.		 */		res = -EINPROGRESS;		break;	case SS_CONNECTING:		res = -EALREADY;		break;	case SS_CONNECTED:		res = -EISCONN;		break;	default:		res = -EINVAL;		goto exit;	}	if (sock->state == SS_CONNECTING) {		if (!timeout)			goto exit;		/* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */		release_sock(sk);		res = wait_event_interruptible_timeout(*sk_sleep(sk),				sock->state != SS_CONNECTING,				timeout ? (long)msecs_to_jiffies(timeout)					: MAX_SCHEDULE_TIMEOUT);		lock_sock(sk);		if (res <= 0) {			if (res == 0)				res = -ETIMEDOUT;			else				; /* leave "res" unchanged */			goto exit;		}	}	if (unlikely(sock->state == SS_DISCONNECTING))		res = sock_error(sk);	else		res = 0;exit:	release_sock(sk);	return res;//.........这里部分代码省略.........
开发者ID:BitOBSessiOn,项目名称:android_kernel_asus_P01M,代码行数:101,


示例22: recv_stream

static int recv_stream(struct kiocb *iocb, struct socket *sock,		       struct msghdr *m, size_t buf_len, int flags){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sk_buff *buf;	struct tipc_msg *msg;	unsigned int q_len;	unsigned int sz;	int sz_to_copy;	int sz_copied = 0;	int needed;	char __user *crs = m->msg_iov->iov_base;	unsigned char *buf_crs;	u32 err;	int res;	/* Currently doesn't support receiving into multiple iovec entries */	if (m->msg_iovlen != 1)		return -EOPNOTSUPP;	/* Catch invalid receive attempts */	if (unlikely(!buf_len))		return -EINVAL;	if (unlikely(sock->state == SS_DISCONNECTING)) {		if (skb_queue_len(&sock->sk->sk_receive_queue) == 0)			return -ENOTCONN;	} else if (unlikely(sock->state != SS_CONNECTED))		return -ENOTCONN;	/* Look for a message in receive queue; wait if necessary */	if (unlikely(down_interruptible(&tsock->sem)))		return -ERESTARTSYS;restart:	if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) &&		     (flags & MSG_DONTWAIT))) {		res = -EWOULDBLOCK;		goto exit;	}	if ((res = wait_event_interruptible(		*sock->sk->sk_sleep,		((q_len = skb_queue_len(&sock->sk->sk_receive_queue)) ||		 (sock->state == SS_DISCONNECTING))) )) {		goto exit;	}	/* Catch attempt to receive on an already terminated connection */	/* [THIS CHECK MAY OVERLAP WITH AN EARLIER CHECK] */	if (!q_len) {		res = -ENOTCONN;		goto exit;	}	/* Get access to first message in receive queue */	buf = skb_peek(&sock->sk->sk_receive_queue);	msg = buf_msg(buf);	sz = msg_data_sz(msg);	err = msg_errcode(msg);	/* Discard an empty non-errored message & try again */	if ((!sz) && (!err)) {		advance_queue(tsock);		goto restart;	}	/* Optionally capture sender's address & ancillary data of first msg */	if (sz_copied == 0) {		set_orig_addr(m, msg);		if ((res = anc_data_recv(m, msg, tsock->p)))			goto exit;	}	/* Capture message data (if valid) & compute return value (always) */	if (!err) {		buf_crs = (unsigned char *)(TIPC_SKB_CB(buf)->handle);		sz = skb_tail_pointer(buf) - buf_crs;		needed = (buf_len - sz_copied);		sz_to_copy = (sz <= needed) ? sz : needed;		if (unlikely(copy_to_user(crs, buf_crs, sz_to_copy))) {			res = -EFAULT;			goto exit;		}		sz_copied += sz_to_copy;		if (sz_to_copy < sz) {			if (!(flags & MSG_PEEK))				TIPC_SKB_CB(buf)->handle = buf_crs + sz_to_copy;			goto exit;		}//.........这里部分代码省略.........
开发者ID:cilynx,项目名称:dd-wrt,代码行数:101,


示例23: recv_msg

static int recv_msg(struct kiocb *iocb, struct socket *sock,		    struct msghdr *m, size_t buf_len, int flags){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sk_buff *buf;	struct tipc_msg *msg;	unsigned int q_len;	unsigned int sz;	u32 err;	int res;	/* Currently doesn't support receiving into multiple iovec entries */	if (m->msg_iovlen != 1)		return -EOPNOTSUPP;	/* Catch invalid receive attempts */	if (unlikely(!buf_len))		return -EINVAL;	if (sock->type == SOCK_SEQPACKET) {		if (unlikely(sock->state == SS_UNCONNECTED))			return -ENOTCONN;		if (unlikely((sock->state == SS_DISCONNECTING) &&			     (skb_queue_len(&sock->sk->sk_receive_queue) == 0)))			return -ENOTCONN;	}	/* Look for a message in receive queue; wait if necessary */	if (unlikely(down_interruptible(&tsock->sem)))		return -ERESTARTSYS;restart:	if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) &&		     (flags & MSG_DONTWAIT))) {		res = -EWOULDBLOCK;		goto exit;	}	if ((res = wait_event_interruptible(		*sock->sk->sk_sleep,		((q_len = skb_queue_len(&sock->sk->sk_receive_queue)) ||		 (sock->state == SS_DISCONNECTING))) )) {		goto exit;	}	/* Catch attempt to receive on an already terminated connection */	/* [THIS CHECK MAY OVERLAP WITH AN EARLIER CHECK] */	if (!q_len) {		res = -ENOTCONN;		goto exit;	}	/* Get access to first message in receive queue */	buf = skb_peek(&sock->sk->sk_receive_queue);	msg = buf_msg(buf);	sz = msg_data_sz(msg);	err = msg_errcode(msg);	/* Complete connection setup for an implied connect */	if (unlikely(sock->state == SS_CONNECTING)) {		if ((res = auto_connect(sock, tsock, msg)))			goto exit;	}	/* Discard an empty non-errored message & try again */	if ((!sz) && (!err)) {		advance_queue(tsock);		goto restart;	}	/* Capture sender's address (optional) */	set_orig_addr(m, msg);	/* Capture ancillary data (optional) */	if ((res = anc_data_recv(m, msg, tsock->p)))		goto exit;	/* Capture message data (if valid) & compute return value (always) */	if (!err) {		if (unlikely(buf_len < sz)) {			sz = buf_len;			m->msg_flags |= MSG_TRUNC;		}		if (unlikely(copy_to_user(m->msg_iov->iov_base, msg_data(msg),					  sz))) {			res = -EFAULT;			goto exit;		}		res = sz;	} else {//.........这里部分代码省略.........
开发者ID:cilynx,项目名称:dd-wrt,代码行数:101,


示例24: send_stream

static int send_stream(struct kiocb *iocb, struct socket *sock,		       struct msghdr *m, size_t total_len){	struct tipc_port *tport;	struct msghdr my_msg;	struct iovec my_iov;	struct iovec *curr_iov;	int curr_iovlen;	char __user *curr_start;	u32 hdr_size;	int curr_left;	int bytes_to_send;	int bytes_sent;	int res;	/* Handle special cases where there is no connection */	if (unlikely(sock->state != SS_CONNECTED)) {		if (sock->state == SS_UNCONNECTED)			return send_packet(iocb, sock, m, total_len);		else if (sock->state == SS_DISCONNECTING)			return -EPIPE;		else			return -ENOTCONN;	}	if (unlikely(m->msg_name))		return -EISCONN;	/*	 * Send each iovec entry using one or more messages	 *	 * Note: This algorithm is good for the most likely case	 * (i.e. one large iovec entry), but could be improved to pass sets	 * of small iovec entries into send_packet().	 */	curr_iov = m->msg_iov;	curr_iovlen = m->msg_iovlen;	my_msg.msg_iov = &my_iov;	my_msg.msg_iovlen = 1;	my_msg.msg_flags = m->msg_flags;	my_msg.msg_name = NULL;	bytes_sent = 0;	tport = tipc_sk(sock->sk)->p;	hdr_size = msg_hdr_sz(&tport->phdr);	while (curr_iovlen--) {		curr_start = curr_iov->iov_base;		curr_left = curr_iov->iov_len;		while (curr_left) {			bytes_to_send = tport->max_pkt - hdr_size;			if (bytes_to_send > TIPC_MAX_USER_MSG_SIZE)				bytes_to_send = TIPC_MAX_USER_MSG_SIZE;			if (curr_left < bytes_to_send)				bytes_to_send = curr_left;			my_iov.iov_base = curr_start;			my_iov.iov_len = bytes_to_send;			if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) {				if (bytes_sent != 0)					res = bytes_sent;				return res;			}			curr_left -= bytes_to_send;			curr_start += bytes_to_send;			bytes_sent += bytes_to_send;		}		curr_iov++;	}	return bytes_sent;}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:75,


示例25: send_msg

static int send_msg(struct kiocb *iocb, struct socket *sock,		    struct msghdr *m, size_t total_len){	struct tipc_sock *tsock = tipc_sk(sock->sk);	struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;	struct sk_buff *buf;	int needs_conn;	int res = -EINVAL;	if (unlikely(!dest))		return -EDESTADDRREQ;	if (unlikely((m->msg_namelen < sizeof(*dest)) ||		     (dest->family != AF_TIPC)))		return -EINVAL;	needs_conn = (sock->state != SS_READY);	if (unlikely(needs_conn)) {		if (sock->state == SS_LISTENING)			return -EPIPE;		if (sock->state != SS_UNCONNECTED)			return -EISCONN;		if ((tsock->p->published) ||		    ((sock->type == SOCK_STREAM) && (total_len != 0)))			return -EOPNOTSUPP;		if (dest->addrtype == TIPC_ADDR_NAME) {			tsock->p->conn_type = dest->addr.name.name.type;			tsock->p->conn_instance = dest->addr.name.name.instance;		}	}	if (down_interruptible(&tsock->sem))		return -ERESTARTSYS;	if (needs_conn) {		/* Abort any pending connection attempts (very unlikely) */		while ((buf = skb_dequeue(&sock->sk->sk_receive_queue))) {			tipc_reject_msg(buf, TIPC_ERR_NO_PORT);			atomic_dec(&tipc_queue_size);		}		sock->state = SS_CONNECTING;	}	do {		if (dest->addrtype == TIPC_ADDR_NAME) {			if ((res = dest_name_check(dest, m)))				goto exit;			res = tipc_send2name(tsock->p->ref,					     &dest->addr.name.name,					     dest->addr.name.domain,					     m->msg_iovlen,					     m->msg_iov);		}		else if (dest->addrtype == TIPC_ADDR_ID) {			res = tipc_send2port(tsock->p->ref,					     &dest->addr.id,					     m->msg_iovlen,					     m->msg_iov);		}		else if (dest->addrtype == TIPC_ADDR_MCAST) {			if (needs_conn) {				res = -EOPNOTSUPP;				goto exit;			}			if ((res = dest_name_check(dest, m)))				goto exit;			res = tipc_multicast(tsock->p->ref,					     &dest->addr.nameseq,					     0,					     m->msg_iovlen,					     m->msg_iov);		}		if (likely(res != -ELINKCONG)) {exit:			up(&tsock->sem);			return res;		}		if (m->msg_flags & MSG_DONTWAIT) {			res = -EWOULDBLOCK;			goto exit;		}		if (wait_event_interruptible(*sock->sk->sk_sleep,					     !tsock->p->congested)) {		    res = -ERESTARTSYS;		    goto exit;		}	} while (1);}
开发者ID:cilynx,项目名称:dd-wrt,代码行数:90,



注:本文中的tipc_sk函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ title函数代码示例
C++ tipc_cfg_reply_error_string函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。