#define KBUILD_MODNAME "foo" #include #include #include #include #include #include #include #include #include "bpf_helpers.h" /* compiler workaround */ #define _htonl __builtin_bswap32 static inline void set_dst_mac(struct __sk_buff *skb, char *mac) { bpf_skb_store_bytes(skb, 0, mac, ETH_ALEN, 1); } #define IP_CSUM_OFF (ETH_HLEN + offsetof(struct iphdr, check)) #define TOS_OFF (ETH_HLEN + offsetof(struct iphdr, tos)) static inline void set_ip_tos(struct __sk_buff *skb, __u8 new_tos) { __u8 old_tos = load_byte(skb, TOS_OFF); bpf_l3_csum_replace(skb, IP_CSUM_OFF, htons(old_tos), htons(new_tos), 2); bpf_skb_store_bytes(skb, TOS_OFF, &new_tos, sizeof(new_tos), 0); } #define TCP_CSUM_OFF (ETH_HLEN + sizeof(struct iphdr) + offsetof(struct tcphdr, check)) #define IP_SRC_OFF (ETH_HLEN + offsetof(struct iphdr, saddr)) #define IS_PSEUDO 0x10 static inline void set_tcp_ip_src(struct __sk_buff *skb, __u32 new_ip) { __u32 old_ip = _htonl(load_word(skb, IP_SRC_OFF)); bpf_l4_csum_replace(skb, TCP_CSUM_OFF, old_ip, new_ip, IS_PSEUDO | sizeof(new_ip)); bpf_l3_csum_replace(skb, IP_CSUM_OFF, old_ip, new_ip, sizeof(new_ip)); bpf_skb_store_bytes(skb, IP_SRC_OFF, &new_ip, sizeof(new_ip), 0); } #define TCP_DPORT_OFF (ETH_HLEN + sizeof(struct iphdr) + offsetof(struct tcphdr, dest)) static inline void set_tcp_dest_port(struct __sk_buff *skb, __u16 new_port) { __u16 old_port = htons(load_half(skb, TCP_DPORT_OFF)); bpf_l4_csum_replace(skb, TCP_CSUM_OFF, old_port, new_port, sizeof(new_port)); bpf_skb_store_bytes(skb, TCP_DPORT_OFF, &new_port, sizeof(new_port), 0); } SEC("classifier") int bpf_prog1(struct __sk_buff *skb) { __u8 proto = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol)); long *value; if (proto == IPPROTO_TCP) { set_ip_tos(skb, 8); set_tcp_ip_src(skb, 0xA010101); set_tcp_dest_port(skb, 5001); } return 0; } SEC("redirect_xmit") int _redirect_xmit(struct __sk_buff *skb) { return bpf_redirect(skb->ifindex + 1, 0); } SEC("redirect_recv") int _redirect_recv(struct __sk_buff *skb) { return bpf_redirect(skb->ifindex + 1, 1); } SEC("clone_redirect_xmit") int _clone_redirect_xmit(struct __sk_buff *skb) { bpf_clone_redirect(skb, skb->ifindex + 1, 0); return TC_ACT_SHOT; } SEC("clone_redirect_recv") int _clone_redirect_recv(struct __sk_buff *skb) { bpf_clone_redirect(skb, skb->ifindex + 1, 1); return TC_ACT_SHOT; } char _license[] SEC("license") = "GPL"; elect name='qt'>
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-01-30 15:55:48 -0500
committerDavid S. Miller <davem@davemloft.net>2017-01-30 15:56:40 -0500
commit1930b60352e7e195f55b27cde15d2a8f43342a8b (patch)
treeec3f66cd8d8110bf7b4f61e0446bdea505915db9 /net/sunrpc/xprtrdma/verbs.c
parent4be9993493bc7ee3fdf950a83bc050a3e6cf2a45 (diff)
parentec960de61503ef349588dccfa3ae02efabcc2762 (diff)
Merge branch 'dsa-port-mirroring'
Florian Fainelli says: ==================== net: dsa: Port mirroring support This patch series adds support for port mirroring in the two Broadcom switch drivers. The major part of the functional are actually with the plumbing between tc and the drivers. Changes in v5: - Added Jiri's Reviewed-by tag to first patch - rebase against latest net-next/master after bcm_sf2 CFP series Changes in v4: - rebased against latest net-next/master after Vivien's changes Changes in v3: - removed multiline comments from added structures - simplify error handling in dsa_slave_add_cls_matchall Changes in v2: - fixed filter removal logic to disable the ingress or egress mirroring when there are no longer ports being monitored in ingress or egress - removed a stray list_head in dsa_port structure that is not used Tested using the two iproute2 examples: tc qdisc add dev eth1 handle ffff: ingress tc filter add dev eth1 parent ffff: \ matchall skip_sw \ action mirred egress mirror \ dev eth2 tc qdisc add dev eth1 handle 1: root prio tc filter add dev eth1 parent 1: \ matchall skip_sw \ action mirred egress mirror \ dev eth2 ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sunrpc/xprtrdma/verbs.c')