mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-05-18 14:16:55 +08:00
Added UDP lite support for sockets
This commit is contained in:
@@ -610,7 +610,8 @@ lwip_socket(int domain, int type, int protocol)
|
||||
domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
|
||||
break;
|
||||
case SOCK_DGRAM:
|
||||
conn = netconn_new_with_callback(NETCONN_UDP, event_callback);
|
||||
conn = netconn_new_with_callback( (protocol == IPPROTO_UDPLITE) ?
|
||||
NETCONN_UDPLITE : NETCONN_UDP, event_callback);
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ",
|
||||
domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
|
||||
break;
|
||||
@@ -1057,6 +1058,7 @@ int lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optl
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
|
||||
#if LWIP_TCP
|
||||
/* Level: IPPROTO_TCP */
|
||||
case IPPROTO_TCP:
|
||||
if (*optlen < sizeof(int)) {
|
||||
@@ -1082,9 +1084,33 @@ int lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optl
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
|
||||
s, optname));
|
||||
err = ENOPROTOOPT;
|
||||
} /* switch (optname */
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_TCP */
|
||||
#if LWIP_UDP && LWIP_UDPLITE
|
||||
/* Level: IPPROTO_UDPLITE */
|
||||
case IPPROTO_UDPLITE:
|
||||
if (*optlen < sizeof(int)) {
|
||||
err = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If this is no UDP lite socket, ignore any options. */
|
||||
if (sock->conn->type != NETCONN_UDPLITE)
|
||||
return 0;
|
||||
|
||||
switch (optname) {
|
||||
case UDPLITE_SEND_CSCOV:
|
||||
case UDPLITE_RECV_CSCOV:
|
||||
break;
|
||||
|
||||
default:
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
|
||||
s, optname));
|
||||
err = ENOPROTOOPT;
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_UDP && LWIP_UDPLITE*/
|
||||
/* UNDEFINED LEVEL */
|
||||
default:
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
|
||||
@@ -1208,6 +1234,7 @@ static void lwip_getsockopt_internal(void *arg)
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
|
||||
#if LWIP_TCP
|
||||
/* Level: IPPROTO_TCP */
|
||||
case IPPROTO_TCP:
|
||||
switch (optname) {
|
||||
@@ -1242,6 +1269,24 @@ static void lwip_getsockopt_internal(void *arg)
|
||||
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_TCP */
|
||||
#if LWIP_UDP && LWIP_UDPLITE
|
||||
/* Level: IPPROTO_UDPLITE */
|
||||
case IPPROTO_UDPLITE:
|
||||
switch (optname) {
|
||||
case UDPLITE_SEND_CSCOV:
|
||||
*(int*)optval = sock->conn->pcb.udp->chksum_len_tx;
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n",
|
||||
s, (*(int*)optval)) );
|
||||
break;
|
||||
case UDPLITE_RECV_CSCOV:
|
||||
*(int*)optval = sock->conn->pcb.udp->chksum_len_rx;
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n",
|
||||
s, (*(int*)optval)) );
|
||||
break;
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_UDP */
|
||||
} /* switch (level) */
|
||||
sys_mbox_post(sock->conn->mbox, NULL);
|
||||
}
|
||||
@@ -1332,6 +1377,7 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
|
||||
#if LWIP_TCP
|
||||
/* Level: IPPROTO_TCP */
|
||||
case IPPROTO_TCP:
|
||||
if (optlen < sizeof(int)) {
|
||||
@@ -1359,7 +1405,31 @@ int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t
|
||||
err = ENOPROTOOPT;
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_TCP */
|
||||
#if LWIP_UDP && LWIP_UDPLITE
|
||||
/* Level: IPPROTO_UDPLITE */
|
||||
case IPPROTO_UDPLITE:
|
||||
if (optlen < sizeof(int)) {
|
||||
err = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If this is no UDP lite socket, ignore any options. */
|
||||
if (sock->conn->type != NETCONN_UDPLITE)
|
||||
return 0;
|
||||
|
||||
switch (optname) {
|
||||
case UDPLITE_SEND_CSCOV:
|
||||
case UDPLITE_RECV_CSCOV:
|
||||
break;
|
||||
|
||||
default:
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
|
||||
s, optname));
|
||||
err = ENOPROTOOPT;
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_UDP && LWIP_UDPLITE */
|
||||
/* UNDEFINED LEVEL */
|
||||
default:
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
|
||||
@@ -1481,6 +1551,7 @@ static void lwip_setsockopt_internal(void *arg)
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
|
||||
#if LWIP_TCP
|
||||
/* Level: IPPROTO_TCP */
|
||||
case IPPROTO_TCP:
|
||||
switch (optname) {
|
||||
@@ -1519,6 +1590,34 @@ static void lwip_setsockopt_internal(void *arg)
|
||||
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_TCP*/
|
||||
#if LWIP_UDP && LWIP_UDPLITE
|
||||
/* Level: IPPROTO_UDPLITE */
|
||||
case IPPROTO_UDPLITE:
|
||||
switch (optname) {
|
||||
case UDPLITE_SEND_CSCOV:
|
||||
if ((*(int*)optval != 0) && (*(int*)optval < 8)) {
|
||||
/* don't allow illegal values! */
|
||||
sock->conn->pcb.udp->chksum_len_tx = 8;
|
||||
} else {
|
||||
sock->conn->pcb.udp->chksum_len_tx = *(int*)optval;
|
||||
}
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %lu\n",
|
||||
s, (*(int*)optval)) );
|
||||
break;
|
||||
case UDPLITE_RECV_CSCOV:
|
||||
if ((*(int*)optval != 0) && (*(int*)optval < 8)) {
|
||||
/* don't allow illegal values! */
|
||||
sock->conn->pcb.udp->chksum_len_rx = 8;
|
||||
} else {
|
||||
sock->conn->pcb.udp->chksum_len_rx = *(int*)optval;
|
||||
}
|
||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %lu\n",
|
||||
s, (*(int*)optval)) );
|
||||
break;
|
||||
} /* switch (optname) */
|
||||
break;
|
||||
#endif /* LWIP_UDP */
|
||||
} /* switch (level) */
|
||||
sys_mbox_post(sock->conn->mbox, NULL);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user