Commit 8bf70b68 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: don't cache MAC addresses for multicast IPs

Instead of storing the multicast-mapped MAC address in an IP address
object, just calculate the MAC address when actually building a cmd
for the IP address.

While at it, also clean up some rather verbose copying of IP addresses.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1b40d4b2
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <asm/qeth.h> #include <asm/qeth.h>
#include <uapi/linux/if_ether.h> #include <uapi/linux/if_ether.h>
#include <uapi/linux/in6.h>
#define IPA_PDU_HEADER_SIZE 0x40 #define IPA_PDU_HEADER_SIZE 0x40
#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer + 0x0e) #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer + 0x0e)
...@@ -365,8 +366,7 @@ struct qeth_ipacmd_setdelip6 { ...@@ -365,8 +366,7 @@ struct qeth_ipacmd_setdelip6 {
struct qeth_ipacmd_setdelipm { struct qeth_ipacmd_setdelipm {
__u8 mac[6]; __u8 mac[6];
__u8 padding[2]; __u8 padding[2];
__u8 ip6[12]; struct in6_addr ip;
__u8 ip4[4];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct qeth_ipacmd_layer2setdelmac { struct qeth_ipacmd_layer2setdelmac {
......
...@@ -24,7 +24,6 @@ enum qeth_ip_types { ...@@ -24,7 +24,6 @@ enum qeth_ip_types {
struct qeth_ipaddr { struct qeth_ipaddr {
struct hlist_node hnode; struct hlist_node hnode;
enum qeth_ip_types type; enum qeth_ip_types type;
unsigned char mac[ETH_ALEN];
u8 is_multicast:1; u8 is_multicast:1;
u8 in_progress:1; u8 in_progress:1;
u8 disp_flag:2; u8 disp_flag:2;
...@@ -74,12 +73,10 @@ static inline bool qeth_l3_addr_match_all(struct qeth_ipaddr *a1, ...@@ -74,12 +73,10 @@ static inline bool qeth_l3_addr_match_all(struct qeth_ipaddr *a1,
* so 'proto' and 'addr' match for sure. * so 'proto' and 'addr' match for sure.
* *
* For ucast: * For ucast:
* - 'mac' is always 0.
* - 'mask'/'pfxlen' for RXIP/VIPA is always 0. For NORMAL, matching * - 'mask'/'pfxlen' for RXIP/VIPA is always 0. For NORMAL, matching
* values are required to avoid mixups in takeover eligibility. * values are required to avoid mixups in takeover eligibility.
* *
* For mcast, * For mcast,
* - 'mac' is mapped from the IP, and thus always matches.
* - 'mask'/'pfxlen' is always 0. * - 'mask'/'pfxlen' is always 0.
*/ */
if (a1->type != a2->type) if (a1->type != a2->type)
......
...@@ -381,12 +381,13 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card, ...@@ -381,12 +381,13 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card,
if (!iob) if (!iob)
return -ENOMEM; return -ENOMEM;
cmd = __ipa_cmd(iob); cmd = __ipa_cmd(iob);
ether_addr_copy(cmd->data.setdelipm.mac, addr->mac); if (addr->proto == QETH_PROT_IPV6) {
if (addr->proto == QETH_PROT_IPV6) cmd->data.setdelipm.ip = addr->u.a6.addr;
memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr, ipv6_eth_mc_map(&addr->u.a6.addr, cmd->data.setdelipm.mac);
sizeof(struct in6_addr)); } else {
else cmd->data.setdelipm.ip.s6_addr32[3] = addr->u.a4.addr;
memcpy(&cmd->data.setdelipm.ip4, &addr->u.a4.addr, 4); ip_eth_mc_map(addr->u.a4.addr, cmd->data.setdelipm.mac);
}
return qeth_send_ipa_cmd(card, iob, qeth_l3_setdelip_cb, NULL); return qeth_send_ipa_cmd(card, iob, qeth_l3_setdelip_cb, NULL);
} }
...@@ -1127,7 +1128,6 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev) ...@@ -1127,7 +1128,6 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev)
for (im4 = rcu_dereference(in4_dev->mc_list); im4 != NULL; for (im4 = rcu_dereference(in4_dev->mc_list); im4 != NULL;
im4 = rcu_dereference(im4->next_rcu)) { im4 = rcu_dereference(im4->next_rcu)) {
ip_eth_mc_map(im4->multiaddr, tmp->mac);
tmp->u.a4.addr = im4->multiaddr; tmp->u.a4.addr = im4->multiaddr;
tmp->is_multicast = 1; tmp->is_multicast = 1;
...@@ -1139,7 +1139,7 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev) ...@@ -1139,7 +1139,7 @@ qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev)
ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV4); ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV4);
if (!ipm) if (!ipm)
continue; continue;
ether_addr_copy(ipm->mac, tmp->mac);
ipm->u.a4.addr = im4->multiaddr; ipm->u.a4.addr = im4->multiaddr;
ipm->is_multicast = 1; ipm->is_multicast = 1;
ipm->disp_flag = QETH_DISP_ADDR_ADD; ipm->disp_flag = QETH_DISP_ADDR_ADD;
...@@ -1207,9 +1207,7 @@ static void qeth_l3_add_mc6_to_hash(struct qeth_card *card, ...@@ -1207,9 +1207,7 @@ static void qeth_l3_add_mc6_to_hash(struct qeth_card *card,
return; return;
for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) { for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) {
ipv6_eth_mc_map(&im6->mca_addr, tmp->mac); tmp->u.a6.addr = im6->mca_addr;
memcpy(&tmp->u.a6.addr, &im6->mca_addr.s6_addr,
sizeof(struct in6_addr));
tmp->is_multicast = 1; tmp->is_multicast = 1;
ipm = qeth_l3_find_addr_by_ip(card, tmp); ipm = qeth_l3_find_addr_by_ip(card, tmp);
...@@ -1223,9 +1221,7 @@ static void qeth_l3_add_mc6_to_hash(struct qeth_card *card, ...@@ -1223,9 +1221,7 @@ static void qeth_l3_add_mc6_to_hash(struct qeth_card *card,
if (!ipm) if (!ipm)
continue; continue;
ether_addr_copy(ipm->mac, tmp->mac); ipm->u.a6.addr = im6->mca_addr;
memcpy(&ipm->u.a6.addr, &im6->mca_addr.s6_addr,
sizeof(struct in6_addr));
ipm->is_multicast = 1; ipm->is_multicast = 1;
ipm->disp_flag = QETH_DISP_ADDR_ADD; ipm->disp_flag = QETH_DISP_ADDR_ADD;
hash_add(card->ip_mc_htable, hash_add(card->ip_mc_htable,
......
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