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


von leo (Gast)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?

Einen hab ich noch:

Flags richtig?

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

Gruß Martin

von leo (Gast)


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)


Lesenswert?

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

von Matthias (Gast)


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)


Lesenswert?

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

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.