* include/net/tipc/tipc_port.h: Include file for privileged access to TIPC ports
  * 
  * Copyright (c) 1994-2007, Ericsson AB
- * Copyright (c) 2005-2007, Wind River Systems
+ * Copyright (c) 2005-2008, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 };
 
 
-/**
- * tipc_createport_raw - create a native TIPC port and return it's reference
- *
- * Note: 'dispatcher' and 'wakeup' deliver a locked port.
- */
-
-u32 tipc_createport_raw(void *usr_handle,
+struct tipc_port *tipc_createport_raw(void *usr_handle,
                        u32 (*dispatcher)(struct tipc_port *, struct sk_buff *),
                        void (*wakeup)(struct tipc_port *),
-                       const u32 importance,
-                       struct tipc_port **tp_ptr);
+                       const u32 importance);
 
 int tipc_reject_msg(struct sk_buff *buf, u32 err);
 
 
  * net/tipc/port.c: TIPC port code
  *
  * Copyright (c) 1992-2007, Ericsson AB
- * Copyright (c) 2004-2007, Wind River Systems
+ * Copyright (c) 2004-2008, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 /**
  * tipc_createport_raw - create a generic TIPC port
  *
- * Returns port reference, or 0 if unable to create it
- *
- * Note: The newly created port is returned in the locked state.
+ * Returns pointer to (locked) TIPC port, or NULL if unable to create it
  */
 
-u32 tipc_createport_raw(void *usr_handle,
+struct tipc_port *tipc_createport_raw(void *usr_handle,
                        u32 (*dispatcher)(struct tipc_port *, struct sk_buff *),
                        void (*wakeup)(struct tipc_port *),
-                       const u32 importance,
-                       struct tipc_port **tp_ptr)
+                       const u32 importance)
 {
        struct port *p_ptr;
        struct tipc_msg *msg;
        p_ptr = kzalloc(sizeof(*p_ptr), GFP_ATOMIC);
        if (!p_ptr) {
                warn("Port creation failed, no memory\n");
-               return 0;
+               return NULL;
        }
        ref = tipc_ref_acquire(p_ptr, &p_ptr->publ.lock);
        if (!ref) {
                warn("Port creation failed, reference table exhausted\n");
                kfree(p_ptr);
-               return 0;
+               return NULL;
        }
 
        p_ptr->publ.usr_handle = usr_handle;
        INIT_LIST_HEAD(&p_ptr->port_list);
        list_add_tail(&p_ptr->port_list, &ports);
        spin_unlock_bh(&tipc_port_list_lock);
-       *tp_ptr = &p_ptr->publ;
-       return ref;
+       return &(p_ptr->publ);
 }
 
 int tipc_deleteport(u32 ref)
 {
        struct user_port *up_ptr;
        struct port *p_ptr;
-       struct tipc_port *tp_ptr;
-       u32 ref;
 
        up_ptr = kmalloc(sizeof(*up_ptr), GFP_ATOMIC);
        if (!up_ptr) {
                warn("Port creation failed, no memory\n");
                return -ENOMEM;
        }
-       ref = tipc_createport_raw(NULL, port_dispatcher, port_wakeup,
-                                 importance, &tp_ptr);
-       if (ref == 0) {
+       p_ptr = (struct port *)tipc_createport_raw(NULL, port_dispatcher,
+                                                  port_wakeup, importance);
+       if (!p_ptr) {
                kfree(up_ptr);
                return -ENOMEM;
        }
-       p_ptr = (struct port *)tp_ptr;
 
        p_ptr->user_port = up_ptr;
        up_ptr->user_ref = user_ref;
        INIT_LIST_HEAD(&up_ptr->uport_list);
        tipc_reg_add_port(up_ptr);
        *portref = p_ptr->publ.ref;
-       dbg(" tipc_createport: %x with ref %u\n", p_ptr, p_ptr->publ.ref);
        tipc_port_unlock(p_ptr);
        return TIPC_OK;
 }
 
  * net/tipc/socket.c: TIPC socket API
  *
  * Copyright (c) 2001-2007, Ericsson AB
- * Copyright (c) 2004-2007, Wind River Systems
+ * Copyright (c) 2004-2008, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
        socket_state state;
        struct sock *sk;
        struct tipc_port *tp_ptr;
-       u32 portref;
 
        /* Validate arguments */
 
 
        /* Allocate TIPC port for socket to use */
 
-       portref = tipc_createport_raw(sk, &dispatch, &wakeupdispatch,
-                                     TIPC_LOW_IMPORTANCE, &tp_ptr);
-       if (unlikely(portref == 0)) {
+       tp_ptr = tipc_createport_raw(sk, &dispatch, &wakeupdispatch,
+                                    TIPC_LOW_IMPORTANCE);
+       if (unlikely(!tp_ptr)) {
                sk_free(sk);
                return -ENOMEM;
        }
        sock_init_data(sock, sk);
        sk->sk_rcvtimeo = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT);
        sk->sk_backlog_rcv = backlog_rcv;
-       tipc_sk(sk)->p = tipc_get_port(portref);
+       tipc_sk(sk)->p = tp_ptr;
 
        spin_unlock_bh(tp_ptr->lock);
 
        if (sock->state == SS_READY) {
-               tipc_set_portunreturnable(portref, 1);
+               tipc_set_portunreturnable(tp_ptr->ref, 1);
                if (sock->type == SOCK_DGRAM)
-                       tipc_set_portunreliable(portref, 1);
+                       tipc_set_portunreliable(tp_ptr->ref, 1);
        }
 
        atomic_inc(&tipc_user_count);