Commit 8c05c98b authored by Thibaut Robert's avatar Thibaut Robert Committed by Greg Kroah-Hartman

staging: wilc1000: Use common structs to parse ip packets

Use structs ethhdr, iphdr and tcphdr instead of manual parsing in
tcp_process.
This commit fix handling of ip packets containing options.
It also fixes the following sparse warning:

drivers/staging/wilc1000//wilc_wlan.c:201:19: warning: cast to restricted __be16
Signed-off-by: default avatarThibaut Robert <thibaut.robert@gmail.com>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 60429852
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/if_ether.h>
#include <linux/ip.h>
#include "wilc_wfi_netdevice.h" #include "wilc_wfi_netdevice.h"
#include "wilc_wlan_cfg.h" #include "wilc_wlan_cfg.h"
...@@ -150,9 +152,8 @@ static inline int add_tcp_pending_ack(u32 ack, u32 session_index, ...@@ -150,9 +152,8 @@ static inline int add_tcp_pending_ack(u32 ack, u32 session_index,
static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe) static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe)
{ {
u8 *eth_hdr_ptr; void *buffer = tqe->buffer;
u8 *buffer = tqe->buffer; const struct ethhdr *eth_hdr_ptr = buffer;
unsigned short h_proto;
int i; int i;
unsigned long flags; unsigned long flags;
struct wilc_vif *vif; struct wilc_vif *vif;
...@@ -163,37 +164,23 @@ static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe) ...@@ -163,37 +164,23 @@ static inline void tcp_process(struct net_device *dev, struct txq_entry_t *tqe)
spin_lock_irqsave(&wilc->txq_spinlock, flags); spin_lock_irqsave(&wilc->txq_spinlock, flags);
eth_hdr_ptr = &buffer[0]; if (eth_hdr_ptr->h_proto == htons(ETH_P_IP)) {
h_proto = ntohs(*((unsigned short *)&eth_hdr_ptr[12])); const struct iphdr *ip_hdr_ptr = buffer + ETH_HLEN;
if (h_proto == ETH_P_IP) {
u8 *ip_hdr_ptr;
u8 protocol;
ip_hdr_ptr = &buffer[ETHERNET_HDR_LEN]; if (ip_hdr_ptr->protocol == IPPROTO_TCP) {
protocol = ip_hdr_ptr[9]; const struct tcphdr *tcp_hdr_ptr;
if (protocol == 0x06) {
u8 *tcp_hdr_ptr;
u32 IHL, total_length, data_offset; u32 IHL, total_length, data_offset;
tcp_hdr_ptr = &ip_hdr_ptr[IP_HDR_LEN]; IHL = ip_hdr_ptr->ihl << 2;
IHL = (ip_hdr_ptr[0] & 0xf) << 2; tcp_hdr_ptr = buffer + ETH_HLEN + IHL;
total_length = ((u32)ip_hdr_ptr[2] << 8) + total_length = ntohs(ip_hdr_ptr->tot_len);
(u32)ip_hdr_ptr[3];
data_offset = ((u32)tcp_hdr_ptr[12] & 0xf0) >> 2; data_offset = tcp_hdr_ptr->doff << 2;
if (total_length == (IHL + data_offset)) { if (total_length == (IHL + data_offset)) {
u32 seq_no, ack_no; u32 seq_no, ack_no;
seq_no = ((u32)tcp_hdr_ptr[4] << 24) + seq_no = ntohl(tcp_hdr_ptr->seq);
((u32)tcp_hdr_ptr[5] << 16) + ack_no = ntohl(tcp_hdr_ptr->ack_seq);
((u32)tcp_hdr_ptr[6] << 8) +
(u32)tcp_hdr_ptr[7];
ack_no = ((u32)tcp_hdr_ptr[8] << 24) +
((u32)tcp_hdr_ptr[9] << 16) +
((u32)tcp_hdr_ptr[10] << 8) +
(u32)tcp_hdr_ptr[11];
for (i = 0; i < tcp_session; i++) { for (i = 0; i < tcp_session; i++) {
u32 j = ack_session_info[i].seq_num; u32 j = ack_session_info[i].seq_num;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment