2017-05-11 14:51:01 -07:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2015-2016 Quantenna Communications, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _QTN_FMAC_QLINK_UTIL_H_
|
|
|
|
#define _QTN_FMAC_QLINK_UTIL_H_
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/skbuff.h>
|
|
|
|
|
|
|
|
#include "qlink.h"
|
|
|
|
|
|
|
|
static inline void qtnf_cmd_skb_put_action(struct sk_buff *skb, u16 action)
|
|
|
|
{
|
|
|
|
__le16 *buf_ptr;
|
|
|
|
|
|
|
|
buf_ptr = (__le16 *)skb_put(skb, sizeof(action));
|
|
|
|
*buf_ptr = cpu_to_le16(action);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
qtnf_cmd_skb_put_buffer(struct sk_buff *skb, const u8 *buf_src, size_t len)
|
|
|
|
{
|
|
|
|
u8 *buf_dst;
|
|
|
|
|
networking: introduce and use skb_put_data()
A common pattern with skb_put() is to just want to memcpy()
some data into the new space, introduce skb_put_data() for
this.
An spatch similar to the one for skb_put_zero() converts many
of the places using it:
@@
identifier p, p2;
expression len, skb, data;
type t, t2;
@@
(
-p = skb_put(skb, len);
+p = skb_put_data(skb, data, len);
|
-p = (t)skb_put(skb, len);
+p = skb_put_data(skb, data, len);
)
(
p2 = (t2)p;
-memcpy(p2, data, len);
|
-memcpy(p, data, len);
)
@@
type t, t2;
identifier p, p2;
expression skb, data;
@@
t *p;
...
(
-p = skb_put(skb, sizeof(t));
+p = skb_put_data(skb, data, sizeof(t));
|
-p = (t *)skb_put(skb, sizeof(t));
+p = skb_put_data(skb, data, sizeof(t));
)
(
p2 = (t2)p;
-memcpy(p2, data, sizeof(*p));
|
-memcpy(p, data, sizeof(*p));
)
@@
expression skb, len, data;
@@
-memcpy(skb_put(skb, len), data, len);
+skb_put_data(skb, data, len);
(again, manually post-processed to retain some comments)
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-06-16 14:29:20 +02:00
|
|
|
buf_dst = skb_put_data(skb, buf_src, len);
|
2017-05-11 14:51:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void qtnf_cmd_skb_put_tlv_arr(struct sk_buff *skb,
|
|
|
|
u16 tlv_id, const u8 arr[],
|
|
|
|
size_t arr_len)
|
|
|
|
{
|
|
|
|
struct qlink_tlv_hdr *hdr =
|
|
|
|
(void *)skb_put(skb, sizeof(*hdr) + arr_len);
|
|
|
|
|
|
|
|
hdr->type = cpu_to_le16(tlv_id);
|
|
|
|
hdr->len = cpu_to_le16(arr_len);
|
|
|
|
memcpy(hdr->val, arr, arr_len);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void qtnf_cmd_skb_put_tlv_u8(struct sk_buff *skb, u16 tlv_id,
|
|
|
|
u8 value)
|
|
|
|
{
|
|
|
|
struct qlink_tlv_hdr *hdr =
|
|
|
|
(void *)skb_put(skb, sizeof(*hdr) + sizeof(value));
|
|
|
|
|
|
|
|
hdr->type = cpu_to_le16(tlv_id);
|
|
|
|
hdr->len = cpu_to_le16(sizeof(value));
|
|
|
|
*hdr->val = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void qtnf_cmd_skb_put_tlv_u16(struct sk_buff *skb,
|
|
|
|
u16 tlv_id, u16 value)
|
|
|
|
{
|
|
|
|
struct qlink_tlv_hdr *hdr =
|
|
|
|
(void *)skb_put(skb, sizeof(*hdr) + sizeof(value));
|
|
|
|
__le16 tmp = cpu_to_le16(value);
|
|
|
|
|
|
|
|
hdr->type = cpu_to_le16(tlv_id);
|
|
|
|
hdr->len = cpu_to_le16(sizeof(value));
|
|
|
|
memcpy(hdr->val, &tmp, sizeof(tmp));
|
|
|
|
}
|
|
|
|
|
|
|
|
u16 qlink_iface_type_mask_to_nl(u16 qlink_mask);
|
|
|
|
u8 qlink_chan_width_mask_to_nl(u16 qlink_mask);
|
|
|
|
|
|
|
|
#endif /* _QTN_FMAC_QLINK_UTIL_H_ */
|