void sdp_post_keepalive(struct sdp_sock *ssk);
void sdp_start_keepalive_timer(struct sock *sk);
void sdp_bzcopy_write_space(struct sdp_sock *ssk);
+int sdp_init_sock(struct sock *sk);
static inline struct sk_buff *sdp_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp)
{
ib_dealloc_pd(pd);
err_pd:
kfree(sdp_sk(sk)->rx_ring);
+ sdp_sk(sk)->rx_ring = NULL;
err_rx:
kfree(sdp_sk(sk)->tx_ring);
+ sdp_sk(sk)->tx_ring = NULL;
err_tx:
return rc;
}
if (!child)
return -ENOMEM;
+ sdp_init_sock(child);
+
sdp_add_sock(sdp_sk(child));
- INIT_LIST_HEAD(&sdp_sk(child)->accept_queue);
- INIT_LIST_HEAD(&sdp_sk(child)->backlog_queue);
- INIT_DELAYED_WORK(&sdp_sk(child)->dreq_wait_work, sdp_dreq_wait_timeout_work);
- INIT_WORK(&sdp_sk(child)->destroy_work, sdp_destroy_work);
dst_addr = (struct sockaddr_in *)&id->route.addr.dst_addr;
inet_sk(child)->dport = dst_addr->sin_port;
sdp_remove_large_sock(ssk);
- kfree(ssk->rx_ring);
- kfree(ssk->tx_ring);
+ if (ssk->rx_ring) {
+ kfree(ssk->rx_ring);
+ ssk->rx_ring = NULL;
+ }
+ if (ssk->tx_ring) {
+ kfree(ssk->tx_ring);
+ ssk->tx_ring = NULL;
+ }
}
sock_put(sk, SOCK_REF_DREQ_TO);
}
-static int sdp_init_sock(struct sock *sk)
+int sdp_init_sock(struct sock *sk)
{
struct sdp_sock *ssk = sdp_sk(sk);
- struct inet_sock *isk = (struct inet_sock *)sk;
sdp_dbg(sk, "%s\n", __func__);
- memset(isk + 1, 0, sizeof(struct sdp_sock) - sizeof(*isk));
-
INIT_LIST_HEAD(&ssk->accept_queue);
INIT_LIST_HEAD(&ssk->backlog_queue);
INIT_DELAYED_WORK(&ssk->dreq_wait_work, sdp_dreq_wait_timeout_work);
sk->sk_route_caps |= NETIF_F_SG | NETIF_F_NO_CSUM;
+ ssk->rx_ring = NULL;
+ ssk->tx_ring = NULL;
ssk->sdp_disconnect = 0;
ssk->destructed_already = 0;
spin_lock_init(&ssk->lock);
sock_init_data(sock, sk);
sk->sk_protocol = 0x0 /* TODO: inherit tcp socket to use IPPROTO_TCP */;
+ memset((struct inet_sock *)sk + 1, 0,
+ sizeof(struct sdp_sock) - sizeof(struct inet_sock));
rc = sdp_init_sock(sk);
if (rc) {
sdp_warn(sk, "SDP: failed to init sock.\n");