Forum: Mikrocontroller und Digitale Elektronik µIP und UDP, mehrere Verbindungen parallel über UDP


von Al N (Gast)


Lesenswert?

Hallo,

ich habe folgende Problem:


ich will mit einem XMEGA-Mikrocontroller sowohl über UDP DHCP 
realisieren als auch mit UDP die Zeit über NTP holen.

Nun ist es so, dass nach DHCP-INIT und dem darauffolgenden 
Verbindungsaufbau mit der DHCP-Prozedur auf PORT 67/68 nicht mehr eine 
neue Verbindung für NTP aufgebaut werden kann auf PORT 123.

CODE:

void dhcp_init(void)
{
    uip_ipaddr_t addr;

    // initially, the IP-Address must be 0.0.0.0
    // otherwise the DHCP server would NAK the request
    uip_ipaddr(addr, 0, 0, 0, 0);
    uip_sethostaddr(addr);
    status.state = DHCP_STATE_INITIAL;
    // Destination is the broadcast address
    uip_ipaddr(addr, 255, 255, 255, 255);
    status.conn = uip_udp_new(&addr, HTONS(dhcp_SERVER_PORT));
    if (status.conn != NULL) {
        uip_udp_bind(status.conn, HTONS(dhcp_CLIENT_PORT));
    }

    PT_INIT(&status.pt);
}


hier wird also eine neue Verbindung eingerichtet um eine IP zu beziehen 
vom Server PORT67 zum Clienten Clienten PORT68


Danach kommt die NTP-INIT:

CODE:

static struct uip_udp_conn *ntp_conn = NULL;

void ntp_init(void)
{
  static uint16_t ntpIP_tmp[4];

  ntpstat.state = STATE_IDLE;

 nvm_eeprom_read_buffer(0x112, ntpIP, 4);
  memmove(&ntpIP_tmp[0], (uint8_t *)&ntpIP    , 1);
  memmove(&ntpIP_tmp[1], (uint8_t *)&ntpIP + 1, 1);
  memmove(&ntpIP_tmp[2], (uint8_t *)&ntpIP + 2, 1);
  memmove(&ntpIP_tmp[3], (uint8_t *)&ntpIP + 3, 1);

  if(ntpIP_tmp[0] == 0xFF && ntpIP_tmp[1] == 0xFF
     && ntpIP_tmp[2] == 0xFF && ntpIP_tmp[3] == 0xFF)
  {
        uip_ipaddr(ntpIP, 134,130,4,17);
      nvm_eeprom_erase_and_write_buffer(0x112, ntpIP, 4);
  }


    if(ntp_conn != NULL) {
      uip_udp_remove(ntp_conn);
    }

    ntp_conn = uip_udp_new(&ntpIP, HTONS(123));
    if(ntp_conn != NULL) {
  uip_udp_bind(ntp_conn, HTONS(123)); }
}


Danach wird bei bestehenden UDP-Verbindungen die folgende Funktion 
aufgerufen, um die UDP-Verbindungen zu dispatchen anhand der PORTS

void udp_appcall(void)
{
  if(uip_udp_conn->rport == HTONS(123)) {  // NTP protocol
    ntp_appcall();
  }

  if((uip_udp_conn->rport == HTONS(67)) || (uip_udp_conn->lport == 
HTONS(68)))
  {  // NTP protocol
    dhcp_appcall();
  }


}



Die DHCP-Prozedur kann erfolgreich eine IP beziehen und eine Verbindung 
aufbauen, aber danach kann keine NTP-Zeit mehr geholt werden mit NTP.

Ohne DHCP, also statischer IP, funktioniert die NTP-Zeitabfrage über 
UDP.


Was läuft hier falsch. Übrigens die NTP-INIT kommt direkt nach 
DHCP-Init. Ist also möglicherweise die NTP-Init fehlgeschlagen oder muss 
vorher die DHCP-Verbindung explizit beenden werden?

Oder muss wegen DHCP überhaupt eine permanente Verbindung zum Router 
bestehen.


Ich hoffe hier kennt sich jemand aus mit solchen Netzwerksachen.

von Christian (dragony)


Lesenswert?

Grundsätzlich ist UDP ein verbindungsloses Protokoll. Es werden nur 
Datagramme übermittelt. Es gibt also, im Gegnesatz zu TCP, keine 
Sessions, also keine "State-Machine". Da DHCP über UDP läuft, ist es 
hier identisch.

Wenn es bei dir nicht funktioniert, liegt es 100%ig am C-Code und, was 
auch immer du für eine Lib verwendest, du hast sie bestimmt nicht selbst 
gecoded, denn sonst wüsstest du ja schon, was da schief läuft. Fremde 
Libs haben jedoch das Problem, dass sie 1001 Szenarios abdecken wollen 
und haben deshalb meistens States, obwohl sowas bei UDP überhaupt nichts 
zu suchen hat.

Kurz: Probier eine Reinitialisierung, da sich ja deine IP geändert hat. 
Es ist zwar totaler Schwachsinn, wegen einer geänderten IP bei UDP(!) 
das "Objekt" neu zu initialisieren, aber es ist ja, wie gesagt, eine 
C-Lib. Und da habe ich schon die idiotischten Implementierungen gesehen.

Grad sowas banales wie UDP hätte man aber auch mal selbst hinrotzen 
können ;)

: Bearbeitet durch User
von Al N. (Gast)


Lesenswert?

Das Problem war an einer anderen Stelle zu finden.

Man musste in der uip-conf.h diese Stelle ändern


 * Maximum number of UDP connections
 */
#define UIP_CONF_UDP_CONNS 2


Vorher war sie aus unerfindlichen Gründen nur auf 1 gestellt.

von Bernd K. (prof7bit)


Lesenswert?

Al N. schrieb:
> Maximum number of UDP connections

Was ist eine "UDP Connection", ist das nicht ein Oxymoron? 
Hallenfreibad? Friedenspanzer? Dunkel wars, der Mond schien helle?

von Al N. (Gast)


Lesenswert?

Bernd K. schrieb:
> Al N. schrieb:
>> Maximum number of UDP connections
>
> Was ist eine "UDP Connection", ist das nicht ein Oxymoron?
> Hallenfreibad? Friedenspanzer? Dunkel wars, der Mond schien helle?

Keine Ahnung, da musste mal mit den Erfindern von uIP dich 
auseinandersetzen.

Auch wenn UDP keine richtige Connection ist, wird doch jeder 
Verbindungsaufbau in eine Struktur gespeichert und zyklisch 
abgearbeitet.

Und hier wird angegeben, wie viele solcher "Verbindungen" es maximal 
geben darf.

von Christian (dragony)


Lesenswert?

Da hatte ich also wieder mal Recht gehabt, ohne die Lib zu kennen :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.