Commit 4dd820c088d201e526840c9dbc2f0b87a0a41868

Authored by Sjur Brændeland
Committed by David S. Miller
1 parent 73d6ac633c

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

... ... @@ -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 */
... ... @@ -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 }
... ... @@ -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,
... ... @@ -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,
... ... @@ -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,
... ... @@ -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 }
... ... @@ -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 }
... ... @@ -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 }