Hallo! TCP Verbindung ist soweit erfolgreich das ich Daten austauschen kann. Ein kleiner DHCP Client läuft auch, der läuft in UDP mit Broadcast. Was ich nun nicht hin bekomme ist ein NTP Client der ein UDP Paket an eine bekannte IP Adresse senden soll. Jetzt hoffe ich das es hier einen gibt der sich mit dem W5100 weitreichender beschäftigt hat und weiß worüber ich gestolpert bin. Folgende Situation: HTTP Server läuft auf Kanal 3 er nimmt Verbindungen an und überträgt eine 3 Zeilen HTML Datei. Das ist soweit OK. Kanal 1 möchte ich nun für eine NTP Abfrage nutzen. Dazu schreibe ich in die 4 "Socket 1 Destination IP Address" Register die IP von dem TimeServer (lokaler Router 192.178.168.100), dann noch das Port 123 und öffne anschließend das Port. Der Status von dem Port wechselt auf "UDP" was ich als erfolgreich interpretiere. Sende ich nun Daten kann ich diese nicht mit Wire Shark protokollieren. Das macht mich stutzig. Frage ich nach dem öffnen den Socketstatus ab, erscheint als DEST-IP 0.0.0.0 und das DEST-PORT ist 0. Es wurde also nicht übernommen... kann man keine Ziel IP's und Port's einstellen oder was habe ich übersehen? Freue mich über jeden Tip der mich weiter bringt. Grüße AVRli...
Konrad S. schrieb: > AVRli schrieb: >> (lokaler Router 192.178.168.100) > > Überprüf das mal. Wenn ich mit einem PC über diese Adresse die Zeit synchronisiere lasse, funktioniert es. Der lokale NTP Server ist erreichbar... Ich befürvhte das ich was grundlegendes falsch mache. :-( Man findet im Datenblatt keine weiteren Angaben wann die Zieldaten gesetzt werden können also gehe ich davon aus das es immer geht. Nur alles was ich im W5100 setze, was die Ziel IP, das Ziel Port angeht, kann ich nicht abfragen, da steht immer 0.0.0.0 und Port 0 drin. Nun dachte ich das ich im falschen Register schreibe und im anderen lese, das ist aber auch nicht der Fall. Bülent C. schrieb: > [OT] > Was hat eigentlich das "li" hinter dem AVR in Deinem Nick für eine > Bedeutung? > [/OT] Keine, ich sehe es als Verniedlichung in Bezug auf die kleinen Chips... ;-) Grüße AVRli...
Zeig doch mal deinen init-code. die source-register belegst du richtig..? Ich gehe davon aus dass diese daten auf jeden fall vor open gesetzt werden müssen.
OK ein Versuch... Das Modul hat nach dem Reset die folgenden Werte... Es wird nur die MAC vom ATmega gesetzt Network settings: ================= MODE: 0x00 Gateway: 0.0.0.0 Subnet: 0.0.0.0 Source MAC: **:**:36:**:**:f8 //* MAC ist eine echte Source IP: 0.0.0.0 Dann läuft der DHCP Client auf Socket_2 (0-3) in UDP durch... Ergebnis: Network settings: ================= MODE: 0x00 Gateway: 192.168.178.100 Subnet: 255.255.255.0 Source MAC: **:**:36:**:**:f8 //* MAC ist eine echte Source IP: 192.168.178.38 An der Stelle dann folgender Socket Status: socket2 (0x22 / 0x00) socket closed socket1 (0x00 / 0x00) socket closed Jetzt initialisiere ich ich die DEST_IP und das DEST_PORT wie folgt... spi_write(0x0500 + 0x0010, 123); spi_write16(0x0500 + 0x000C, 192); spi_write16(0x0500 + 0x000D, 168); spi_write16(0x0500 + 0x000E, 178); spi_write16(0x0500 + 0x000F, 100); Jetzt öffne ich mit dem Open Kommando und frage die Socket Einstellungen ab: Settings of socket 1: ====================================================================== Source Port: 123 Destination MAC: ff:ff:ff:ff:ff:ff Destination IP: 0.0.0.0 Destination Port: 0 socket1 (0x00 / 0x22) open UDP port... socket1 (0x22 / 0x01) ARP socket1 (0x01 / 0x22) open UDP port... Man sieht das das UDP Port zwar augegangen ist, doch die Verbindungsdaten zum Socket sind leider 0 außer das Source Port das stimmt. Hmm... Was mich nun stutzig macht ist das "ARP" was stellt man damit an? ;-) Ich sehe auch eine Anfrage mit WireShark aber es kommt keine Antwort vom Router... komisch... Grüße AVRli...
> (lokaler Router 192.178.168.100) ^^^^^^^ > Gateway: 192.168.178.100 ^^^^^^^ > Source IP: 192.168.178.38 ^^^^^^^ Der Dreher ist also gewollt, meinst du?
Sorry aber das schaut mir alles sehr chaotisch aus. Darum verstehe ich das meiste nicht was du schreibst. Was sind Kanäle? Im Zusammenhang von IP und Networking nie gehört. Du schreibst in die IP-Adressregister mit
1 | spi_write16(0x0500 + 0x000C, 192); |
Was soll das 16? Die IP-Adressregister sind aber 4 einzelne 8-Bit Register .... .... verstehe ich nicht .... ich weiss gar nicht wie man über SPI 16 Bit auf einmal schreiben kann, das Protokoll hier ist per se nur auf 8 Bit ausgelegt. Dann weiss man nicht welche Zählweise du wählst. Beim W5100 gibt es vier Sockets, mit 0 bis 3 numeriert. Sollen das deine Kanäle sein die du an anderer Stelle erwähnst? Um klar zu sehen was du machst müsstest du die Konventionen die die Sourcen so mitbringen auch einhalten, um zu sehen ob du an die richtigen Register schreibst. Und du solltest weitgehend - für dein Problem relevanten - vollständigen Sourcecode vorzeigen. So wie es jetzt (chaotisch) dargestellt ist kennt sich kein Schwein aus. Ein flüchtiger Blick in meine Sourcen lässt mich auch daran erinnern dass man ein Buffer-Managment initialisiern muss, hast du das getan? Sonst werden die Sockets nicht voneinander unabhängig arbeiten können. Mein Tip: halte dich eng an die Vorgehensweise von den Wiznet Sourcen. Wenn du nicht weisst was ARP ist dann must du noch einiges dazulernen.
Danke für Eure Antworten! Konrad S. schrieb: > Der Dreher ist also gewollt, meinst du? Nein, das war mein Fehler beim abschreiben... sorry :-( XMegaNetworker schrieb: > Sorry aber das schaut mir alles sehr chaotisch aus. > Darum verstehe ich das meiste nicht was du schreibst. Ich dachte auch es wäre leichter zu erklären, wenn es "chaotisch" wirkt, hurra dann hat das also nicht geklappt. ;-) > Was sind Kanäle? Im Zusammenhang von IP und Networking nie gehört. Ich wollte eine abgrenzende Bezeichnung für die max. 4 Ports (Sockets) des W5100 nehmen. Ich möchte gerne 2 davon später parallel verwenden. Zähle von 0-3 > Du schreibst in die IP-Adressregister mit > spi_write16(0x0500 + 0x000C, 192); > Was soll das 16? Ja das ist natürlich quatsch, Danke! > ich weiss gar nicht wie man > über SPI 16 Bit auf einmal schreiben kann, das Protokoll > hier ist per se nur auf 8 Bit ausgelegt. Es ist eine Hilfsfunktion die 2x8bit schreibt, da es einige Register gibt die 16bit sind. Port und Buffer Pointer zB. > Mein Tip: halte dich eng an die Vorgehensweise > von den Wiznet Sourcen. Gut. Habe gestern noch das "W3150A+/W5100 Errrratta Sheett" gefunden und angesehen. Es ist auch die Rede von einem ARP Fehler. :-( http://www.wiznet.co.kr/Admin_Root/UpLoad_Files/BoardFiles/3150Aplus_5100_ES_V250E.pdf Verstanden hab ich es noch nicht was sie genau meinen. > Wenn du nicht weisst was ARP ist dann must du noch einiges > dazulernen. Mit Sicherheit, darum geht's mir ja auch... ;-) Ich sehe mit WireShark das das Modul eine ARP Anfrage sendet... "Who has 192.168.178.100? Tell 192.168.178.33" Es kommt keine Antwort.und ich glaube das die ganze ARP Geschichte im Chip passiert und nur der Status auftaucht. Was ARP macht habe ich schon verstanden, wie ich es handeln muß, wenn überhaupt, noch nicht. Werde heute Abend nochmal von vorn beginnen um klare Diskussionsgrundlagen zu bekommen. "Ich möchte doch nur ein UDP Datagramm an IP X senden..." ;-) Grüße AVRli...
AVRli schrieb: > Ich möchte doch nur ein UDP Datagramm an IP X senden... Solange dein W5100 die Daten nicht behält die du in die Register schreibst brauchst du an Weiteres nicht zu denken. Natürlich muss die vollständige IP Konfiguration in den Registern stehen und auch rücklesbar sein. Mache eine saubere Initialisierung, löse alle "Aufgaben" klar auf (vermeide die quick-and-dirty Methode wo du kannst) und sei sicher dass du die Sockets bzw deren Programmierung sauber trennst. Denke auch an die Buffer-Management-Initialisierung, ohne die geht sicherlich nichts (unterschiedliche Bereiche für jeden Socket). Um ARP musst du dich auf der Seite des Controllers nicht kümmern, das macht dein Router oder dein PC. Mit Wireshark habe ich im Zusammenhang mit LAN am Controller nie gearbeitet, halte es auch für nicht nötig da die Logistik für die IP-Packete ja der W5100 korrekt übernimmt. Es irritiert sogar etwas weil zu viele Informationen daherkommen die einem von der Übersicht über die eigene Programmierstruktur abhalten können.
AVRli schrieb: > Ich wollte eine abgrenzende Bezeichnung für die max. 4 Ports (Sockets) > des W5100 nehmen. Wenn du von Ports, Kanälen und Sockets redest und damit das Gleiche meinst dann versteht man das nicht. Als Anlehnung (Lexikon) mag die Terminologie im W5100 Datenblatt dienen wenn man sonst nichts hat. Ein Port im Zusammenhang mit IP (Internet Protokoll) ist eine 16-Bit Unteradresse einer IP Adresse.
XMegaNetworker schrieb: > das Protokoll hier ist per se nur auf 8 Bit ausgelegt. Damit meinte ich dass es laut W5100-(SPI-)Protokoll gar nicht möglich ist mehr als 1 Byte pro ChiP Select Zyklus zu schreiben oder zu lesen.
AVRli schrieb: > Ich sehe mit WireShark das das Modul eine ARP Anfrage sendet... > > "Who has 192.168.178.100? Tell 192.168.178.33" > > Es kommt keine Antwort.und ich glaube das die ganze ARP Geschichte im > Chip passiert und nur der Status auftaucht. Was ARP macht habe ich schon > verstanden, wie ich es handeln muß, wenn überhaupt, noch nicht. Du muss damit nichts tun. Du kannst aber daran sehen, dass der 192.168.178.33 beabsichtigt, demnächst mit dem 192.168.178.100 zu kommunizieren. Deshalb stellt er im Subnetz die Frage nach der MAC-Adresse vom 192.168.178.100. Der 192.168.178.100 sollte ihm die Antwort geben können, wenn er im gleichen Subnetz ist.
XMegaNetworker schrieb: > Natürlich muss die vollständige IP Konfiguration in den > Registern stehen und auch rücklesbar sein. Ja das dachte ich auch, dem ist aber NICHT so. ;-) Man kann zwar die Register für die Ziel IP und Ziel Port beschreiben, übernommen werden die Werte und damit auch auslesbar aus den Registern, erst NACH einem CR_CONNECT oder CR_SEND... Da wäre ich im Leben nicht drauf gekommen! Steht so im ERRATA 2+3 zu dem Modul obwohl es da auch einen Widerspruch gibt. Im ERRATE steht der Ablauf: - Subnetmaske löschen - CR_CONNECT oder CR_SEND ausführen - Subnetmaske wieder herstellen Schaut man nun in die Sourcen von Wiznet findet man die Aktionen umgekehrt? - Subnetmaske wieder herstellen - CR_CONNECT oder CR_SEND ausfü - Subnetmaske löschen Habe mich erst mal für die Version aus der ERAATA Duko entschieden. Ob das allerdings mein "Problem" ist glaube ich derzeit nicht. Soweit ich es verstanden habe bezieht sich das Errata auf ARP Probleme wenn ein anderer Rechner dem Modul was schicken möchte, soweit bin ich noch nicht. Konrad S. schrieb: > Du muss damit nichts tun. Du kannst aber daran sehen, dass der > 192.168.178.33 beabsichtigt, demnächst mit dem 192.168.178.100 zu > kommunizieren. Deshalb stellt er im Subnetz die Frage nach der > MAC-Adresse vom 192.168.178.100. Der 192.168.178.100 sollte ihm die > Antwort geben können, wenn er im gleichen Subnetz ist. Ja und das der Knackpunkt! Der Router antwortet nicht!!! Nun habe ich mal einem PC (im gleichen Netz) das Paket geschickt, der antwortet und teilt die MAC mit, darauf hin gehen die Daten auch raus... Nun glaube ich das der Router spinnt, ich muß einen weiteren testen... Wenn der PC dem Router ein UDP Paket schickt geht das raus OHNE eine ARP Anfrage und es ist zu sehen. Kann es sein das der der PC sich ein paar MAC Adressen merkt und sich das ARP dann spart? Grüße AVRli...
AVRli schrieb: > Der Router antwortet nicht!!! Der Router ist hinsichtlich Antworten auf ARP-Anfragen nur für IPs zuständig, die "außerhalb" liegen. Die "innerhalb" liegenden Geräte können die Anfragen selbst beantworten. > Nun habe ich mal einem PC (im gleichen Netz) das Paket geschickt, der > antwortet und teilt die MAC mit, darauf hin gehen die Daten auch raus... Klar. > Nun glaube ich das der Router spinnt, ich muß einen weiteren testen... Hm! Alle 192.168.178.x liegen doch im gleichen Subnetz, oder etwa nicht? > Wenn der PC dem Router ein UDP Paket schickt geht das raus OHNE eine ARP > Anfrage und es ist zu sehen. Kann es sein das der der PC sich ein paar > MAC Adressen merkt und sich das ARP dann spart? Ja, klar. Normalerweise hat jedes IP-Gerät einen ARP-Cache. Die Einstiegs-Doku für ARP: https://tools.ietf.org/html/rfc826 (und nicht das "Updated by: 5227, 5494" ganz oben übersehen).
Hi und danke für Deine Antwort. OK die Doku werde ich mir auf jeden Fall mal durchlesen... Konrad S. schrieb: > Hm! Alle 192.168.178.x liegen doch im gleichen Subnetz, oder etwa nicht? Hmm nun frage ich mich natürlich wie ich nun an den NTP Server des Roters "ran" komme. Hmm... mit dem Modul scheint ja soweit alles OK zu sein, es sind eher Grundlagen die mich nun zu schaffen machen. Grüße, AVRli...
Sprich die Ziel-IP doch erst mal vom PC aus an. Da kannst du besser beobachten was vorgeht. Apropos beobachten ... Woher willst du wissen, dass A nicht auf die Frage von B antwortet, wenn du von C aus beobachtest? Die Anfrage von B siehst du, weil die als Broadcast rausgeht. Die Antwort von A geht aber vmtl. als Unicast an B. In einem geswitchten Netzwerk sieht C davon nichts. Evtl. bist du auf der falschen Spur.
Ja das ganze ist komplex, macht aber Spaß! Das wäre natürlich ein Ding! Also das man das nicht sieht aufgrund des Aufbaus... Der NTS-Server vom Router lässt sich ohne weiteres vom PC ansprechen, die entsprechenden Pakete sehe ich dann. Er stellt keine ARP Anfrage, das hatten wir geklärt, er hat die MAC gespeichert. Sehe ich auch wenn ich ARP -p eingebe. Nur die Pakete die vom ATMEGA kommen nicht an, keine Reaktion, auch nichts zu sehen. Schicke ich die Anfrage hingegen vom ATMEGA zum PC, sehe ich diese... erst die ARP Anfrage, der PC meldet sich zurück und dann das NTS Client Paket. Aufbau: +----------+ | SWITCH +---- TV | (FLUR) +---- PC | +---- ATMEGA +-----+----+ | | | | +-----+----+ | ROUTER | | (Keller) | +----------+ Nun könnte ich mir die MAC ja auch merken und die verwenden nur dann kann ich keine externen Time Server die via IP erreichbar sind abfragen... Grüße AVRli...
Tja, ein alter Hub wäre da ein brauchbares Hilfsmittel. Oder ein managebarer Switch mit Port-Mirror. Oder eine zweite Netzwerkkarte im PC als Bridge.
Konrad S. schrieb: > Tja, ein alter Hub wäre da ein brauchbares Hilfsmittel. Oder ein > managebarer Switch mit Port-Mirror. GS108E is all u need. ich machs immer so. den kompletten verkehr des prüflings auf nen port mirrorn, da hängt ein notebook mit wireshark als monitor dran. vereinfacht die fehlersuche immens. und der switch kost n appel und n ei.
Leute, Leute... Konrad S. schrieb: > Die Antwort von A geht aber vmtl. als Unicast an B. > In einem geswitchten Netzwerk sieht C davon nichts. Evtl. bist du auf > der falschen Spur. Evtl. ist harmlos ausgedrückt: GUT! - Du hast Recht! Erst jetzt hab ich gerafft was du meinst und was hier läuft. In der Tat ist es kein HUB, es ist ein Switch, ein 8 Port EDI ES-5800M (Vlt. macht der es schon?) Schicke ich die NTP Anfrage an die Broadcast Adresse taucht sie wieder auf, also ging das die ganze Zeit!? Ist mir nun auch klar... alles was zwischen PC und Router läuft (ARP, UDP, TCP) kann ich sehen da die beiden direkt in Kommunikation stehen. Meine anderen Pakete vom W5100 habe ich nur sehen können da der kleine HTTP Server wieder vom PC abgerufen wurde und die DHCP Aushandlung an >Broadcast< gesendet wurden. Die Pakete und Anfragen die direkt an den W5100 gehen, kommen an meinem PC überhaupt nicht an, die sind schon vorher "abgebogen". ;-) Also es wäre schon mal interessant ALLES zu sehen, mach ich das nun mit einem Router oder zweite Netzwerkkarte. Ich Danke Euch jedenfalls für Eure Hilfe! Grüße AVRli...
dunno.. schrieb: > GS108E Für den Preis ein sehr interessantes Teil! Nur der Software-Pferdefuß wieder mal. Das Ding hat wohl keine andere Konfigurationsmöglichkeit?!? :-(
Hi! Optimal wäre ein 10 Port, dann könnte ich wenn ich will, alles sehen. Wäre auch bereit etwas mehr zu investieren, 200 so wären drin. Damit könnte man dann sicher auch die gesamte Heimnetz Auslastung usw. protokollieren, das finde ich dann schon mal sehr interessant! Wenn es da eine Empfehlung gibt würde ich mich drüber freuen. Möchte kein Ramsch kaufen und dann in zwei Wochen wieder los rennen oder mit Reklamation beschäftigt sein. Ich möchte mich mit Netzwerke beschäftigen... NTP rennt im übrigen jetzt. :-D Grüße AVRli...
Zu Debug-Zwecken hab ich noch einem alten 10-MBit-Hub rumliegen. Im
Normalfall komme ich mit drei, maximal vier LAN-Ports aus. Als Reserve
liegt ein 8-Port-GBit-Switch in der Schachtel. Mittlerweile achte ich
bei den "Dauerläufern" auf den Energieverbrauch. Da ist ein managebarer
Switch dann doch eher ein verzichtbarer Luxus. Wenn es dir um das Lernen
geht, dann versuch dich mal an der Variante mit der zweiten
Netzwerkkarte. Wenn es billig sein soll, dann schau nach einem alten Hub
oder einem gebrauchten managebaren Switch.
> NTP rennt im übrigen jetzt. :-D
Jetzt wäre noch eine kurze Zusammenfassung deiner "Lösung" hilfreich für
Leser, die irgendwann über diesen Thread stolpern.
Danke für Deine Antwort. Du hattest ja geschrieben es würde auch eine zweite Karte machen wenn man sie brückt. Geht das so einfach unter Win8 oder wäre eine externe HW Lösung besser? Hast natürlich recht, 24x7 brauche ich so ein Teil sicher nicht! Zum Problem und dessen Lösung bleibt zu sagen 1. das ich die DEST-IP nicht über 1Byte sonder 2Byte eingeschrieben hatte und den Fehler nicht gesehen hatte. 2. ein auslesen der DEST-IP erst NACH einem CONNECT oder SEND im CR Register übernommen wird und damit auslesbar wurde 3. Ich nur die Hälfte mitspannen kann und somit vergeblich auf eine Antwort vom NTP Server gewartet habe, welche schon vorher an den chip ging, mein PC davon allerdings durch den Switsh nichts mitbekommen hat. Grüße AVRli...
AVRli schrieb: > Du hattest ja geschrieben es würde auch eine zweite Karte machen wenn > man sie brückt. Geht das so einfach unter Win8 Ich bin mir sicher, dass es mit Windows geht. Allerdings verwende ich Windows privat nicht (und in der Arbeit auch nur wenig und dafür bekomme ich ordentlich Schmerzensgeld ;-). > oder wäre eine externe HW > Lösung besser? Zumindest einfacher - mit einem Hub, denn da gibt es nichts, das man erst noch konfigurieren müsste.
OK danke! Abschließend noch 2 Fragen zum gleichen Thema. 1. Darf der Inhalt eines "eigenen UDP Paketes" darf sicher nicht beliebig sein, was gibt es da für Regeln? 2- Welches Buch könnt ihr mir empfehlen was die Protokollgrundlagen vermittelt. Ich besorge mir einen einfachen Switch, das gesparte Geld lege ich dann lieber in ein Buch an. Grüße AVRli...
AVRli ... schrieb: > Inhalt eines "eigenen UDP Paketes" Fang hier an: https://www.ietf.org/rfc/rfc768.txt > Welches Buch Ich habe einige Bücher z.B. von W. Richard Stevens http://www.amazon.de/s/ref=nb_sb_ss_c_0_5/276-2926375-9120068?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Dstripbooks&field-keywords=w.%20richard%20stevens&sprefix=w.+ri%2Caps%2C274 Ansonsten sind die RFCs die besten Quellen. https://www.ietf.org/ > Ich besorge mir einen einfachen Switch Mit dem kannst du als dritter, an der Kommunikation unbeteiligter, nicht zuhören. Wenn schon Switch, dann managebar mit Port-Mirror-Fähigkeit. Für die normale Heim-Vernetzung tut es natürlich auch ein einfacher Switch, falls der DSL-Router nicht genügend Ports hat. Alte Hubs sollte für kleines Geld zu finden sein, denn 10MBit-Technik will keiner mehr. Schau mal da: http://www.ebay.de/sch/i.html?_odkw=ethernet+hub+-switch+-usb&_from=R40|R40|R40&_osacat=0&_from=R40&_nkw=ethernet+hub+-switch+-usb+-poe&_sacat=0
Konrad S. schrieb: > Ansonsten sind die RFCs die besten Quellen. Ja die sind immer sehr umfangreich, ich habe mich für den NTP Client da durch gewühlt, man benötigt nur 1/3 der Informationen das ist etwas ätzend. Wiki ist wieder zu "oberflächlich". > Mit dem kannst du als dritter, an der Kommunikation unbeteiligter... Jetzt denkst Du sicher ich bin bekloppt und hab nichts kapiert... :-((( Ich meine natürlich ! HUB ! - Switch ist ja mein "Lausch-Problem". ;-) So ein HUB muß es aus den besagten Gründen billig geben... Man nennt es immer schnell im gleichen Zusammenhang, bis vor kurzem hielt ich es auch für das ein und das selbe. Ist es aber eben nicht. Grüße AVRli...
AVRli ... schrieb: > Man nennt es immer schnell im gleichen Zusammenhang, bis vor kurzem > hielt ich es auch für das ein und das selbe. Ist es aber eben nicht. Wenn du bei Ebay nach Hub suchst, dann findest du USB-Hubs und Ethernet-Switches - es geht eben nichts über "schlaue" Software. Wenn du damals nicht dabei warst, dann kennst du eben nicht den Unterschied zwischen Pike und Hellebarde. ;-)
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.