#define CAN_ISOTP_WAIT_TX_DONE 0x400   /* wait for tx completion */
 #define CAN_ISOTP_SF_BROADCAST 0x800   /* 1-to-N functional addressing */
 
-/* default values */
+/* protocol machine default values */
 
 #define CAN_ISOTP_DEFAULT_FLAGS                0
 #define CAN_ISOTP_DEFAULT_EXT_ADDRESS  0x00
 #define CAN_ISOTP_DEFAULT_PAD_CONTENT  0xCC /* prevent bit-stuffing */
-#define CAN_ISOTP_DEFAULT_FRAME_TXTIME 0
+#define CAN_ISOTP_DEFAULT_FRAME_TXTIME 50000 /* 50 micro seconds */
 #define CAN_ISOTP_DEFAULT_RECV_BS      0
 #define CAN_ISOTP_DEFAULT_RECV_STMIN   0x00
 #define CAN_ISOTP_DEFAULT_RECV_WFTMAX  0
 
-#define CAN_ISOTP_DEFAULT_LL_MTU       CAN_MTU
-#define CAN_ISOTP_DEFAULT_LL_TX_DL     CAN_MAX_DLEN
-#define CAN_ISOTP_DEFAULT_LL_TX_FLAGS  0
-
 /*
  * Remark on CAN_ISOTP_DEFAULT_RECV_* values:
  *
  * consistency and copied directly into the flow control (FC) frame.
  */
 
+/* link layer default values => make use of Classical CAN frames */
+
+#define CAN_ISOTP_DEFAULT_LL_MTU       CAN_MTU
+#define CAN_ISOTP_DEFAULT_LL_TX_DL     CAN_MAX_DLEN
+#define CAN_ISOTP_DEFAULT_LL_TX_FLAGS  0
+
+/*
+ * The CAN_ISOTP_DEFAULT_FRAME_TXTIME has become a non-zero value as
+ * it only makes sense for isotp implementation tests to run without
+ * a N_As value. As user space applications usually do not set the
+ * frame_txtime element of struct can_isotp_options the new in-kernel
+ * default is very likely overwritten with zero when the sockopt()
+ * CAN_ISOTP_OPTS is invoked.
+ * To make sure that a N_As value of zero is only set intentional the
+ * value '0' is now interpreted as 'do not change the current value'.
+ * When a frame_txtime of zero is required for testing purposes this
+ * CAN_ISOTP_FRAME_TXTIME_ZERO u32 value has to be set in frame_txtime.
+ */
+#define CAN_ISOTP_FRAME_TXTIME_ZERO    0xFFFFFFFF
+
 #endif /* !_UAPI_CAN_ISOTP_H */
 
        struct can_isotp_options opt;
        struct can_isotp_fc_options rxfc, txfc;
        struct can_isotp_ll_options ll;
+       u32 frame_txtime;
        u32 force_tx_stmin;
        u32 force_rx_stmin;
        u32 cfecho; /* consecutive frame echo tag */
 
                so->tx_gap = ktime_set(0, 0);
                /* add transmission time for CAN frame N_As */
-               so->tx_gap = ktime_add_ns(so->tx_gap, so->opt.frame_txtime);
+               so->tx_gap = ktime_add_ns(so->tx_gap, so->frame_txtime);
                /* add waiting time for consecutive frames N_Cs */
                if (so->opt.flags & CAN_ISOTP_FORCE_TXSTMIN)
                        so->tx_gap = ktime_add_ns(so->tx_gap,
                /* no separate rx_ext_address is given => use ext_address */
                if (!(so->opt.flags & CAN_ISOTP_RX_EXT_ADDR))
                        so->opt.rx_ext_address = so->opt.ext_address;
+
+               /* check for frame_txtime changes (0 => no changes) */
+               if (so->opt.frame_txtime) {
+                       if (so->opt.frame_txtime == CAN_ISOTP_FRAME_TXTIME_ZERO)
+                               so->frame_txtime = 0;
+                       else
+                               so->frame_txtime = so->opt.frame_txtime;
+               }
                break;
 
        case CAN_ISOTP_RECV_FC:
        so->opt.rxpad_content = CAN_ISOTP_DEFAULT_PAD_CONTENT;
        so->opt.txpad_content = CAN_ISOTP_DEFAULT_PAD_CONTENT;
        so->opt.frame_txtime = CAN_ISOTP_DEFAULT_FRAME_TXTIME;
+       so->frame_txtime = CAN_ISOTP_DEFAULT_FRAME_TXTIME;
        so->rxfc.bs = CAN_ISOTP_DEFAULT_RECV_BS;
        so->rxfc.stmin = CAN_ISOTP_DEFAULT_RECV_STMIN;
        so->rxfc.wftmax = CAN_ISOTP_DEFAULT_RECV_WFTMAX;