code: def _tx_timer_handler(self):
          
  
          with self.tx_mutex:
              if (self.tx_state == ISOTP_WAIT_FC or
                      self.tx_state == ISOTP_WAIT_FIRST_FC):
                  # we did not get any flow control frame in time
                  # reset tx state
                  self.tx_state = ISOTP_IDLE
                  self.tx_exception = "TX state was reset due to timeout"
                  self.tx_done.set()
                  raise Scapy_Exception(self.tx_exception)
              elif self.tx_state == ISOTP_SENDING:
                  # push out the next segmented pdu
                  src_off = len(self.ea_hdr)
                  max_bytes = 7 - src_off
  
                  while 1:
                      load = self.ea_hdr
                      load += struct.pack("B", N_PCI_CF + self.tx_sn)
                      load += self.tx_buf[self.tx_idx:self.tx_idx + max_bytes]
                      self.can_send(load)
  
                      self.tx_sn = (self.tx_sn + 1) % 16
                      self.tx_bs += 1
                      self.tx_idx += max_bytes
  
                      if len(self.tx_buf) <= self.tx_idx:
                          # we are done
                          self.tx_state = ISOTP_IDLE
                          self.tx_done.set()
                          for cb in self.tx_callbacks:
                              cb()
                          return
  
                      if self.txfc_bs != 0 and self.tx_bs >= self.txfc_bs:
                          # stop and wait for FC
                          self.tx_state = ISOTP_WAIT_FC
                          self.tx_timer.set_timeout(self.fc_timeout,
                                                    self._tx_timer_handler)
                          return
  
                      if self.tx_gap == 0:
                          continue
                      else:
                          self.tx_timer.set_timeout(self.tx_gap,
                                                    self._tx_timer_handler)
docs: Method called every time the tx_timer times out, which can happen in
          two situations: either a Flow Control frame was not received in time,
          or the Separation Time Min is expired and a new frame must be sent.