]> git.proxmox.com Git - mirror_kronosnet.git/commitdiff
[rx] send reply packets only when transport is connected
authorFabio M. Di Nitto <fdinitto@redhat.com>
Fri, 31 Jan 2020 05:28:56 +0000 (06:28 +0100)
committerFabio M. Di Nitto <fdinitto@redhat.com>
Fri, 31 Jan 2020 05:28:56 +0000 (06:28 +0100)
Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
libknet/threads_rx.c

index 7c7a225d5256df1f17a5ed40728198d99c4cd918..869ce31033c4f9a1a7f729c21e5acdb446259c77 100644 (file)
@@ -582,34 +582,36 @@ retry:
                }
 
 retry_pong:
-               if (transport_get_connection_oriented(knet_h, src_link->transport) == TRANSPORT_PROTO_NOT_CONNECTION_ORIENTED) {
-                       len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL,
-                                    (struct sockaddr *) &src_link->dst_addr, sizeof(struct sockaddr_storage));
-               } else {
-                       len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL, NULL, 0);
-               }
-               savederrno = errno;
-               if (len != outlen) {
-                       err = transport_tx_sock_error(knet_h, src_link->transport, src_link->outsock, len, savederrno);
-                       switch(err) {
-                               case -1: /* unrecoverable error */
-                                       log_debug(knet_h, KNET_SUB_RX,
-                                                 "Unable to send pong reply (sock: %d) packet (sendto): %d %s. recorded src ip: %s src port: %s dst ip: %s dst port: %s",
-                                                 src_link->outsock, errno, strerror(errno),
-                                                 src_link->status.src_ipaddr, src_link->status.src_port,
-                                                 src_link->status.dst_ipaddr, src_link->status.dst_port);
-                                       src_link->status.stats.tx_pong_errors++;
-                                       break;
-                               case 0: /* ignore error and continue */
-                                       break;
-                               case 1: /* retry to send those same data */
-                                       src_link->status.stats.tx_pong_retries++;
-                                       goto retry_pong;
-                                       break;
+               if (src_link->transport_connected) {
+                       if (transport_get_connection_oriented(knet_h, src_link->transport) == TRANSPORT_PROTO_NOT_CONNECTION_ORIENTED) {
+                               len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL,
+                                            (struct sockaddr *) &src_link->dst_addr, sizeof(struct sockaddr_storage));
+                       } else {
+                               len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL, NULL, 0);
+                       }
+                       savederrno = errno;
+                       if (len != outlen) {
+                               err = transport_tx_sock_error(knet_h, src_link->transport, src_link->outsock, len, savederrno);
+                               switch(err) {
+                                       case -1: /* unrecoverable error */
+                                               log_debug(knet_h, KNET_SUB_RX,
+                                                         "Unable to send pong reply (sock: %d) packet (sendto): %d %s. recorded src ip: %s src port: %s dst ip: %s dst port: %s",
+                                                         src_link->outsock, errno, strerror(errno),
+                                                         src_link->status.src_ipaddr, src_link->status.src_port,
+                                                         src_link->status.dst_ipaddr, src_link->status.dst_port);
+                                               src_link->status.stats.tx_pong_errors++;
+                                               break;
+                                       case 0: /* ignore error and continue */
+                                               break;
+                                       case 1: /* retry to send those same data */
+                                               src_link->status.stats.tx_pong_retries++;
+                                               goto retry_pong;
+                                               break;
+                               }
                        }
+                       src_link->status.stats.tx_pong_packets++;
+                       src_link->status.stats.tx_pong_bytes += outlen;
                }
-               src_link->status.stats.tx_pong_packets++;
-               src_link->status.stats.tx_pong_bytes += outlen;
                break;
        case KNET_HEADER_TYPE_PONG:
                src_link->status.stats.rx_pong_packets++;
@@ -698,32 +700,34 @@ retry_pong:
                        goto out_pmtud;
                }
 retry_pmtud:
-               if (transport_get_connection_oriented(knet_h, src_link->transport) == TRANSPORT_PROTO_NOT_CONNECTION_ORIENTED) {
-                       len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL,
-                                    (struct sockaddr *) &src_link->dst_addr, sizeof(struct sockaddr_storage));
-               } else {
-                       len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL, NULL, 0);
-               }
-               savederrno = errno;
-               if (len != outlen) {
-                       err = transport_tx_sock_error(knet_h, src_link->transport, src_link->outsock, len, savederrno);
-                       switch(err) {
-                               case -1: /* unrecoverable error */
-                                       log_debug(knet_h, KNET_SUB_RX,
-                                                 "Unable to send PMTUd reply (sock: %d) packet (sendto): %d %s. recorded src ip: %s src port: %s dst ip: %s dst port: %s",
-                                                 src_link->outsock, errno, strerror(errno),
-                                                 src_link->status.src_ipaddr, src_link->status.src_port,
-                                                 src_link->status.dst_ipaddr, src_link->status.dst_port);
-
-                                       src_link->status.stats.tx_pmtu_errors++;
-                                       break;
-                               case 0: /* ignore error and continue */
-                                       src_link->status.stats.tx_pmtu_errors++;
-                                       break;
-                               case 1: /* retry to send those same data */
-                                       src_link->status.stats.tx_pmtu_retries++;
-                                       goto retry_pmtud;
-                                       break;
+               if (src_link->transport_connected) {
+                       if (transport_get_connection_oriented(knet_h, src_link->transport) == TRANSPORT_PROTO_NOT_CONNECTION_ORIENTED) {
+                               len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL,
+                                            (struct sockaddr *) &src_link->dst_addr, sizeof(struct sockaddr_storage));
+                       } else {
+                               len = sendto(src_link->outsock, outbuf, outlen, MSG_DONTWAIT | MSG_NOSIGNAL, NULL, 0);
+                       }
+                       savederrno = errno;
+                       if (len != outlen) {
+                               err = transport_tx_sock_error(knet_h, src_link->transport, src_link->outsock, len, savederrno);
+                               switch(err) {
+                                       case -1: /* unrecoverable error */
+                                               log_debug(knet_h, KNET_SUB_RX,
+                                                         "Unable to send PMTUd reply (sock: %d) packet (sendto): %d %s. recorded src ip: %s src port: %s dst ip: %s dst port: %s",
+                                                         src_link->outsock, errno, strerror(errno),
+                                                         src_link->status.src_ipaddr, src_link->status.src_port,
+                                                         src_link->status.dst_ipaddr, src_link->status.dst_port);
+
+                                               src_link->status.stats.tx_pmtu_errors++;
+                                               break;
+                                       case 0: /* ignore error and continue */
+                                               src_link->status.stats.tx_pmtu_errors++;
+                                               break;
+                                       case 1: /* retry to send those same data */
+                                               src_link->status.stats.tx_pmtu_retries++;
+                                               goto retry_pmtud;
+                                               break;
+                               }
                        }
                }
                pthread_mutex_unlock(&knet_h->tx_mutex);