On Mon, Jul 16, 2012 at 11:23 AM, Dunrong Huang <riegama...@gmail.com> wrote: > 2012/7/16 Jing Huang <jing.huang....@gmail.com>: >> This patch makes do_setsockopt() support SOL_RAW ICMP_FILTER socket option. >> >> Signed-off-by: Jing Huang <jing.huang....@gmail.com> >> --- >> linux-user/syscall.c | 20 ++++++++++++++++++++ >> 1 files changed, 20 insertions(+), 0 deletions(-) >> >> diff --git a/linux-user/syscall.c b/linux-user/syscall.c >> index 28c8ba5..fc8690d 100644 >> --- a/linux-user/syscall.c >> +++ b/linux-user/syscall.c >> @@ -60,6 +60,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base, >> #include <netinet/ip.h> >> #include <netinet/tcp.h> >> #include <linux/wireless.h> >> +#include <linux/icmp.h> >> #include "qemu-common.h" >> #ifdef TARGET_GPROF >> #include <sys/gmon.h> >> @@ -1442,6 +1443,25 @@ static abi_long do_setsockopt(int sockfd, int level, >> int optname, >> goto unimplemented; >> } >> break; >> + case SOL_RAW: >> + switch (optname) { >> + case ICMP_FILTER: >> + /*struct icmp_filter takes an u32 value*/ >> + optname = ICMP_FILTER; > Needless assignment statements. optname already has the value ICMP_FILTER
do_setsockopt() lacks level=SOL_RAW and optname=ICMP_FILTER. The ping in linux-user guest invokes: setsockopt(icmp_sock, SOL_RAW, ICMP_FILTER, (char *)&filt, sizeof(filt)) in main() function. >> + if (optlen < sizeof(uint32_t)) { >> + return -TARGET_EINVAL; >> + } >> + >> + if (get_user_u32(val, optval_addr)) { >> + return -TARGET_EFAULT; >> + } >> + ret = get_errno(setsockopt(sockfd, level, optname, >> + (char *)&val, sizeof(val))); > Dont need casting &val to char *. I refer to the definition of setsockopt() in linux-kernel/net/tipc/socket.c >> + break; >> + default: >> + goto unimplemented; >> + } >> + break; >> case TARGET_SOL_SOCKET: >> switch (optname) { >> /* Options with 'int' argument. */ >> -- >> 1.7.8.6 >> >> > > > > -- > Best Regards, > > Dunrong Huang