Skip to content

Commit

Permalink
tcp: Move rcvq sending to tcp_input.c
Browse files Browse the repository at this point in the history
It actually works on the input queue and will use its read mem
routines, thus it's better to have in in the tcp_input.c file.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Pavel Emelyanov authored and David S. Miller committed May 11, 2012
1 parent 74e04ac commit 292e8d8
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 36 deletions.
3 changes: 1 addition & 2 deletions include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,8 +432,7 @@ extern int tcp_disconnect(struct sock *sk, int flags);

void tcp_connect_init(struct sock *sk);
void tcp_finish_connect(struct sock *sk, struct sk_buff *skb);
int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb,
int hdrlen, bool *fragstolen);
int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size);

/* From syncookies.c */
extern __u32 syncookie_secret[2][16-4+SHA_DIGEST_WORDS];
Expand Down
33 changes: 0 additions & 33 deletions net/ipv4/tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -978,39 +978,6 @@ static inline int select_size(const struct sock *sk, bool sg)
return tmp;
}

static int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
{
struct sk_buff *skb;
struct tcphdr *th;
bool fragstolen;

skb = alloc_skb(size + sizeof(*th), sk->sk_allocation);
if (!skb)
goto err;

th = (struct tcphdr *)skb_put(skb, sizeof(*th));
skb_reset_transport_header(skb);
memset(th, 0, sizeof(*th));

if (memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size))
goto err_free;

TCP_SKB_CB(skb)->seq = tcp_sk(sk)->rcv_nxt;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + size;
TCP_SKB_CB(skb)->ack_seq = tcp_sk(sk)->snd_una - 1;

if (tcp_queue_rcv(sk, skb, sizeof(*th), &fragstolen)) {
WARN_ON_ONCE(fragstolen); /* should not happen */
__kfree_skb(skb);
}
return size;

err_free:
kfree_skb(skb);
err:
return -ENOMEM;
}

int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t size)
{
Expand Down
35 changes: 34 additions & 1 deletion net/ipv4/tcp_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -4746,7 +4746,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb)
skb_set_owner_r(skb, sk);
}

int tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int hdrlen,
static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int hdrlen,
bool *fragstolen)
{
int eaten;
Expand All @@ -4763,6 +4763,39 @@ int tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int hdrlen,
return eaten;
}

int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
{
struct sk_buff *skb;
struct tcphdr *th;
bool fragstolen;

skb = alloc_skb(size + sizeof(*th), sk->sk_allocation);
if (!skb)
goto err;

th = (struct tcphdr *)skb_put(skb, sizeof(*th));
skb_reset_transport_header(skb);
memset(th, 0, sizeof(*th));

if (memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size))
goto err_free;

TCP_SKB_CB(skb)->seq = tcp_sk(sk)->rcv_nxt;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + size;
TCP_SKB_CB(skb)->ack_seq = tcp_sk(sk)->snd_una - 1;

if (tcp_queue_rcv(sk, skb, sizeof(*th), &fragstolen)) {
WARN_ON_ONCE(fragstolen); /* should not happen */
__kfree_skb(skb);
}
return size;

err_free:
kfree_skb(skb);
err:
return -ENOMEM;
}

static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
{
const struct tcphdr *th = tcp_hdr(skb);
Expand Down

0 comments on commit 292e8d8

Please sign in to comment.