ieee802154: use ieee802154_addr instead of *_sa variants
[deliverable/linux.git] / net / ieee802154 / dgram.c
index 405fdf9bf5e15298ab59989a73e2c49b1547c100..55f2dc45a7dc72d7dcc74c986332dbdf8bc71d05 100644 (file)
@@ -41,8 +41,8 @@ static DEFINE_RWLOCK(dgram_lock);
 struct dgram_sock {
        struct sock sk;
 
-       struct ieee802154_addr_sa src_addr;
-       struct ieee802154_addr_sa dst_addr;
+       struct ieee802154_addr src_addr;
+       struct ieee802154_addr dst_addr;
 
        unsigned int bound:1;
        unsigned int want_ack:1;
@@ -73,10 +73,10 @@ static int dgram_init(struct sock *sk)
 {
        struct dgram_sock *ro = dgram_sk(sk);
 
-       ro->dst_addr.addr_type = IEEE802154_ADDR_LONG;
-       ro->dst_addr.pan_id = 0xffff;
+       ro->dst_addr.mode = IEEE802154_ADDR_LONG;
+       ro->dst_addr.pan_id = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
        ro->want_ack = 1;
-       memset(&ro->dst_addr.hwaddr, 0xff, sizeof(ro->dst_addr.hwaddr));
+       memset(&ro->dst_addr.extended_addr, 0xff, IEEE802154_ADDR_LEN);
        return 0;
 }
 
@@ -88,6 +88,7 @@ static void dgram_close(struct sock *sk, long timeout)
 static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len)
 {
        struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
+       struct ieee802154_addr haddr;
        struct dgram_sock *ro = dgram_sk(sk);
        int err = -EINVAL;
        struct net_device *dev;
@@ -102,7 +103,8 @@ static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len)
        if (addr->family != AF_IEEE802154)
                goto out;
 
-       dev = ieee802154_get_dev(sock_net(sk), &addr->addr);
+       ieee802154_addr_from_sa(&haddr, &addr->addr);
+       dev = ieee802154_get_dev(sock_net(sk), &haddr);
        if (!dev) {
                err = -ENODEV;
                goto out;
@@ -113,7 +115,7 @@ static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len)
                goto out_put;
        }
 
-       memcpy(&ro->src_addr, &addr->addr, sizeof(struct ieee802154_addr_sa));
+       ro->src_addr = haddr;
 
        ro->bound = 1;
        err = 0;
@@ -149,8 +151,7 @@ static int dgram_ioctl(struct sock *sk, int cmd, unsigned long arg)
                         * of this packet since that is all
                         * that will be read.
                         */
-                       /* FIXME: parse the header for more correct value */
-                       amount = skb->len - (3+8+8);
+                       amount = skb->len - ieee802154_hdr_length(skb);
                }
                spin_unlock_bh(&sk->sk_receive_queue.lock);
                return put_user(amount, (int __user *)arg);
@@ -181,7 +182,7 @@ static int dgram_connect(struct sock *sk, struct sockaddr *uaddr,
                goto out;
        }
 
-       memcpy(&ro->dst_addr, &addr->addr, sizeof(struct ieee802154_addr_sa));
+       ieee802154_addr_from_sa(&ro->dst_addr, &addr->addr);
 
 out:
        release_sock(sk);
@@ -194,8 +195,8 @@ static int dgram_disconnect(struct sock *sk, int flags)
 
        lock_sock(sk);
 
-       ro->dst_addr.addr_type = IEEE802154_ADDR_LONG;
-       memset(&ro->dst_addr.hwaddr, 0xff, sizeof(ro->dst_addr.hwaddr));
+       ro->dst_addr.mode = IEEE802154_ADDR_LONG;
+       memset(&ro->dst_addr.extended_addr, 0xff, IEEE802154_ADDR_LEN);
 
        release_sock(sk);
 
@@ -312,7 +313,7 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk,
 
        if (saddr) {
                saddr->family = AF_IEEE802154;
-               saddr->addr = mac_cb(skb)->sa;
+               ieee802154_addr_to_sa(&saddr->addr, &mac_cb(skb)->source);
                *addr_len = sizeof(*saddr);
        }
 
@@ -336,40 +337,43 @@ static int dgram_rcv_skb(struct sock *sk, struct sk_buff *skb)
        return NET_RX_SUCCESS;
 }
 
-static inline int ieee802154_match_sock(u8 *hw_addr, u16 pan_id,
-               u16 short_addr, struct dgram_sock *ro)
+static inline bool
+ieee802154_match_sock(__le64 hw_addr, __le16 pan_id, __le16 short_addr,
+                     struct dgram_sock *ro)
 {
        if (!ro->bound)
-               return 1;
+               return true;
 
-       if (ro->src_addr.addr_type == IEEE802154_ADDR_LONG &&
-           !memcmp(ro->src_addr.hwaddr, hw_addr, IEEE802154_ADDR_LEN))
-               return 1;
+       if (ro->src_addr.mode == IEEE802154_ADDR_LONG &&
+           hw_addr == ro->src_addr.extended_addr)
+               return true;
 
-       if (ro->src_addr.addr_type == IEEE802154_ADDR_SHORT &&
-                    pan_id == ro->src_addr.pan_id &&
-                    short_addr == ro->src_addr.short_addr)
-               return 1;
+       if (ro->src_addr.mode == IEEE802154_ADDR_SHORT &&
+           pan_id == ro->src_addr.pan_id &&
+           short_addr == ro->src_addr.short_addr)
+               return true;
 
-       return 0;
+       return false;
 }
 
 int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb)
 {
        struct sock *sk, *prev = NULL;
        int ret = NET_RX_SUCCESS;
-       u16 pan_id, short_addr;
+       __le16 pan_id, short_addr;
+       __le64 hw_addr;
 
        /* Data frame processing */
        BUG_ON(dev->type != ARPHRD_IEEE802154);
 
        pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev);
        short_addr = ieee802154_mlme_ops(dev)->get_short_addr(dev);
+       hw_addr = ieee802154_devaddr_from_raw(dev->dev_addr);
 
        read_lock(&dgram_lock);
        sk_for_each(sk, &dgram_head) {
-               if (ieee802154_match_sock(dev->dev_addr, pan_id, short_addr,
-                                       dgram_sk(sk))) {
+               if (ieee802154_match_sock(hw_addr, pan_id, short_addr,
+                                         dgram_sk(sk))) {
                        if (prev) {
                                struct sk_buff *clone;
                                clone = skb_clone(skb, GFP_ATOMIC);
This page took 0.028132 seconds and 5 git commands to generate.