Forum: Mikrocontroller und Digitale Elektronik Lwip STM32: ARP request wird nicht gesendet


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auf einem STM32 läuft der Lwip Stack im Standalone Betrieb. Soweit 
funktioniert alles prima. Was mir aufgefallen ist, dass kein ARP request 
beim Power On gesendet wird. Was könnte getan werden, damit der 
Mikrocontroller beim Power On eine ARP request sendet?

Danke im Voraus.

von holger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Was könnte getan werden, damit der
>Mikrocontroller beim Power On eine ARP request sendet?

Wenn du eine feste IP benutzt ist das nicht notwendig.

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich benutzt auf meinem Device eine feste IP-Adresse. Müsste trotzdem 
nicht beim Power On ein ARP request gesendet werden? Wie wird auf dem 
LWIP Stack ein ARP request ausgelöst?

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Was könnte getan werden, damit der Mikrocontroller beim Power On eine ARP
> request sendet?

Wohin soll er den denn schicken? Mit einem ARP-Request fragst du einen 
anderen Teilmehmer, wie die MAC-Adresse zu seiner IP ist, damit du ihm 
was senden kannst. Solange du niemandem was sendest, gibt's auch 
niemanden, von dem du die MAC-Adresse erfahren müßtest.

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok, ich möchte ein UDP Packet mit einer IP-Adresse an einen Teilnehmer 
senden. Da müsste doch mit oder ohne DHCP ein ARP request gesendet 
werden.

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit der Funktion etharp_request wird ein ARP request gesendet.
1
err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr);

von ♪Geist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Ok, ich möchte ein UDP Packet mit einer IP-Adresse an einen Teilnehmer
> senden. Da müsste doch mit oder ohne DHCP ein ARP request gesendet
> werden.

Nö, der Sender erwartet, dass es bei dem Empfänger ankommt. Für die 
IP/MAC Auflösung ist dann dein Router zuständig.

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Ok, ich möchte ein UDP Packet mit einer IP-Adresse an einen Teilnehmer
> senden. Da müsste doch mit oder ohne DHCP ein ARP request gesendet
> werden.

Ja. Das hat dann aber nicht mit dem Power-On zu tun, sondern mit dem 
Senden des Pakets. Kommt da denn auch kein ARP-Request?

♪Geist schrieb:
> leo schrieb:
>> Ok, ich möchte ein UDP Packet mit einer IP-Adresse an einen Teilnehmer
>> senden. Da müsste doch mit oder ohne DHCP ein ARP request gesendet
>> werden.
>
> Nö, der Sender erwartet, dass es bei dem Empfänger ankommt.

Und wohin sendet er das Paket, wenn er die MAC-Adresse des Empfängers 
nicht kennt?

> Für die IP/MAC Auflösung ist dann dein Router zuständig.

Aber nur wenn das Ziel in einem anderen Subnetz liegt. Und selbst dann 
braucht der Sender die MAC-Adresse des Routers.

von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Um ARP sollte sich LwIP selbst kümmern. Wenn ein Paket an einen 
Empfänger geschickt werden soll, braucht der Stack die MAC Adresse. 
Sonst kann er den Ethernet Header nicht ausfüllen. Also wird im ARP 
Cache nachgesehen ob sie schon drinsteht. Falls nicht, geht ein Request 
raus.

Ist das LWIP_ARP Makro lwipopts.h vielleicht 0 und ARP damit gar nicht 
drin?

von Karl K. (leluno)


Bewertung
0 lesenswert
nicht lesenswert
1
//----------------------------------------------------------------------------
2
//Senden der aktuellen Daten zu einen UDP Server
3
#define MAX_VAR_ARRAY 10
4
void xudp_send (uint8_t UDP_IP4_SEND){
5
uint32_t UDP_IP_SEND=(MYIP_1<<24|MYIP_2<<16|MYIP_3<<8|UDP_IP4_SEND);
6
#if (UDP_SENDE_PORT!=0)
7
  uint16_t byte_count,var=0;
8
  uint8_t var_array[MAX_VAR_ARRAY]={'k','k','t','e','s','t'};
9
10
11
//oeffnet eine Verbindung zu einem UDP Server
12
  //ARP Request senden
13
var=  arp_request(124);
14
15
//wenn erfolgreich udp-paket senden
16
if (var == 1)
17
  {
18
    for (byte_count = 0;byte_count<(MAX_VAR_ARRAY);byte_count=byte_count+1)
19
    {
20
      eth_buffer[UDP_DATA_START + byte_count]   = (unsigned char)var_array[var];
21
 //     eth_buffer[UDP_DATA_START + byte_count+1] = (unsigned char)((var_array[var]) >> 8);
22
      var++;
23
    }
24
    create_new_udp_packet(byte_count,UDP_EMPFANGS_PORT,UDP_SENDE_PORT,ip_aus_ip4_x(124));
25
    UDP_DEBUG("** UDP Daten gesendet! **\r\n");
26
    return;
27
  }
28
  UDP_DEBUG("Kein UDP Server gefunden!!\r\n");
29
#endif
30
  return;
31
}

Mit diesem code funktioniert das UDP-senden bei U.Radig. Das müsste bei 
anderen Webservern genauso ablaufen:

Über arprequest die Dest-MAC feststellen und das UDP-Paket genau dahin 
schicken.

von Martin K. (martinko)


Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:
> Ok, ich möchte ein UDP Packet mit einer IP-Adresse an einen Teilnehmer
> senden. Da müsste doch mit oder ohne DHCP ein ARP request gesendet
> werden.

Welche lwip Version?
Ist LWIP_ARP auf 1 definiert?
netif->output = etharp_output gesetzt?

lwip sendet einen gratuitous ARP wenn der linkauf UP gesetzt wird.
Danach immer dann, wenn im eigenen ARP Cache die MAC Adresse des 
Empfängers nicht mehr zu finden ist.

Gruß Martin

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
LWIP_ARP ist auf 1

opt.h Datei:
1
 * LWIP_ARP==1: Enable ARP functionality.
2
 */
3
#ifndef LWIP_ARP
4
#define LWIP_ARP                        1
5
#endif

netif->output = etharp_output ist gesetzt, siehe folgende Funktion:
1
err_t ethernetif_init(struct netif *netif)
2
{
3
  LWIP_ASSERT("netif != NULL", (netif != NULL));
4
5
#if LWIP_NETIF_HOSTNAME
6
  /* Initialize interface hostname */
7
  netif->hostname = "lwip";
8
#endif /* LWIP_NETIF_HOSTNAME */
9
10
  netif->name[0] = IFNAME0;
11
  netif->name[1] = IFNAME1;
12
13
  netif->output = etharp_output;
14
  netif->linkoutput = low_level_output;
15
16
  /* initialize the hardware */
17
  low_level_init(netif);
18
  
19
  etharp_init();
20
  sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
21
22
  return ERR_OK;
23
}

von Martin K. (martinko)


Bewertung
0 lesenswert
nicht lesenswert
Einen hab ich noch:

Flags richtig?

netif->flags |= NETIF_FLAG_ETHERNET | NETIF_FLAG_BROADCAST | 
NETIF_FLAG_ETHARP;

Gruß Martin

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Standalone application

Datei ethernetif.c
1
  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;

Datei netif.c
1
#define NETIF_FLAG_UP           0x01U
2
/** if set, the netif has broadcast capability */
3
#define NETIF_FLAG_BROADCAST    0x02U
4
/** if set, the netif is one end of a point-to-point connection */
5
#define NETIF_FLAG_POINTTOPOINT 0x04U
6
/** if set, the interface is configured using DHCP */
7
#define NETIF_FLAG_DHCP         0x08U
8
/** if set, the interface has an active link
9
 *  (set by the network interface driver) */
10
#define NETIF_FLAG_LINK_UP      0x10U
11
/** if set, the netif is an device using ARP */
12
#define NETIF_FLAG_ETHARP       0x20U
13
/** if set, the netif has IGMP capability */
14
#define NETIF_FLAG_IGMP         0x40U

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das Flag NETIF_FLAG_ETHERNET habe ich im Quellcode des Lwip-Stacks nicht 
gefunden. Lwip-Stack Version: 1.3.2

von Matthias (Gast)


Bewertung
0 lesenswert
nicht lesenswert
♪Geist schrieb:
> Nö, der Sender erwartet, dass es bei dem Empfänger ankommt. Für die
> IP/MAC Auflösung ist dann dein Router zuständig.

Autsch..

von leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es müsste doch reichen, dass das Flag
1
NETIF_FLAG_ETHARP 0x20U
 bereits gesetzt wurde.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.