Lines Matching +full:uapi +full:- +full:header

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2021-2022 Intel Corporation
6 #include <uapi/linux/if_ether.h>
7 #include <uapi/linux/if_arp.h>
8 #include <uapi/linux/icmp.h>
26 #include "iwl-mei.h"
41 if (!is_multicast_ether_addr(ethhdr->h_dest) || in iwl_mei_rx_filter_eth()
42 is_broadcast_ether_addr(ethhdr->h_dest)) in iwl_mei_rx_filter_eth()
45 for (filt = &filters->eth_filters[0]; in iwl_mei_rx_filter_eth()
46 filt < &filters->eth_filters[0] + ARRAY_SIZE(filters->eth_filters); in iwl_mei_rx_filter_eth()
49 if (!(filt->flags & SAP_ETH_FILTER_ENABLED)) in iwl_mei_rx_filter_eth()
52 if (compare_ether_header(filt->mac_address, ethhdr->h_dest)) in iwl_mei_rx_filter_eth()
56 if (filt->flags & SAP_ETH_FILTER_COPY) in iwl_mei_rx_filter_eth()
62 if (filt->flags & SAP_ETH_FILTER_STOP) { in iwl_mei_rx_filter_eth()
84 const struct iwl_sap_ipv4_filter *filt = &filters->ipv4_filter; in iwl_mei_rx_filter_arp()
87 u32 flags = le32_to_cpu(filt->flags); in iwl_mei_rx_filter_arp()
89 if (!pskb_may_pull(skb, arp_hdr_len(skb->dev))) in iwl_mei_rx_filter_arp()
95 if (arp->ar_hrd != htons(ARPHRD_ETHER) || in iwl_mei_rx_filter_arp()
96 arp->ar_pro != htons(ETH_P_IP)) in iwl_mei_rx_filter_arp()
100 * After the ARP header, we have: in iwl_mei_rx_filter_arp()
101 * src MAC address - 6 bytes in iwl_mei_rx_filter_arp()
102 * src IP address - 4 bytes in iwl_mei_rx_filter_arp()
103 * target MAC addess - 6 bytes in iwl_mei_rx_filter_arp()
112 if (arp->ar_op == htons(ARPOP_REQUEST) && in iwl_mei_rx_filter_arp()
113 (filt->flags & cpu_to_le32(SAP_IPV4_FILTER_ARP_REQ_PASS)) && in iwl_mei_rx_filter_arp()
114 (filt->ipv4_addr == 0 || filt->ipv4_addr == *target_ip)) { in iwl_mei_rx_filter_arp()
125 arp->ar_op == htons(ARPOP_REPLY)) { in iwl_mei_rx_filter_arp()
144 for (filt = &filters->flex_filters[0]; in iwl_mei_rx_filter_tcp_udp()
145 filt < &filters->flex_filters[0] + ARRAY_SIZE(filters->flex_filters); in iwl_mei_rx_filter_tcp_udp()
147 if (!(filt->flags & SAP_FLEX_FILTER_ENABLED)) in iwl_mei_rx_filter_tcp_udp()
154 if ((filt->flags & in iwl_mei_rx_filter_tcp_udp()
159 if ((filt->flags & SAP_FLEX_FILTER_UDP) && in iwl_mei_rx_filter_tcp_udp()
160 ip_hdr(skb)->protocol != IPPROTO_UDP) in iwl_mei_rx_filter_tcp_udp()
163 if ((filt->flags & SAP_FLEX_FILTER_TCP) && in iwl_mei_rx_filter_tcp_udp()
164 ip_hdr(skb)->protocol != IPPROTO_TCP) in iwl_mei_rx_filter_tcp_udp()
168 * We must have either a TCP header or a UDP header, both in iwl_mei_rx_filter_tcp_udp()
171 * Use a UDP header and that will work for TCP as well. in iwl_mei_rx_filter_tcp_udp()
173 if ((filt->src_port && filt->src_port != udp_hdr(skb)->source) || in iwl_mei_rx_filter_tcp_udp()
174 (filt->dst_port && filt->dst_port != udp_hdr(skb)->dest)) in iwl_mei_rx_filter_tcp_udp()
177 if (filt->flags & SAP_FLEX_FILTER_COPY) in iwl_mei_rx_filter_tcp_udp()
192 const struct iwl_sap_ipv4_filter *filt = &filters->ipv4_filter; in iwl_mei_rx_filter_ipv4()
203 match = !filters->ipv4_filter.ipv4_addr || in iwl_mei_rx_filter_ipv4()
204 filters->ipv4_filter.ipv4_addr == iphdr->daddr; in iwl_mei_rx_filter_ipv4()
208 switch (ip_hdr(skb)->protocol) { in iwl_mei_rx_filter_ipv4()
212 * UDP header is shorter than TCP header and we look at the first bytes in iwl_mei_rx_filter_ipv4()
213 * of the header anyway (see below). in iwl_mei_rx_filter_ipv4()
235 if ((filt->flags & cpu_to_le32(SAP_IPV4_FILTER_ICMP_PASS)) && in iwl_mei_rx_filter_ipv4()
236 match && (icmp->type != ICMP_ECHO || icmp->code != 0)) { in iwl_mei_rx_filter_ipv4()
237 if (filt->flags & cpu_to_le32(SAP_IPV4_FILTER_ICMP_COPY)) in iwl_mei_rx_filter_ipv4()
248 if ((filters->icmpv6_flags & cpu_to_le32(SAP_ICMPV6_FILTER_ENABLED) && in iwl_mei_rx_filter_ipv4()
250 if (filters->icmpv6_flags & in iwl_mei_rx_filter_ipv4()
289 * skb->data points the IP header / ARP header and the ETH header in iwl_mei_rx_pass_to_csme()
296 * an ETH header. Drop them here. in iwl_mei_rx_pass_to_csme()
308 switch (skb->protocol) { in iwl_mei_rx_pass_to_csme()
349 /* CSME wants the MAC header as well, push it back */ in iwl_mei_rx_filter()
350 skb_push(skb, skb->data - skb_mac_header(skb)); in iwl_mei_rx_filter()
379 if (origskb->protocol != htons(ETH_P_IP) || in iwl_mei_tx_copy_to_csme()
380 ip_hdr(origskb)->protocol != IPPROTO_UDP || in iwl_mei_tx_copy_to_csme()
381 udp_hdr(origskb)->source != htons(DHCP_CLIENT_PORT) || in iwl_mei_tx_copy_to_csme()
382 udp_hdr(origskb)->dest != htons(DHCP_SERVER_PORT)) in iwl_mei_tx_copy_to_csme()
393 skb->protocol = origskb->protocol; in iwl_mei_tx_copy_to_csme()
395 hdr = (void *)skb->data; in iwl_mei_tx_copy_to_csme()
401 * Remove the ieee80211 header + IV + SNAP but leave the ethertype in iwl_mei_tx_copy_to_csme()
402 * We still have enough headroom for the sap header. in iwl_mei_tx_copy_to_csme()
404 pskb_pull(skb, ieee80211_hdrlen(hdr->frame_control) + ivlen + 6); in iwl_mei_tx_copy_to_csme()