Teensy 4.1 Native Ethernet

Edsgn

New member
BUG - Using Teensy 4.1 Native Ethernet software / library bug I believe but... I found when the MCU called "EthernetClient client = _server.available();" it would function the first time around. Connect to the server, read data, continue to perform other logic. Then the next time it performed this function it would get stuck and time out if I did not send any requests from the Server. If I did send a request from the server it would scan once and stop on this logic again.

It would block everything even interrupts that were running. This was using the library that just downloaded with the teensyduino add-on. I found an older version of the function and used it instead and everything works as it should.

Not sure why it is happening in the newer function?

This is the old? functioning code...

Code:
int EthernetClient::available()
{
    if (sockindex >= Ethernet.socket_num) return 0;
    if (Ethernet.socket_ptr[sockindex] == nullptr) return 0;
    struct fnet_sockaddr _from;
    fnet_size_t fromlen = sizeof(_from);
    
    int ret = 0;
    if(_remaining == 0) {
#if FNET_CFG_TLS
        if(EthernetServer::_tls[sockindex]){
            fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, MSG_PEEK, &_from, &fromlen);
            ret = fnet_tls_socket_recv(EthernetServer::tls_socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size);
            Ethernet.socket_buf_index[sockindex] = 0;
        }
        else{
            ret = fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, 0, &_from, &fromlen);
            Ethernet.socket_buf_index[sockindex] = 0;
        }
#else
        ret = fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, 0, &_from, &fromlen);
        Ethernet.socket_buf_index[sockindex] = 0;
#endif
    }
    int8_t error_handler = fnet_error_get();
    if(error_handler == -20){
        stop();
        return 0;
    }
    if(ret == -1){
        _remaining = 0;
        return 0;
    }
    
    if(ret){
        _remoteIP = _from.sa_data;
        _remotePort = FNET_HTONS(_from.sa_port);
        _remaining = ret;
    }
    
    return _remaining;
}

This is the one that wasn't working.....

Code:
int EthernetClient::available()
{
    if (sockindex >= Ethernet.socket_num) return 0;
    if (Ethernet.socket_ptr[sockindex] == nullptr) return 0;
    struct fnet_sockaddr _from;
    fnet_size_t fromlen = sizeof(_from);
    
    int ret = 0;
    if(_remaining == 0) {
#if FNET_CFG_TLS
        if(EthernetServer::_tls[sockindex]){
            fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, MSG_PEEK, &_from, &fromlen);
            ret = fnet_tls_socket_recv(EthernetServer::tls_socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size);
            Ethernet.socket_buf_index[sockindex] = 0;
        }
        else{
            ret = fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, 0, &_from, &fromlen);
            Ethernet.socket_buf_index[sockindex] = 0;
        }
#else
        ret = fnet_socket_recvfrom(Ethernet.socket_ptr[sockindex], Ethernet.socket_buf_receive[sockindex], Ethernet.socket_size, 0, &_from, &fromlen);
        Ethernet.socket_buf_index[sockindex] = 0;
#endif
    }
    if(ret == -1){
        uint8_t s = Ethernet.socketStatus(sockindex);
        if (s == SnSR::CLOSE_WAIT || s == SnSR::CLOSED || s == SnSR::INIT) return 0;
        int8_t error_handler = fnet_error_get();
        if(error_handler == -20){
//            Serial.print("RecvErr: ");
//            Serial.send_now();
//            Serial.print(error_handler);
//            Serial.print("  Ret: ");
//            Serial.print(ret);
//            Serial.print("  Remaining: ");
//            Serial.println(_remaining);
//            stop();
            return 0;
        }
        Serial.print("SockIndex: ");
        Serial.print(sockindex, HEX);
        Serial.print("  SockStatus: ");
        Serial.print(s, HEX);
        Serial.print("  ");
        Serial.print("RecvErr: ");
        Serial.send_now();
        Serial.println(error_handler);
        _remaining = 0;
        return 0;
    }
    
    if(ret){
        _remoteIP = _from.sa_data;
        _remotePort = FNET_HTONS(_from.sa_port);
        _remaining = ret;
    }
    
    return _remaining;
}
 
Back
Top