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.
  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 ;)
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.
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?
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.
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
Mit Google-Account einloggen
  Noch kein Account? Hier anmelden.