Patchwork [V3,2/3] linux-user: make do_setsockopt support SOL_RAW ICMP_FILTER socket option

login
register
mail settings
Submitter Jing Huang
Date July 21, 2012, 1:29 a.m.
Message ID <1342834195-2670-1-git-send-email-jing.huang.pku@gmail.com>
Download mbox | patch
Permalink /patch/172316/
State New
Headers show

Comments

Peter Maydell - July 20, 2012, 6:07 p.m.
On 21 July 2012 02:29, Jing Huang <jing.huang.pku@gmail.com> wrote:
>
> Signed-off-by: Jing Huang <jing.huang.pku@gmail.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

(when you do the next version of this patch series, if you
include that line in the commit message for this patch it
will let me know I've already looked at this patch and don't
need to read it again. You can keep the line as long as you
don't make any further changes to the patch which would mean
I have to re-review it.)

-- PMM
Jing Huang - July 21, 2012, 1:29 a.m.
Signed-off-by: Jing Huang <jing.huang.pku@gmail.com>
---
 linux-user/syscall.c |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 82aa83d..2228b1f 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,24 @@  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 */
+            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,
+                                                &val, sizeof(val)));
+            break;
+        default:
+            goto unimplemented;
+        }
+        break;
     case TARGET_SOL_SOCKET:
         switch (optname) {
             /* Options with 'int' argument.  */