|
66 | 66 | // All socket options should be globally distinct,
|
67 | 67 | // because we ignore option levels for efficiency.
|
68 | 68 | #define IP_ADD_MEMBERSHIP 0x400
|
| 69 | +#define IP_DROP_MEMBERSHIP 0x401 |
69 | 70 |
|
70 | 71 | // For compatibilily with older lwIP versions.
|
71 | 72 | #ifndef ip_set_option
|
@@ -1376,15 +1377,21 @@ STATIC mp_obj_t lwip_socket_setsockopt(size_t n_args, const mp_obj_t *args) {
|
1376 | 1377 | }
|
1377 | 1378 |
|
1378 | 1379 | // level: IPPROTO_IP
|
1379 |
| - case IP_ADD_MEMBERSHIP: { |
| 1380 | + case IP_ADD_MEMBERSHIP: |
| 1381 | + case IP_DROP_MEMBERSHIP: { |
1380 | 1382 | mp_buffer_info_t bufinfo;
|
1381 | 1383 | mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
|
1382 | 1384 | if (bufinfo.len != sizeof(ip_addr_t) * 2) {
|
1383 | 1385 | mp_raise_ValueError(NULL);
|
1384 | 1386 | }
|
1385 | 1387 |
|
1386 | 1388 | // POSIX setsockopt has order: group addr, if addr, lwIP has it vice-versa
|
1387 |
| - err_t err = igmp_joingroup((ip_addr_t *)bufinfo.buf + 1, bufinfo.buf); |
| 1389 | + err_t err; |
| 1390 | + if (opt == IP_ADD_MEMBERSHIP) { |
| 1391 | + err = igmp_joingroup((ip_addr_t *)bufinfo.buf + 1, bufinfo.buf); |
| 1392 | + } else { |
| 1393 | + err = igmp_leavegroup((ip_addr_t *)bufinfo.buf + 1, bufinfo.buf); |
| 1394 | + } |
1388 | 1395 | if (err != ERR_OK) {
|
1389 | 1396 | mp_raise_OSError(error_lookup_table[-err]);
|
1390 | 1397 | }
|
@@ -1769,6 +1776,7 @@ STATIC const mp_rom_map_elem_t mp_module_lwip_globals_table[] = {
|
1769 | 1776 |
|
1770 | 1777 | { MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(0) },
|
1771 | 1778 | { MP_ROM_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_ROM_INT(IP_ADD_MEMBERSHIP) },
|
| 1779 | + { MP_ROM_QSTR(MP_QSTR_IP_DROP_MEMBERSHIP), MP_ROM_INT(IP_DROP_MEMBERSHIP) }, |
1772 | 1780 | };
|
1773 | 1781 |
|
1774 | 1782 | STATIC MP_DEFINE_CONST_DICT(mp_module_lwip_globals, mp_module_lwip_globals_table);
|
|
0 commit comments