mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 01:51:53 +00:00
net: qualcomm: rmnet: don't use C bit-fields in rmnet checksum header
Replace the use of C bit-fields in the rmnet_map_ul_csum_header structure with a single two-byte (big endian) structure member, and use masks to encode or get values within it. The content of these fields can be accessed using simple bitwise AND and OR operations on the (host byte order) value of the new structure member. Previously rmnet_map_ipv4_ul_csum_header() would update C bit-field values in host byte order, then forcibly fix their byte order using a combination of byte swap operations and types. Instead, just compute the value that needs to go into the new structure member and save it with a simple byte-order conversion. Make similar simplifications in rmnet_map_ipv6_ul_csum_header(). Finally, in rmnet_map_checksum_uplink_packet() a set of assignments zeroes every field in the upload checksum header. Replace that with a single memset() operation. Signed-off-by: Alex Elder <elder@linaro.org> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cc1b21ba62
commit
86ca860e12
@ -197,20 +197,16 @@ rmnet_map_ipv4_ul_csum_header(void *iphdr,
|
||||
struct rmnet_map_ul_csum_header *ul_header,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
__be16 *hdr = (__be16 *)ul_header;
|
||||
struct iphdr *ip4h = iphdr;
|
||||
u16 val;
|
||||
|
||||
val = MAP_CSUM_UL_ENABLED_FLAG;
|
||||
if (ip4h->protocol == IPPROTO_UDP)
|
||||
val |= MAP_CSUM_UL_UDP_FLAG;
|
||||
val |= skb->csum_offset & MAP_CSUM_UL_OFFSET_MASK;
|
||||
|
||||
ul_header->csum_start_offset = htons(skb_network_header_len(skb));
|
||||
ul_header->csum_insert_offset = skb->csum_offset;
|
||||
ul_header->csum_enabled = 1;
|
||||
if (ip4h->protocol == IPPROTO_UDP)
|
||||
ul_header->udp_ind = 1;
|
||||
else
|
||||
ul_header->udp_ind = 0;
|
||||
|
||||
/* Changing remaining fields to network order */
|
||||
hdr++;
|
||||
*hdr = htons((__force u16)*hdr);
|
||||
ul_header->csum_info = htons(val);
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
@ -237,21 +233,16 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr,
|
||||
struct rmnet_map_ul_csum_header *ul_header,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
__be16 *hdr = (__be16 *)ul_header;
|
||||
struct ipv6hdr *ip6h = ip6hdr;
|
||||
u16 val;
|
||||
|
||||
val = MAP_CSUM_UL_ENABLED_FLAG;
|
||||
if (ip6h->nexthdr == IPPROTO_UDP)
|
||||
val |= MAP_CSUM_UL_UDP_FLAG;
|
||||
val |= skb->csum_offset & MAP_CSUM_UL_OFFSET_MASK;
|
||||
|
||||
ul_header->csum_start_offset = htons(skb_network_header_len(skb));
|
||||
ul_header->csum_insert_offset = skb->csum_offset;
|
||||
ul_header->csum_enabled = 1;
|
||||
|
||||
if (ip6h->nexthdr == IPPROTO_UDP)
|
||||
ul_header->udp_ind = 1;
|
||||
else
|
||||
ul_header->udp_ind = 0;
|
||||
|
||||
/* Changing remaining fields to network order */
|
||||
hdr++;
|
||||
*hdr = htons((__force u16)*hdr);
|
||||
ul_header->csum_info = htons(val);
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
@ -419,10 +410,7 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
sw_csum:
|
||||
ul_header->csum_start_offset = 0;
|
||||
ul_header->csum_insert_offset = 0;
|
||||
ul_header->csum_enabled = 0;
|
||||
ul_header->udp_ind = 0;
|
||||
memset(ul_header, 0, sizeof(*ul_header));
|
||||
|
||||
priv->stats.csum_sw++;
|
||||
}
|
||||
|
@ -33,17 +33,16 @@ struct rmnet_map_dl_csum_trailer {
|
||||
|
||||
struct rmnet_map_ul_csum_header {
|
||||
__be16 csum_start_offset;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
u16 csum_insert_offset:14;
|
||||
u16 udp_ind:1;
|
||||
u16 csum_enabled:1;
|
||||
#elif defined (__BIG_ENDIAN_BITFIELD)
|
||||
u16 csum_enabled:1;
|
||||
u16 udp_ind:1;
|
||||
u16 csum_insert_offset:14;
|
||||
#else
|
||||
#error "Please fix <asm/byteorder.h>"
|
||||
#endif
|
||||
__be16 csum_info; /* MAP_CSUM_UL_* */
|
||||
} __aligned(1);
|
||||
|
||||
/* csum_info field:
|
||||
* OFFSET: where (offset in bytes) to insert computed checksum
|
||||
* UDP: 1 = UDP checksum (zero checkum means no checksum)
|
||||
* ENABLED: 1 = checksum computation requested
|
||||
*/
|
||||
#define MAP_CSUM_UL_OFFSET_MASK GENMASK(13, 0)
|
||||
#define MAP_CSUM_UL_UDP_FLAG BIT(14)
|
||||
#define MAP_CSUM_UL_ENABLED_FLAG BIT(15)
|
||||
|
||||
#endif /* !(_LINUX_IF_RMNET_H_) */
|
||||
|
Loading…
Reference in New Issue
Block a user