From patchwork Fri Aug 7 12:58:43 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 30931 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id 572D8B7080 for ; Fri, 7 Aug 2009 22:59:45 +1000 (EST) Received: by ozlabs.org (Postfix) id 4BE3CDDD0B; Fri, 7 Aug 2009 22:59:45 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id AC028DDD01 for ; Fri, 7 Aug 2009 22:59:44 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932514AbZHGM7k (ORCPT ); Fri, 7 Aug 2009 08:59:40 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932507AbZHGM7i (ORCPT ); Fri, 7 Aug 2009 08:59:38 -0400 Received: from ey-out-2122.google.com ([74.125.78.27]:64689 "EHLO ey-out-2122.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932494AbZHGM7e (ORCPT ); Fri, 7 Aug 2009 08:59:34 -0400 Received: by ey-out-2122.google.com with SMTP id 9so514095eyd.37 for ; Fri, 07 Aug 2009 05:59:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer:in-reply-to:references; bh=0krNzJgPd3SVUtU1wAhs80fG6I4+l61Fo1tdRPoh5oI=; b=jZw22Eq0uaqycFnIIONGuKIrM4VsdIv08TaENxAMMH96pmevUh2QO1BEMQBvmaD0M7 tyHBtIYQEi73iP9Nk8X8YlhsEEhLIgAynpLNxwdEYAoLUOvt9bWadshgubvxd/Khytzr LWThNUKcbya9hlOSXuyUjdHSRN0Wv/7fw4J2c= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=vEcUFOJsFoejI0CLkjYAuj0VQDULuVVlhQk+nekw+qMAVbm2i49F516rCQVYUBrvah 3PaR3dFt3rvrZACR+te9FoqFtqEvDdDZN1zAHCFyNVO3RMJF0yGWJBy84xY6dwD+wFCZ LV5W/VxvhnDIzcNsIhWWX+XYIl1j0D0n3l/tM= Received: by 10.210.140.16 with SMTP id n16mr1353593ebd.56.1249649975574; Fri, 07 Aug 2009 05:59:35 -0700 (PDT) Received: from localhost.localdomain (iap-pxy-mow1.siemens.ru [212.248.25.26]) by mx.google.com with ESMTPS id 7sm2797082eyg.45.2009.08.07.05.59.33 (version=SSLv3 cipher=RC4-MD5); Fri, 07 Aug 2009 05:59:34 -0700 (PDT) From: Dmitry Eremin-Solenikov To: netdev@vger.kernel.org Cc: "David S. Miller" , Sergey Lapin , linux-zigbee-devel@lists.sourceforge.net Subject: [PATCH 08/10] af_ieee802154: add support for WANT_ACK socket option Date: Fri, 7 Aug 2009 16:58:43 +0400 Message-Id: <1249649925-11996-9-git-send-email-dbaryshkov@gmail.com> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1249649925-11996-8-git-send-email-dbaryshkov@gmail.com> References: <1249649925-11996-1-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-2-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-3-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-4-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-5-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-6-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-7-git-send-email-dbaryshkov@gmail.com> <1249649925-11996-8-git-send-email-dbaryshkov@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Dmitry Eremin-Solenikov --- include/net/af_ieee802154.h | 5 +++ net/ieee802154/dgram.c | 58 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/include/net/af_ieee802154.h b/include/net/af_ieee802154.h index e9c70ea..75e64c7 100644 --- a/include/net/af_ieee802154.h +++ b/include/net/af_ieee802154.h @@ -54,4 +54,9 @@ struct sockaddr_ieee802154 { struct ieee802154_addr addr; }; +/* get/setsockopt */ +#define SOL_IEEE802154 0 + +#define WPAN_WANTACK 0 + #endif diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c index 25018a9..77ae685 100644 --- a/net/ieee802154/dgram.c +++ b/net/ieee802154/dgram.c @@ -44,6 +44,7 @@ struct dgram_sock { struct ieee802154_addr dst_addr; unsigned bound:1; + unsigned want_ack:1; }; static inline struct dgram_sock *dgram_sk(const struct sock *sk) @@ -51,7 +52,6 @@ static inline struct dgram_sock *dgram_sk(const struct sock *sk) return container_of(sk, struct dgram_sock, sk); } - static void dgram_hash(struct sock *sk) { write_lock_bh(&dgram_lock); @@ -74,6 +74,7 @@ static int dgram_init(struct sock *sk) ro->dst_addr.addr_type = IEEE802154_ADDR_LONG; ro->dst_addr.pan_id = 0xffff; + ro->want_ack = 1; memset(&ro->dst_addr.hwaddr, 0xff, sizeof(ro->dst_addr.hwaddr)); return 0; } @@ -237,7 +238,10 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk, skb_reset_network_header(skb); - mac_cb(skb)->flags = IEEE802154_FC_TYPE_DATA | MAC_CB_FLAG_ACKREQ; + mac_cb(skb)->flags = IEEE802154_FC_TYPE_DATA; + if (ro->want_ack) + mac_cb(skb)->flags |= MAC_CB_FLAG_ACKREQ; + mac_cb(skb)->seq = ieee802154_mlme_ops(dev)->get_dsn(dev); err = dev_hard_header(skb, dev, ETH_P_IEEE802154, &ro->dst_addr, ro->bound ? &ro->src_addr : NULL, size); @@ -382,13 +386,59 @@ int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb) static int dgram_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen) { - return -EOPNOTSUPP; + struct dgram_sock *ro = dgram_sk(sk); + + int val, len; + + if (level != SOL_IEEE802154) + return -EOPNOTSUPP; + + if (get_user(len, optlen)) + return -EFAULT; + + len = min_t(unsigned int, len, sizeof(int)); + + switch (optname) { + case WPAN_WANTACK: + val = ro->want_ack; + break; + default: + return -ENOPROTOOPT; + } + + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &val, len)) + return -EFAULT; + return 0; } static int dgram_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user optlen) { - return -EOPNOTSUPP; + struct dgram_sock *ro = dgram_sk(sk); + int val; + int err = 0; + + if (optlen < sizeof(int)) + return -EINVAL; + + if (get_user(val, (int __user *)optval)) + return -EFAULT; + + lock_sock(sk); + + switch (optname) { + case WPAN_WANTACK: + ro->want_ack = !!val; + break; + default: + err = -ENOPROTOOPT; + break; + } + + release_sock(sk); + return err; } struct proto ieee802154_dgram_prot = {