Skip to content

Commit 1cc76e3

Browse files
Phoebe Buckheisterdavem330
authored andcommitted
ieee802154: fix dgram socket sendmsg()
802.15.4 datagram sockets do not currently have a compliant sendmsg(). The destination address supplied is always ignored, and in unconnected mode, packets are broadcast instead of dropped with -EDESTADDRREQ. This patch fixes 802.15.4 dgram sockets to be compliant, i.e. !conn && !msg_name => -EDESTADDRREQ !conn && msg_name => send to msg_name conn && !msg_name => send to connected conn && msg_name => -EISCONN Signed-off-by: Phoebe Buckheister <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d4b2816 commit 1cc76e3

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

net/ieee802154/dgram.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct dgram_sock {
4545
struct ieee802154_addr dst_addr;
4646

4747
unsigned int bound:1;
48+
unsigned int connected:1;
4849
unsigned int want_ack:1;
4950
};
5051

@@ -73,10 +74,7 @@ static int dgram_init(struct sock *sk)
7374
{
7475
struct dgram_sock *ro = dgram_sk(sk);
7576

76-
ro->dst_addr.mode = IEEE802154_ADDR_LONG;
77-
ro->dst_addr.pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST);
7877
ro->want_ack = 1;
79-
memset(&ro->dst_addr.extended_addr, 0xff, IEEE802154_ADDR_LEN);
8078
return 0;
8179
}
8280

@@ -183,6 +181,7 @@ static int dgram_connect(struct sock *sk, struct sockaddr *uaddr,
183181
}
184182

185183
ieee802154_addr_from_sa(&ro->dst_addr, &addr->addr);
184+
ro->connected = 1;
186185

187186
out:
188187
release_sock(sk);
@@ -194,10 +193,7 @@ static int dgram_disconnect(struct sock *sk, int flags)
194193
struct dgram_sock *ro = dgram_sk(sk);
195194

196195
lock_sock(sk);
197-
198-
ro->dst_addr.mode = IEEE802154_ADDR_LONG;
199-
memset(&ro->dst_addr.extended_addr, 0xff, IEEE802154_ADDR_LEN);
200-
196+
ro->connected = 0;
201197
release_sock(sk);
202198

203199
return 0;
@@ -211,6 +207,7 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk,
211207
struct sk_buff *skb;
212208
struct ieee802154_mac_cb *cb;
213209
struct dgram_sock *ro = dgram_sk(sk);
210+
struct ieee802154_addr dst_addr;
214211
int hlen, tlen;
215212
int err;
216213

@@ -219,6 +216,11 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk,
219216
return -EOPNOTSUPP;
220217
}
221218

219+
if (!ro->connected && !msg->msg_name)
220+
return -EDESTADDRREQ;
221+
else if (ro->connected && msg->msg_name)
222+
return -EISCONN;
223+
222224
if (!ro->bound)
223225
dev = dev_getfirstbyhwtype(sock_net(sk), ARPHRD_IEEE802154);
224226
else
@@ -254,8 +256,16 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk,
254256
cb->type = IEEE802154_FC_TYPE_DATA;
255257
cb->ackreq = ro->want_ack;
256258

257-
err = dev_hard_header(skb, dev, ETH_P_IEEE802154, &ro->dst_addr,
258-
ro->bound ? &ro->src_addr : NULL, size);
259+
if (msg->msg_name) {
260+
DECLARE_SOCKADDR(struct sockaddr_ieee802154*, daddr, msg->msg_name);
261+
262+
ieee802154_addr_from_sa(&dst_addr, &daddr->addr);
263+
} else {
264+
dst_addr = ro->dst_addr;
265+
}
266+
267+
err = dev_hard_header(skb, dev, ETH_P_IEEE802154, &dst_addr,
268+
ro->bound ? &ro->src_addr : NULL, size);
259269
if (err < 0)
260270
goto out_skb;
261271

0 commit comments

Comments
 (0)