Dear LWIP users and team,
I am trying to send and receive IGMP multicast messages using RAW API's , I
can only send but can not receive back the messages by a board running the
same code (without sending packets).On wireshark I can  see the "IGMP
Membership report Group " packets for both devices  and I can also see the
UDP messages I send periodically to the multicast IP, but on receiver board
having the same code that I also share below I can not receive back the
Multicast messages and the udp_recv set callback function is never called.
also i tried to put a breakpoint in ip4_input inside the if condition of
the  multicast packets but the breakpoint is never getting fired.
  if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
              // ...
  }
so this may do means that the sent UDP message have something wrong despite
that I can see the packet on wireshark ?
I have netif->flags|= NETIF_FLAG_IGMP; and i am sure igmp_start() is called.
to summarize the problem I do have I can join IGMP group and send UDP
messages to the multicast IP as on wireshark but I can not receive that
message on another board running the same code.

code:
#define MULTICAST_PORT 9533
static char multicast_ip[] = "238.0.0.8";

static char dummyData[] = "Hello from board";
#define UDP_APP_INTERVAL 5000
static struct udp_pcb *multiAppPcb;
static ip_addr_t multicastIp;
static uint32_t multiAppTime = 0 ;
// prototypes
void multicast_init(void);
int multicast_send_data(const char* buff,uint16_t len );.
static void multicast_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
                 const ip_addr_t *addr, u16_t port);

void main( void ){
 // .. initializations
  LWIP_Init();
  multicast_init();
  while(1)
  {
       MX_LWIP_Process(hal_time);
       // only on sender board..
if(time - multiAppTime > UDP_APP_INTERVAL)
{
multiAppTime = time ;
uint16_t totLen = strlen(dummyData);
multicast_send_data(dummyData,totLen);
}
  }

void
multicast_init(void)
{
      multicastIp.addr = ipaddr_addr(multicast_ip);
multiAppPcb = udp_new_ip_type(IPADDR_TYPE_ANY);
if (multiAppPcb != NULL) {

    err_t err;

    err = udp_bind(multiAppPcb, IP_ADDR_ANY, MULTICAST_PORT);
    if (err == ERR_OK) {
#if LWIP_IGMP
err_t iret =
igmp_joingroup(IP_ADDR_ANY,(const struct ip4_addr *)(&multicastIp));
if(iret){
initErr = 1 ;
return ;
}
#endif // LWIP_IGMP
udp_set_multicast_netif_addr(multiAppPcb,(const struct ip4_addr
*)(&multicastIp));
udp_set_multicast_ttl(multiAppPcb,5);

udp_recv(multiAppPcb, multicast_recv, multiAppPcb);

    } else {
      /* abort? output diagnostic? */
initErr = 1;
    }
  } else {
    /* abort? output diagnostic? */
initErr = 1;
  }
}
int multicast_send_data(const char* buff,uint16_t len )
{
err_t err;
  if (initErr == 1)
return 1 ;
struct pbuf *p = pbuf_alloc(PBUF_RAW,len,PBUF_RAM);
int ret  = 0 ;
if(p == NULL)
return 1 ;
if(pbuf_take(p,buff,len) != ERR_OK)
{
ret = 1 ;
goto udp_app_send_end;
}
err = udp_sendto(multiAppPcb, p, &multicastIp, MULTICAST_PORT) ;
if(err != ERR_OK)
ret = 1 ;
udp_app_send_end:
pbuf_free(p);
return ret ;
}
static void
multicast_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
                 const ip_addr_t *addr, u16_t port)
{
  LWIP_UNUSED_ARG(arg);
  if (p != NULL) {
    /* send received packet back to sender */
//udp_sendto(upcb, p, addr, port);
  char* recv_buff = (char*) mem_malloc(p->tot_len);
  if(recv_buff){
  extract_payload(p,recv_buff);
  multicast_recv_callback(recv_buff,p->tot_len);
  }else{

  multicast_recv_callback(NULL,p->tot_len);
  }

    /* free the pbuf */
    pbuf_free(p);
  }
}
void  extract_payload(struct pbuf *p,char *payload)
{
struct pbuf *q = p ;
while(q)
{
for(int i = 0  ; i < q->len ; i++ )
{
payload[i] =((char*)(q->payload))[i];
}
q = p->next;
}
}
void multicast_recv_callback(char* buff, int len )
{
if(buff != NULL){


}else{
// invalid
}


}

-----------------------------------------------------------------------------------------------------------
Best Regards,
Amr Elsayed.
RA @ E-JUST <http://ejust.edu.eg/>.
Founder & Engineer @ DIY-Life <http://www.the-diy-life.co/>.
eng.amralsa...@gmail.com
+201223240852.



[image: Mailtrack]
<https://mailtrack.io?utm_source=gmail&utm_medium=signature&utm_campaign=signaturevirality5&;>
Sender
notified by
Mailtrack
<https://mailtrack.io?utm_source=gmail&utm_medium=signature&utm_campaign=signaturevirality5&;>
07/11/18,
1:58:47 AM
_______________________________________________
lwip-users mailing list
lwip-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to