diff options
author | Sjur Brændeland <sjur.brandeland@stericsson.com> | 2011-04-11 06:43:51 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-04-11 18:08:48 -0400 |
commit | 4dd820c088d201e526840c9dbc2f0b87a0a41868 (patch) | |
tree | fac7a3a70bd32df3104ae6f1273a727fb0fa006f /net/caif/caif_socket.c | |
parent | 73d6ac633c6c0ca703f90db0b808d9593e46aef6 (diff) |
caif: Don't resend if dev_queue_xmit fails.
If CAIF Link Layer returns an error, we no longer try to re-build the
CAIF packet and resend it. Instead, we simply return any transmission
errors to the socket client.
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/caif/caif_socket.c')
-rw-r--r-- | net/caif/caif_socket.c | 35 |
1 files changed, 3 insertions, 32 deletions
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 37a4034dfc29..20212424e2e8 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -519,43 +519,14 @@ static int transmit_skb(struct sk_buff *skb, struct caifsock *cf_sk, | |||
519 | int noblock, long timeo) | 519 | int noblock, long timeo) |
520 | { | 520 | { |
521 | struct cfpkt *pkt; | 521 | struct cfpkt *pkt; |
522 | int ret, loopcnt = 0; | ||
523 | 522 | ||
524 | pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb); | 523 | pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb); |
525 | memset(cfpkt_info(pkt), 0, sizeof(struct caif_payload_info)); | 524 | memset(cfpkt_info(pkt), 0, sizeof(struct caif_payload_info)); |
526 | do { | ||
527 | |||
528 | ret = -ETIMEDOUT; | ||
529 | 525 | ||
530 | /* Slight paranoia, probably not needed. */ | 526 | if (cf_sk->layer.dn == NULL) |
531 | if (unlikely(loopcnt++ > 1000)) { | 527 | return -EINVAL; |
532 | pr_warn("transmit retries failed, error = %d\n", ret); | ||
533 | break; | ||
534 | } | ||
535 | 528 | ||
536 | if (cf_sk->layer.dn != NULL) | 529 | return cf_sk->layer.dn->transmit(cf_sk->layer.dn, pkt); |
537 | ret = cf_sk->layer.dn->transmit(cf_sk->layer.dn, pkt); | ||
538 | if (likely(ret >= 0)) | ||
539 | break; | ||
540 | /* if transmit return -EAGAIN, then retry */ | ||
541 | if (noblock && ret == -EAGAIN) | ||
542 | break; | ||
543 | timeo = caif_wait_for_flow_on(cf_sk, 0, timeo, &ret); | ||
544 | if (signal_pending(current)) { | ||
545 | ret = sock_intr_errno(timeo); | ||
546 | break; | ||
547 | } | ||
548 | if (ret) | ||
549 | break; | ||
550 | if (cf_sk->sk.sk_state != CAIF_CONNECTED || | ||
551 | sock_flag(&cf_sk->sk, SOCK_DEAD) || | ||
552 | (cf_sk->sk.sk_shutdown & RCV_SHUTDOWN)) { | ||
553 | ret = -EPIPE; | ||
554 | cf_sk->sk.sk_err = EPIPE; | ||
555 | break; | ||
556 | } | ||
557 | } while (ret == -EAGAIN); | ||
558 | return ret; | ||
559 | } | 530 | } |
560 | 531 | ||
561 | /* Copied from af_unix:unix_dgram_sendmsg, and adapted to CAIF */ | 532 | /* Copied from af_unix:unix_dgram_sendmsg, and adapted to CAIF */ |