@@ -167,6 +167,26 @@ class UdpContext
167
167
168
168
#endif // !LWIP_IPV6
169
169
170
+ /*
171
+ * Add a netif (by its index) as the multicast interface
172
+ */
173
+ void setMulticastInterface (netif* p_pNetIf)
174
+ {
175
+ #if LWIP_VERSION_MAJOR == 1
176
+ udp_set_multicast_netif_addr (_pcb, (p_pNetIf ? p_pNetIf->ip_addr : ip_addr_any));
177
+ #else
178
+ udp_set_multicast_netif_index (_pcb, (p_pNetIf ? netif_get_index (p_pNetIf) : NETIF_NO_INDEX));
179
+ #endif
180
+ }
181
+
182
+ /*
183
+ * Allow access to pcb to change eg. options
184
+ */
185
+ udp_pcb* pcb (void )
186
+ {
187
+ return _pcb;
188
+ }
189
+
170
190
void setMulticastTTL (int ttl)
171
191
{
172
192
#ifdef LWIP_MAYBE_XCC
@@ -205,6 +225,11 @@ class UdpContext
205
225
return (pos <= _rx_buf->tot_len );
206
226
}
207
227
228
+ netif* getInputNetif () const
229
+ {
230
+ return _currentAddr.input_netif ;
231
+ }
232
+
208
233
CONST IPAddress& getRemoteAddress () CONST
209
234
{
210
235
return _currentAddr.srcaddr ;
@@ -269,7 +294,6 @@ class UdpContext
269
294
// ref'ing it to prevent release from the below pbuf_free(deleteme)
270
295
pbuf_ref (_rx_buf);
271
296
}
272
- // remove the already-consumed head of the chain
273
297
pbuf_free (deleteme);
274
298
275
299
_rx_buf_offset = 0 ;
@@ -464,11 +488,12 @@ class UdpContext
464
488
return ;
465
489
}
466
490
}
467
-
468
491
#if LWIP_VERSION_MAJOR == 1
469
492
#define TEMPDSTADDR (¤t_iphdr_dest)
493
+ #define TEMPINPUTNETIF (current_netif)
470
494
#else
471
495
#define TEMPDSTADDR (ip_current_dest_addr())
496
+ #define TEMPINPUTNETIF (ip_current_input_netif())
472
497
#endif
473
498
474
499
// chain this helper pbuf first
@@ -496,7 +521,7 @@ class UdpContext
496
521
return ;
497
522
}
498
523
// construct in place
499
- new (PBUF_ALIGNER (pb_helper->payload )) AddrHelper (srcaddr, TEMPDSTADDR, srcport);
524
+ new (PBUF_ALIGNER (pb_helper->payload )) AddrHelper (srcaddr, TEMPDSTADDR, srcport, TEMPINPUTNETIF );
500
525
pb_helper->flags = PBUF_HELPER_FLAG; // mark helper pbuf
501
526
// chain it
502
527
pbuf_cat (_rx_buf, pb_helper);
@@ -510,6 +535,7 @@ class UdpContext
510
535
_currentAddr.srcaddr = srcaddr;
511
536
_currentAddr.dstaddr = TEMPDSTADDR;
512
537
_currentAddr.srcport = srcport;
538
+ _currentAddr.input_netif = TEMPINPUTNETIF;
513
539
514
540
DEBUGV (" :urn %d\r\n " , pb->tot_len );
515
541
_first_buf_taken = false ;
@@ -522,6 +548,7 @@ class UdpContext
522
548
}
523
549
524
550
#undef TEMPDSTADDR
551
+ #undef TEMPINPUTNETIF
525
552
526
553
}
527
554
@@ -633,10 +660,11 @@ class UdpContext
633
660
{
634
661
IPAddress srcaddr, dstaddr;
635
662
int16_t srcport;
663
+ netif* input_netif;
636
664
637
665
AddrHelper () { }
638
- AddrHelper (const ip_addr_t * src, const ip_addr_t * dst, uint16_t srcport):
639
- srcaddr (src), dstaddr(dst), srcport(srcport) { }
666
+ AddrHelper (const ip_addr_t * src, const ip_addr_t * dst, uint16_t srcport, netif* input_netif ):
667
+ srcaddr (src), dstaddr(dst), srcport(srcport), input_netif(input_netif) { }
640
668
};
641
669
AddrHelper _currentAddr;
642
670
0 commit comments