1 /* SPDX-License-Identifier: GPL-2.0 */
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>
13 #include "qeth_core.h"
14 #include <linux/hashtable.h>
23 struct hlist_node hnode
;
24 enum qeth_ip_types type
;
27 u8 ipato
:1; /* ucast only */
29 /* is changed only for normal ip addresses
30 * for non-normal addresses it always is 1
33 enum qeth_prot_versions proto
;
46 static inline void qeth_l3_init_ipaddr(struct qeth_ipaddr
*addr
,
47 enum qeth_ip_types type
,
48 enum qeth_prot_versions proto
)
50 memset(addr
, 0, sizeof(*addr
));
53 addr
->disp_flag
= QETH_DISP_ADDR_DO_NOTHING
;
54 addr
->ref_counter
= 1;
57 static inline bool qeth_l3_addr_match_ip(struct qeth_ipaddr
*a1
,
58 struct qeth_ipaddr
*a2
)
60 if (a1
->proto
!= a2
->proto
)
62 if (a1
->proto
== QETH_PROT_IPV6
)
63 return ipv6_addr_equal(&a1
->u
.a6
.addr
, &a2
->u
.a6
.addr
);
64 return a1
->u
.a4
.addr
== a2
->u
.a4
.addr
;
67 static inline bool qeth_l3_addr_match_all(struct qeth_ipaddr
*a1
,
68 struct qeth_ipaddr
*a2
)
70 /* Assumes that the pair was obtained via qeth_l3_addr_find_by_ip(),
71 * so 'proto' and 'addr' match for sure.
74 * - 'mask'/'pfxlen' for RXIP/VIPA is always 0. For NORMAL, matching
75 * values are required to avoid mixups in takeover eligibility.
78 * - 'mask'/'pfxlen' is always 0.
80 if (a1
->type
!= a2
->type
)
82 if (a1
->proto
== QETH_PROT_IPV6
)
83 return a1
->u
.a6
.pfxlen
== a2
->u
.a6
.pfxlen
;
84 return a1
->u
.a4
.mask
== a2
->u
.a4
.mask
;
87 static inline u32
qeth_l3_ipaddr_hash(struct qeth_ipaddr
*addr
)
89 if (addr
->proto
== QETH_PROT_IPV6
)
90 return ipv6_addr_hash(&addr
->u
.a6
.addr
);
92 return ipv4_addr_hash(addr
->u
.a4
.addr
);
95 struct qeth_ipato_entry
{
96 struct list_head entry
;
97 enum qeth_prot_versions proto
;
102 extern const struct attribute_group
*qeth_l3_attr_groups
[];
104 int qeth_l3_ipaddr_to_string(enum qeth_prot_versions proto
, const u8
*addr
,
106 int qeth_l3_create_device_attributes(struct device
*);
107 void qeth_l3_remove_device_attributes(struct device
*);
108 int qeth_l3_setrouting_v4(struct qeth_card
*);
109 int qeth_l3_setrouting_v6(struct qeth_card
*);
110 int qeth_l3_add_ipato_entry(struct qeth_card
*, struct qeth_ipato_entry
*);
111 int qeth_l3_del_ipato_entry(struct qeth_card
*card
,
112 enum qeth_prot_versions proto
, u8
*addr
,
114 void qeth_l3_update_ipato(struct qeth_card
*card
);
115 int qeth_l3_modify_hsuid(struct qeth_card
*card
, bool add
);
116 int qeth_l3_modify_rxip_vipa(struct qeth_card
*card
, bool add
, const u8
*ip
,
117 enum qeth_ip_types type
,
118 enum qeth_prot_versions proto
);
120 #endif /* __QETH_L3_H__ */