|
@@ -184,6 +184,11 @@ out:
|
|
|
rfml->serv.dev_info.id);
|
|
|
}
|
|
|
spin_unlock(&rfml->sync);
|
|
|
+
|
|
|
+ if (unlikely(err == -EAGAIN))
|
|
|
+ /* It is not possible to recover after drop of a fragment */
|
|
|
+ err = -EIO;
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -218,7 +223,7 @@ static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt)
|
|
|
caif_assert(layr->dn->transmit != NULL);
|
|
|
|
|
|
if (!cfsrvl_ready(&rfml->serv, &err))
|
|
|
- return err;
|
|
|
+ goto out;
|
|
|
|
|
|
err = -EPROTO;
|
|
|
if (cfpkt_getlen(pkt) <= RFM_HEAD_SIZE-1)
|
|
@@ -251,8 +256,11 @@ static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt)
|
|
|
|
|
|
err = cfrfml_transmit_segment(rfml, frontpkt);
|
|
|
|
|
|
- if (err != 0)
|
|
|
+ if (err != 0) {
|
|
|
+ frontpkt = NULL;
|
|
|
goto out;
|
|
|
+ }
|
|
|
+
|
|
|
frontpkt = rearpkt;
|
|
|
rearpkt = NULL;
|
|
|
|
|
@@ -286,19 +294,8 @@ out:
|
|
|
if (rearpkt)
|
|
|
cfpkt_destroy(rearpkt);
|
|
|
|
|
|
- if (frontpkt && frontpkt != pkt) {
|
|
|
-
|
|
|
+ if (frontpkt)
|
|
|
cfpkt_destroy(frontpkt);
|
|
|
- /*
|
|
|
- * Socket layer will free the original packet,
|
|
|
- * but this packet may already be sent and
|
|
|
- * freed. So we have to return 0 in this case
|
|
|
- * to avoid socket layer to re-free this packet.
|
|
|
- * The return of shutdown indication will
|
|
|
- * cause connection to be invalidated anyhow.
|
|
|
- */
|
|
|
- err = 0;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
return err;
|