Commit 4dd820c088d201e526840c9dbc2f0b87a0a41868
Committed by
David S. Miller
1 parent
73d6ac633c
Exists in
master
and in
4 other branches
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>
Showing 9 changed files with 14 additions and 88 deletions Side-by-side Diff
net/caif/caif_dev.c
... | ... | @@ -120,25 +120,12 @@ |
120 | 120 | { |
121 | 121 | struct caif_device_entry *caifd = |
122 | 122 | container_of(layer, struct caif_device_entry, layer); |
123 | - struct sk_buff *skb, *skb2; | |
124 | - int ret = -EINVAL; | |
123 | + struct sk_buff *skb; | |
124 | + | |
125 | 125 | skb = cfpkt_tonative(pkt); |
126 | 126 | skb->dev = caifd->netdev; |
127 | - /* | |
128 | - * Don't allow SKB to be destroyed upon error, but signal resend | |
129 | - * notification to clients. We can't rely on the return value as | |
130 | - * congestion (NET_XMIT_CN) sometimes drops the packet, sometimes don't. | |
131 | - */ | |
132 | - if (netif_queue_stopped(caifd->netdev)) | |
133 | - return -EAGAIN; | |
134 | - skb2 = skb_get(skb); | |
135 | 127 | |
136 | - ret = dev_queue_xmit(skb2); | |
137 | - | |
138 | - if (!ret) | |
139 | - kfree_skb(skb); | |
140 | - else | |
141 | - return -EAGAIN; | |
128 | + dev_queue_xmit(skb); | |
142 | 129 | |
143 | 130 | return 0; |
144 | 131 | } |
net/caif/caif_socket.c
... | ... | @@ -519,43 +519,14 @@ |
519 | 519 | int noblock, long timeo) |
520 | 520 | { |
521 | 521 | struct cfpkt *pkt; |
522 | - int ret, loopcnt = 0; | |
523 | 522 | |
524 | 523 | pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb); |
525 | 524 | memset(cfpkt_info(pkt), 0, sizeof(struct caif_payload_info)); |
526 | - do { | |
527 | 525 | |
528 | - ret = -ETIMEDOUT; | |
526 | + if (cf_sk->layer.dn == NULL) | |
527 | + return -EINVAL; | |
529 | 528 | |
530 | - /* Slight paranoia, probably not needed. */ | |
531 | - if (unlikely(loopcnt++ > 1000)) { | |
532 | - pr_warn("transmit retries failed, error = %d\n", ret); | |
533 | - break; | |
534 | - } | |
535 | - | |
536 | - if (cf_sk->layer.dn != NULL) | |
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; | |
529 | + return cf_sk->layer.dn->transmit(cf_sk->layer.dn, pkt); | |
559 | 530 | } |
560 | 531 | |
561 | 532 | /* Copied from af_unix:unix_dgram_sendmsg, and adapted to CAIF */ |
net/caif/cfdgml.c
... | ... | @@ -108,11 +108,6 @@ |
108 | 108 | */ |
109 | 109 | info->hdr_len = 4; |
110 | 110 | info->dev_info = &service->dev_info; |
111 | - ret = layr->dn->transmit(layr->dn, pkt); | |
112 | - if (ret < 0) { | |
113 | - u32 tmp32; | |
114 | - cfpkt_extr_head(pkt, &tmp32, 4); | |
115 | - } | |
116 | - return ret; | |
111 | + return layr->dn->transmit(layr->dn, pkt); | |
117 | 112 | } |
net/caif/cffrml.c
... | ... | @@ -120,7 +120,6 @@ |
120 | 120 | int tmp; |
121 | 121 | u16 chks; |
122 | 122 | u16 len; |
123 | - int ret; | |
124 | 123 | struct cffrml *this = container_obj(layr); |
125 | 124 | if (this->dofcs) { |
126 | 125 | chks = cfpkt_iterate(pkt, cffrml_checksum, 0xffff); |
... | ... | @@ -137,12 +136,7 @@ |
137 | 136 | pr_err("Packet is erroneous!\n"); |
138 | 137 | return -EPROTO; |
139 | 138 | } |
140 | - ret = layr->dn->transmit(layr->dn, pkt); | |
141 | - if (ret < 0) { | |
142 | - /* Remove header on faulty packet. */ | |
143 | - cfpkt_extr_head(pkt, &tmp, 2); | |
144 | - } | |
145 | - return ret; | |
139 | + return layr->dn->transmit(layr->dn, pkt); | |
146 | 140 | } |
147 | 141 | |
148 | 142 | static void cffrml_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl, |
net/caif/cfmuxl.c
... | ... | @@ -184,7 +184,6 @@ |
184 | 184 | |
185 | 185 | static int cfmuxl_transmit(struct cflayer *layr, struct cfpkt *pkt) |
186 | 186 | { |
187 | - int ret; | |
188 | 187 | struct cfmuxl *muxl = container_obj(layr); |
189 | 188 | u8 linkid; |
190 | 189 | struct cflayer *dn; |
... | ... | @@ -198,11 +197,7 @@ |
198 | 197 | info->hdr_len += 1; |
199 | 198 | linkid = info->channel_id; |
200 | 199 | cfpkt_add_head(pkt, &linkid, 1); |
201 | - ret = dn->transmit(dn, pkt); | |
202 | - /* Remove MUX protocol header upon error. */ | |
203 | - if (ret < 0) | |
204 | - cfpkt_extr_head(pkt, &linkid, 1); | |
205 | - return ret; | |
200 | + return dn->transmit(dn, pkt); | |
206 | 201 | } |
207 | 202 | |
208 | 203 | static void cfmuxl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl, |
net/caif/cfserl.c
... | ... | @@ -179,15 +179,10 @@ |
179 | 179 | static int cfserl_transmit(struct cflayer *layer, struct cfpkt *newpkt) |
180 | 180 | { |
181 | 181 | struct cfserl *layr = container_obj(layer); |
182 | - int ret; | |
183 | 182 | u8 tmp8 = CFSERL_STX; |
184 | 183 | if (layr->usestx) |
185 | 184 | cfpkt_add_head(newpkt, &tmp8, 1); |
186 | - ret = layer->dn->transmit(layer->dn, newpkt); | |
187 | - if (ret < 0) | |
188 | - cfpkt_extr_head(newpkt, &tmp8, 1); | |
189 | - | |
190 | - return ret; | |
185 | + return layer->dn->transmit(layer->dn, newpkt); | |
191 | 186 | } |
192 | 187 | |
193 | 188 | static void cfserl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl, |
net/caif/cfutill.c
... | ... | @@ -100,11 +100,6 @@ |
100 | 100 | */ |
101 | 101 | info->hdr_len = 1; |
102 | 102 | info->dev_info = &service->dev_info; |
103 | - ret = layr->dn->transmit(layr->dn, pkt); | |
104 | - if (ret < 0) { | |
105 | - u32 tmp32; | |
106 | - cfpkt_extr_head(pkt, &tmp32, 4); | |
107 | - } | |
108 | - return ret; | |
103 | + return layr->dn->transmit(layr->dn, pkt); | |
109 | 104 | } |
net/caif/cfveil.c
... | ... | @@ -96,9 +96,6 @@ |
96 | 96 | info->channel_id = service->layer.id; |
97 | 97 | info->hdr_len = 1; |
98 | 98 | info->dev_info = &service->dev_info; |
99 | - ret = layr->dn->transmit(layr->dn, pkt); | |
100 | - if (ret < 0) | |
101 | - cfpkt_extr_head(pkt, &tmp, 1); | |
102 | - return ret; | |
99 | + return layr->dn->transmit(layr->dn, pkt); | |
103 | 100 | } |
net/caif/cfvidl.c
... | ... | @@ -60,9 +60,6 @@ |
60 | 60 | info = cfpkt_info(pkt); |
61 | 61 | info->channel_id = service->layer.id; |
62 | 62 | info->dev_info = &service->dev_info; |
63 | - ret = layr->dn->transmit(layr->dn, pkt); | |
64 | - if (ret < 0) | |
65 | - cfpkt_extr_head(pkt, &videoheader, 4); | |
66 | - return ret; | |
63 | + return layr->dn->transmit(layr->dn, pkt); | |
67 | 64 | } |