This patch lets dgram_sendmsg determine the destination address based on if the socket has been connect()ed before. If so, the address passed to connect() is used. Otherwise, the address passed to sendto() is used as destination.
Signed-off-by: Wolf-Bastian Pöttner <poett...@ibr.cs.tu-bs.de> --- net/ieee802154/dgram.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c index 94df6b1..955c30b 100644 --- a/net/ieee802154/dgram.c +++ b/net/ieee802154/dgram.c @@ -46,6 +46,7 @@ struct dgram_sock { unsigned int bound:1; unsigned int want_ack:1; + unsigned int connected:1; }; static inline struct dgram_sock *dgram_sk(const struct sock *sk) @@ -76,6 +77,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; + ro->connected = 0; memset(&ro->dst_addr.hwaddr, 0xff, sizeof(ro->dst_addr.hwaddr)); return 0; } @@ -181,6 +183,8 @@ static int dgram_connect(struct sock *sk, struct sockaddr *uaddr, goto out; } + ro->connected = 1; + memcpy(&ro->dst_addr, &addr->addr, sizeof(struct ieee802154_addr)); out: @@ -197,6 +201,8 @@ static int dgram_disconnect(struct sock *sk, int flags) ro->dst_addr.addr_type = IEEE802154_ADDR_LONG; memset(&ro->dst_addr.hwaddr, 0xff, sizeof(ro->dst_addr.hwaddr)); + ro->connected = 0; + release_sock(sk); return 0; @@ -211,6 +217,9 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk, struct dgram_sock *ro = dgram_sk(sk); int hlen, tlen; int err; + struct sockaddr_ieee802154 *saddr; + + saddr = (struct sockaddr_ieee802154 *)msg->msg_name; if (msg->msg_flags & MSG_OOB) { pr_debug("msg->msg_flags = 0x%x\n", msg->msg_flags); @@ -253,7 +262,7 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk, 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, + err = dev_hard_header(skb, dev, ETH_P_IEEE802154, ro->connected ? &ro->dst_addr : &saddr->addr, ro->bound ? &ro->src_addr : NULL, size); if (err < 0) goto out_skb; -- 1.7.5.4 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_mar _______________________________________________ Linux-zigbee-devel mailing list Linux-zigbee-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel