|
@@ -25,6 +25,7 @@
|
|
#include <linux/termios.h> /* For TIOCOUTQ/INQ */
|
|
#include <linux/termios.h> /* For TIOCOUTQ/INQ */
|
|
#include <linux/list.h>
|
|
#include <linux/list.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
+#include <linux/socket.h>
|
|
#include <net/datalink.h>
|
|
#include <net/datalink.h>
|
|
#include <net/psnap.h>
|
|
#include <net/psnap.h>
|
|
#include <net/sock.h>
|
|
#include <net/sock.h>
|
|
@@ -452,6 +453,7 @@ struct dgram_sock {
|
|
unsigned int bound:1;
|
|
unsigned int bound:1;
|
|
unsigned int connected:1;
|
|
unsigned int connected:1;
|
|
unsigned int want_ack:1;
|
|
unsigned int want_ack:1;
|
|
|
|
+ unsigned int want_lqi:1;
|
|
unsigned int secen:1;
|
|
unsigned int secen:1;
|
|
unsigned int secen_override:1;
|
|
unsigned int secen_override:1;
|
|
unsigned int seclevel:3;
|
|
unsigned int seclevel:3;
|
|
@@ -486,6 +488,7 @@ static int dgram_init(struct sock *sk)
|
|
struct dgram_sock *ro = dgram_sk(sk);
|
|
struct dgram_sock *ro = dgram_sk(sk);
|
|
|
|
|
|
ro->want_ack = 1;
|
|
ro->want_ack = 1;
|
|
|
|
+ ro->want_lqi = 0;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -713,6 +716,7 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|
size_t copied = 0;
|
|
size_t copied = 0;
|
|
int err = -EOPNOTSUPP;
|
|
int err = -EOPNOTSUPP;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
|
|
+ struct dgram_sock *ro = dgram_sk(sk);
|
|
DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
|
|
DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
|
|
|
|
|
|
skb = skb_recv_datagram(sk, flags, noblock, &err);
|
|
skb = skb_recv_datagram(sk, flags, noblock, &err);
|
|
@@ -744,6 +748,13 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|
*addr_len = sizeof(*saddr);
|
|
*addr_len = sizeof(*saddr);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (ro->want_lqi) {
|
|
|
|
+ err = put_cmsg(msg, SOL_IEEE802154, WPAN_WANTLQI,
|
|
|
|
+ sizeof(uint8_t), &(mac_cb(skb)->lqi));
|
|
|
|
+ if (err)
|
|
|
|
+ goto done;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (flags & MSG_TRUNC)
|
|
if (flags & MSG_TRUNC)
|
|
copied = skb->len;
|
|
copied = skb->len;
|
|
done:
|
|
done:
|
|
@@ -847,6 +858,9 @@ static int dgram_getsockopt(struct sock *sk, int level, int optname,
|
|
case WPAN_WANTACK:
|
|
case WPAN_WANTACK:
|
|
val = ro->want_ack;
|
|
val = ro->want_ack;
|
|
break;
|
|
break;
|
|
|
|
+ case WPAN_WANTLQI:
|
|
|
|
+ val = ro->want_lqi;
|
|
|
|
+ break;
|
|
case WPAN_SECURITY:
|
|
case WPAN_SECURITY:
|
|
if (!ro->secen_override)
|
|
if (!ro->secen_override)
|
|
val = WPAN_SECURITY_DEFAULT;
|
|
val = WPAN_SECURITY_DEFAULT;
|
|
@@ -892,6 +906,9 @@ static int dgram_setsockopt(struct sock *sk, int level, int optname,
|
|
case WPAN_WANTACK:
|
|
case WPAN_WANTACK:
|
|
ro->want_ack = !!val;
|
|
ro->want_ack = !!val;
|
|
break;
|
|
break;
|
|
|
|
+ case WPAN_WANTLQI:
|
|
|
|
+ ro->want_lqi = !!val;
|
|
|
|
+ break;
|
|
case WPAN_SECURITY:
|
|
case WPAN_SECURITY:
|
|
if (!ns_capable(net->user_ns, CAP_NET_ADMIN) &&
|
|
if (!ns_capable(net->user_ns, CAP_NET_ADMIN) &&
|
|
!ns_capable(net->user_ns, CAP_NET_RAW)) {
|
|
!ns_capable(net->user_ns, CAP_NET_RAW)) {
|