|
@@ -205,6 +205,7 @@ int tipc_disconnect_port(struct tipc_port *tp_ptr);
|
|
|
/*
|
|
|
* TIPC messaging routines
|
|
|
*/
|
|
|
+int tipc_port_recv_msg(struct sk_buff *buf);
|
|
|
int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect,
|
|
|
unsigned int total_len);
|
|
|
|
|
@@ -271,45 +272,4 @@ static inline int tipc_port_congested(struct tipc_port *p_ptr)
|
|
|
return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * tipc_port_recv_msg - receive message from lower layer and deliver to port user
|
|
|
- */
|
|
|
-
|
|
|
-static inline int tipc_port_recv_msg(struct sk_buff *buf)
|
|
|
-{
|
|
|
- struct tipc_port *p_ptr;
|
|
|
- struct tipc_msg *msg = buf_msg(buf);
|
|
|
- u32 destport = msg_destport(msg);
|
|
|
- u32 dsz = msg_data_sz(msg);
|
|
|
- u32 err;
|
|
|
-
|
|
|
- /* forward unresolved named message */
|
|
|
- if (unlikely(!destport)) {
|
|
|
- tipc_net_route_msg(buf);
|
|
|
- return dsz;
|
|
|
- }
|
|
|
-
|
|
|
- /* validate destination & pass to port, otherwise reject message */
|
|
|
- p_ptr = tipc_port_lock(destport);
|
|
|
- if (likely(p_ptr)) {
|
|
|
- if (likely(p_ptr->connected)) {
|
|
|
- if ((unlikely(msg_origport(msg) != tipc_peer_port(p_ptr))) ||
|
|
|
- (unlikely(msg_orignode(msg) != tipc_peer_node(p_ptr))) ||
|
|
|
- (unlikely(!msg_connected(msg)))) {
|
|
|
- err = TIPC_ERR_NO_PORT;
|
|
|
- tipc_port_unlock(p_ptr);
|
|
|
- goto reject;
|
|
|
- }
|
|
|
- }
|
|
|
- err = p_ptr->dispatcher(p_ptr, buf);
|
|
|
- tipc_port_unlock(p_ptr);
|
|
|
- if (likely(!err))
|
|
|
- return dsz;
|
|
|
- } else {
|
|
|
- err = TIPC_ERR_NO_PORT;
|
|
|
- }
|
|
|
-reject:
|
|
|
- return tipc_reject_msg(buf, err);
|
|
|
-}
|
|
|
-
|
|
|
#endif
|