1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright IBM Corp. 2007 4 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>, 5 * Frank Pavlic <fpavlic@de.ibm.com>, 6 * Thomas Spatzier <tspat@de.ibm.com>, 7 * Frank Blaschka <frank.blaschka@de.ibm.com> 8 */ 9 10 #ifndef __QETH_L3_H__ 11 #define __QETH_L3_H__ 12 13 #include "qeth_core.h" 14 #include <linux/hashtable.h> 15 16 #define QETH_SNIFF_AVAIL 0x0008 17 18 struct qeth_ipaddr { 19 struct hlist_node hnode; 20 enum qeth_ip_types type; 21 enum qeth_ipa_setdelip_flags set_flags; 22 enum qeth_ipa_setdelip_flags del_flags; 23 u8 is_multicast:1; 24 u8 in_progress:1; 25 u8 disp_flag:2; 26 27 /* is changed only for normal ip addresses 28 * for non-normal addresses it always is 1 29 */ 30 int ref_counter; 31 enum qeth_prot_versions proto; 32 unsigned char mac[ETH_ALEN]; 33 union { 34 struct { 35 unsigned int addr; 36 unsigned int mask; 37 } a4; 38 struct { 39 struct in6_addr addr; 40 unsigned int pfxlen; 41 } a6; 42 } u; 43 44 }; 45 static inline u64 qeth_l3_ipaddr_hash(struct qeth_ipaddr *addr) 46 { 47 u64 ret = 0; 48 u8 *point; 49 50 if (addr->proto == QETH_PROT_IPV6) { 51 point = (u8 *) &addr->u.a6.addr; 52 ret = get_unaligned((u64 *)point) ^ 53 get_unaligned((u64 *) (point + 8)); 54 } 55 if (addr->proto == QETH_PROT_IPV4) { 56 point = (u8 *) &addr->u.a4.addr; 57 ret = get_unaligned((u32 *) point); 58 } 59 return ret; 60 } 61 62 struct qeth_ipato_entry { 63 struct list_head entry; 64 enum qeth_prot_versions proto; 65 char addr[16]; 66 int mask_bits; 67 }; 68 69 extern const struct attribute_group *qeth_l3_attr_groups[]; 70 71 void qeth_l3_ipaddr_to_string(enum qeth_prot_versions, const __u8 *, char *); 72 int qeth_l3_create_device_attributes(struct device *); 73 void qeth_l3_remove_device_attributes(struct device *); 74 int qeth_l3_setrouting_v4(struct qeth_card *); 75 int qeth_l3_setrouting_v6(struct qeth_card *); 76 int qeth_l3_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *); 77 int qeth_l3_del_ipato_entry(struct qeth_card *card, 78 enum qeth_prot_versions proto, u8 *addr, 79 int mask_bits); 80 int qeth_l3_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *); 81 int qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto, 82 const u8 *addr); 83 int qeth_l3_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *); 84 int qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto, 85 const u8 *addr); 86 void qeth_l3_update_ipato(struct qeth_card *card); 87 struct qeth_ipaddr *qeth_l3_get_addr_buffer(enum qeth_prot_versions); 88 int qeth_l3_add_ip(struct qeth_card *, struct qeth_ipaddr *); 89 int qeth_l3_delete_ip(struct qeth_card *, struct qeth_ipaddr *); 90 91 #endif /* __QETH_L3_H__ */ 92