Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: robikod - 08 Ocak 2020, 09:05:27

Başlık: Ethernet LwIP kullanımı
Gönderen: robikod - 08 Ocak 2020, 09:05:27
Stm32 ile birlikte, lwip kütüphanesini kullanıyorum. Bilgisayardan ping attığım zaman, başarılı bir şekilde cevap verebiliyorum. Benim yapmak istediğim ise, STM32 ve lwip kullanarak ping atabilmek bu soruya uzun süredir cevap arıyorum yardımcı olabilecek var mı ?
*FreeRTOS kullanmıyorum
*TCP ile data göndermek istemiyorum.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: mufitsozen - 08 Ocak 2020, 10:10:29
Alıntı yapılan: robikod - 08 Ocak 2020, 09:05:27Stm32 ile birlikte, lwip kütüphanesini kullanıyorum. Bilgisayardan ping attığım zaman, başarılı bir şekilde cevap verebiliyorum. Benim yapmak istediğim ise, STM32 ve lwip kullanarak ping atabilmek bu soruya uzun süredir cevap arıyorum yardımcı olabilecek var mı ?
*FreeRTOS kullanmıyorum
*TCP ile data göndermek istemiyorum.

ST AN3966 LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 08 Ocak 2020, 11:33:05
Alıntı yapılan: mufitsozen - 08 Ocak 2020, 10:10:29ST AN3966 LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers.


O dökümanı okudum, ancak bana faydalı bir konu yok orada. TCP ile echo server uygulamaları mevcut.
Herhangi bir ping göndermeyi denedim https://github.com/goertzenator/lwip/blob/01c6f3f219e8690ad697e48d09dfb5f9b08c055f/contrib-1.4.0/apps/ping/ping.c buradaki kodları kullanarak. Burada ARP request ve ICMP request gidiyor ancak ağdaki her hangi bir cihaza ping attığımda hiçbir cihaz geri dönüş yapmıyor. Request gittiğini görebiliyorum, ancak cevap oluşmuyor
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: algorist - 08 Ocak 2020, 12:51:58
Alıntı yapılan: robikod - 08 Ocak 2020, 11:33:05O dökümanı okudum, ancak bana faydalı bir konu yok orada. TCP ile echo server uygulamaları mevcut.
Herhangi bir ping göndermeyi denedim https://github.com/goertzenator/lwip/blob/01c6f3f219e8690ad697e48d09dfb5f9b08c055f/contrib-1.4.0/apps/ping/ping.c buradaki kodları kullanarak. Burada ARP request ve ICMP request gidiyor ancak ağdaki her hangi bir cihaza ping attığımda hiçbir cihaz geri dönüş yapmıyor. Request gittiğini görebiliyorum, ancak cevap oluşmuyor
Muhtemel sebep firewallı kapatıp dene arada firewall cihazıda olabilir bilmiyorum nasıl bağlı. Ping attığında tüm paketler gönderilmiyor olabilir belkide sadece broadcast gönderiyorsun. Paket birşekilde düşüyor olabilir bununda sebepleri var.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 08 Ocak 2020, 14:39:17
Alıntı yapılan: algorist - 08 Ocak 2020, 12:51:58Muhtemel sebep firewallı kapatıp dene arada firewall cihazıda olabilir bilmiyorum nasıl bağlı. Ping attığında tüm paketler gönderilmiyor olabilir belkide sadece broadcast gönderiyorsun. Paket birşekilde düşüyor olabilir bununda sebepleri var.

point to point bağlılar, yani PC ethernet kablosuyla direk cihaza bağlı kendi aralarında network var, PC den cihaza ping atabiliyorum başarılı şekilde. Bu kodlarla ping atmayı denediğimde ping requesti gidiyor ancak reply dönmüyor.

Başka bilgisayardan kendi bilgisayarıma ping attığımda başarılı bir şekilde reply dönüyor.
*Firewall'ı kapattım sorun düzelmedi
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: brandice5 - 08 Ocak 2020, 16:39:44
PC'ye wireshark yukleyip ICMP paketinin gelip gelmedigini kontrol et.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 08 Ocak 2020, 16:52:31
Alıntı yapılan: brandice5 - 08 Ocak 2020, 16:39:44PC'ye wireshark yukleyip ICMP paketinin gelip gelmedigini kontrol et.


Onu zaten yapıyorum yoksa nasıl anlayacağım request mi reply mı olduğunu. ICMP request stm32den PC ye gidiyor. Ancak cevap dönmüyor..
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: MrDarK - 08 Ocak 2020, 20:03:56
Stm32 den gönderilen paketi buraya koyabilir misin? Birde pcnin mac adresini yaz bakalım. Bu aşamaya kadar geldiysen iş sonuçlanmış olmalı. Pcnin cvp verdiği ping paketi ile vermeyen ping paketlerini karşılaştıralım.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 09 Ocak 2020, 08:51:40
Tabi ki olur teşekkürler:

*Xtp olan STM32 nin MAC adresi.
*STM32 li cihazın IP adresi: .06 olan. Bilgisayarın ise .100 olan.

(https://i.hizliresim.com/jqk1Nm.png) (https://hizliresim.com/jqk1Nm)

Bu da giden request paketinin içeriği:

(https://i.hizliresim.com/Z5bQb0.png) (https://hizliresim.com/Z5bQb0)

Request bu şekilde sonsuza kadar cevaplanmadan akıyor.
Cevap döndüğü anda, STM tarafı bunu ya kabul etmiyor ya da kabul edemiyor. Kodlarım buradakiyle birebir aynı : https://github.com/goertzenator/lwip/blob/01c6f3f219e8690ad697e48d09dfb5f9b08c055f/contrib-1.4.0/apps/ping/ping.c

Kodlardaki şu kısımda:

static void
ping_raw_init(void)
{
  ping_pcb = raw_new(IP_PROTO_ICMP);
  LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL);

  raw_recv(ping_pcb, ping_recv, NULL);
  raw_bind(ping_pcb, IP_ADDR_ANY);
  sys_timeout(PING_DELAY, ping_timeout, ping_pcb);
}

sys_timeout kısmından biraz şüpheliyim, ama sorunu anlayamadım.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: brandice5 - 09 Ocak 2020, 12:36:55
Wireshark zaten uyariyi vermis, checksum yanlis diyor.
Senin gonderdigin 0x0000 ama wireshark in hesapladigi olmasi gereken 0xf5e5.
Kodda checksum hesaplayan kismi kontrol et.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 09 Ocak 2020, 13:36:23
Alıntı yapılan: brandice5 - 09 Ocak 2020, 12:36:55Wireshark zaten uyariyi vermis, checksum yanlis diyor.
Senin gonderdigin 0x0000 ama wireshark in hesapladigi olmasi gereken 0xf5e5.
Kodda checksum hesaplayan kismi kontrol et.

Checksum ile ilgili ilk başlangıçta init fonksiyonlarından birinde aşağıdaki gibi bir tanımlamaya gidiyor.

  heth.Init.RxMode = ETH_RXPOLLING_MODE;
  heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
  heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;


Ping_send fonksiyonu aşağıdaki kod bloğuna gidiyor. Onun dışında başka hiçbir detay bulamadım nedne yanlış hesaplıyor olabilir ?

** Prepare a echo ICMP request */
static void
ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len)
{
  size_t i;
  size_t data_len = len - sizeof(struct icmp_echo_hdr);

  ICMPH_TYPE_SET(iecho, ICMP_ECHO);
  ICMPH_CODE_SET(iecho, 0);
  iecho->chksum = 0;
//   iecho->id     = 0x8c69;
    iecho->id     = PING_ID;

  iecho->seqno  = htons(++ping_seq_num);

  /* fill the additional data buffer with some data */
  for(i = 0; i < data_len; i++) {
    ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i;
  }

  iecho->chksum = inet_chksum(iecho, len);
}


/* inet_chksum:
 *
 * Calculates the Internet checksum over a portion of memory. Used primarily for IP
 * and ICMP.
 *
 * @param dataptr start of the buffer to calculate the checksum (no alignment needed)
 * @param len length of the buffer to calculate the checksum
 * @return checksum (as u16_t) to be saved directly in the protocol header
 */

u16_t
inet_chksum(const void *dataptr, u16_t len)
{
  return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);
}
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 09 Ocak 2020, 13:47:24
Alıntı yapılan: robikod - 09 Ocak 2020, 13:36:23Checksum ile ilgili ilk başlangıçta init fonksiyonlarından birinde aşağıdaki gibi bir tanımlamaya gidiyor.

  heth.Init.RxMode = ETH_RXPOLLING_MODE;
  heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
  heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;


Ping_send fonksiyonu aşağıdaki kod bloğuna gidiyor. Onun dışında başka hiçbir detay bulamadım nedne yanlış hesaplıyor olabilir ?

** Prepare a echo ICMP request */
static void
ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len)
{
  size_t i;
  size_t data_len = len - sizeof(struct icmp_echo_hdr);

  ICMPH_TYPE_SET(iecho, ICMP_ECHO);
  ICMPH_CODE_SET(iecho, 0);
  iecho->chksum = 0;
//   iecho->id     = 0x8c69;
    iecho->id     = PING_ID;

  iecho->seqno  = htons(++ping_seq_num);

  /* fill the additional data buffer with some data */
  for(i = 0; i < data_len; i++) {
    ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i;
  }

  iecho->chksum = inet_chksum(iecho, len);
}


/* inet_chksum:
 *
 * Calculates the Internet checksum over a portion of memory. Used primarily for IP
 * and ICMP.
 *
 * @param dataptr start of the buffer to calculate the checksum (no alignment needed)
 * @param len length of the buffer to calculate the checksum
 * @return checksum (as u16_t) to be saved directly in the protocol header
 */

u16_t
inet_chksum(const void *dataptr, u16_t len)
{
  return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);
}

ETH_CHECKSUM_BY_HARDWARE kısmını ETH_CHECKSUM_BY_SOFTWARE ile değiştirdim. Checksum hatası düzeldi ancak yine cevap dönmüyor

Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: algorist - 09 Ocak 2020, 14:48:39
Check sum yanlis olsada calismasi gerekirdi.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 09 Ocak 2020, 14:59:26
Alıntı yapılan: algorist - 09 Ocak 2020, 14:48:39Check sum yanlis olsada calismasi gerekirdi.

Ethernet init ayarlarım şu şekilde
  heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
  heth.Init.RxMode = ETH_RXPOLLING_MODE;
  heth.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE;
  heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
  hal_eth_init_status = HAL_ETH_Init(&heth);
...
Sorun belki buradan kaynaklanıyorda olabilir..


Sizce sorun benim yazılımsal tarafımda mı yoksa, bilgisayar cevap mı vermiyor ? Doğru bir şekilde ping atabiliyor muyum ?

Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 09 Ocak 2020, 16:09:17
Şimdi bir nokta dikkatmi çekti, PC tarafı benim cihaza ARP gönderdikten sonra
  if (HAL_ETH_GetReceivedFrame_IT(&heth) != HAL_OK)
    return NULL;

fonksiyonu (ethernetif_input içerisinde) NULL dönmüyor.

Ancak ben  ben ping atmaya başladıktan sonra bu fonksiyon NULL dönüyor yani bilgisyar bir sebepten dolayı benim cihazıma ping gönderemiyor ya da göndermiyor.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: algorist - 09 Ocak 2020, 23:44:28
Alıntı yapılan: robikod - 09 Ocak 2020, 16:09:17Şimdi bir nokta dikkatmi çekti, PC tarafı benim cihaza ARP gönderdikten sonra
  if (HAL_ETH_GetReceivedFrame_IT(&heth) != HAL_OK)
    return NULL;

fonksiyonu (ethernetif_input içerisinde) NULL dönmüyor.

Ancak ben  ben ping atmaya başladıktan sonra bu fonksiyon NULL dönüyor yani bilgisyar bir sebepten dolayı benim cihazıma ping gönderemiyor ya da göndermiyor.
Bilgisayarın subney mask ve cihazın sabnet maskını her ihtimale karşı aynı yap. Bilgisayar tarafında olabileceğinden ping için bir port açıp denemekte yarar var. cihazı taktıktan sonra cmd den netstat -a komutu ile dinlenen portu bul.
daha sonra windows firewall with advanced security adlı pencereyi aç buradan gelen ve giden bağlantıların için kural oluşturabiliyorsun. Outbound Rules'e sağ tıklayıp new rule de, daha sonra port seç nextten sonra gelen sayfada dinleme yaptığında tespit ettiğin portu yaz, nextten sonra gelen sayfada allow seçeneğini tıkla. next next deyip isim yaz ve bitir. Pcyi yeniden başlatıp tekrar dene.

Başka bir öneri network özelliklerinden yeni bir IP ekleyebilirsin, advanced'a tıklayıp IP sekmesinden cihazın IP si ile aynı blokta olacak şekilde bir IP ve Submask ver.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: mguven2001 - 09 Ocak 2021, 21:01:11
Robikod kardeşim,
Belirttiğiniz problemin üzerinden 1 sene geçmiş. Ancak, aynı problemle ben de karşılaştım.
Çözüm ararken , açılmış bu konuyu buldum. Bu konuyu nasıl çözdüğünüzü (eğer çözmüş iseniz) bizimle de paylaşabilirmisiniz?


Tşk.
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 29 Ocak 2021, 13:48:22
Alıntı yapılan: mguven2001 - 09 Ocak 2021, 21:01:11Robikod kardeşim,
Belirttiğiniz problemin üzerinden 1 sene geçmiş. Ancak, aynı problemle ben de karşılaştım.
Çözüm ararken , açılmış bu konuyu buldum. Bu konuyu nasıl çözdüğünüzü (eğer çözmüş iseniz) bizimle de paylaşabilirmisiniz?


Tşk.

MErhaba sorunu çözmüştüm daha önceden, kodları biraz değiştirdim:
https://paste.ubuntu.com/p/hgtnhnHD32/
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 01 Şubat 2021, 09:03:07
Spesifik olarak da çözüm şu şekilde:
echo->chksum = inet_chksum(iecho, len); satırını kaldırdım çünkü benim kodlarımda checksum hardware tarafından otomatik hesaplanıyordu burada hesaplatmamdan kaynaklı bir hata gerçekleşti
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: mguven2001 - 23 Şubat 2021, 16:07:42
Alıntı yapılan: robikod - 01 Şubat 2021, 09:03:07Spesifik olarak da çözüm şu şekilde:
echo->chksum = inet_chksum(iecho, len); satırını kaldırdım çünkü benim kodlarımda checksum hardware tarafından otomatik hesaplanıyordu burada hesaplatmamdan kaynaklı bir hata gerçekleşti

Robikod kardeşim,
paylaşımın için teşekkür ederim. Eminim daha sonra kullanacak arkadaşlar için de faydalı olacaktır bu bilgi.
Wireshark'tan izlediğimde reply geldiğini görebiliyorum.
Sana bir sorum daha olacak. Reply 'dan gelen mesajın değerlendirmesini, hangi fonksiyonla yaptığını da söyleme şansın var mı?
Sonuçta gelen cevabı değerlendirmemiz gerekiyor.
Sağlıcakla kalın
Başlık: Ynt: Ethernet LwIP kullanımı
Gönderen: robikod - 08 Nisan 2021, 10:40:56
Alıntı yapılan: mguven2001 - 23 Şubat 2021, 16:07:42Robikod kardeşim,
paylaşımın için teşekkür ederim. Eminim daha sonra kullanacak arkadaşlar için de faydalı olacaktır bu bilgi.
Wireshark'tan izlediğimde reply geldiğini görebiliyorum.
Sana bir sorum daha olacak. Reply 'dan gelen mesajın değerlendirmesini, hangi fonksiyonla yaptığını da söyleme şansın var mı?
Sonuçta gelen cevabı değerlendirmemiz gerekiyor.
Sağlıcakla kalın
Ne demek rica ederim.
Lwip kütüphanesini kullanıyorsanız, ethernetif_input fonksiyonunu bir loop içerisinde çalıştırıyorsunuzdur, bu fonksiyonda doğrudan low_level_input fonksiyonuna gidiyor. Bu fonksiyonun içerisinde veya bu fonksiyondan çıktıktan sonra mesajın değerlendirmesini özel olarak yapabilirsiniz. Geldiği IP adresini vs data payload'ı içinden çekebilirsiniz.