s390/qeth: streamline control code for promisc mode
We have logic to determine the desired promisc mode in _each_ code path. Change things around so that there is a clean split between (a) high-level code that selects the new mode, and (b) implementations of the various mechanisms to program this mode. This also keeps qeth_promisc_to_bridge() from polluting the debug logs on each RX modeset. Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com> Reviewed-by: Alexandra Winter <wintera@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
2744d81169
Коммит
59b757a9bf
|
@ -653,6 +653,7 @@ struct qeth_card_info {
|
|||
__u16 func_level;
|
||||
char mcl_level[QETH_MCL_LENGTH + 1];
|
||||
u8 open_when_online:1;
|
||||
u8 promisc_mode:1;
|
||||
u8 use_v1_blkt:1;
|
||||
u8 is_vm_nic:1;
|
||||
int mac_bits;
|
||||
|
@ -662,7 +663,6 @@ struct qeth_card_info {
|
|||
int unique_id;
|
||||
bool layer_enforced;
|
||||
struct qeth_card_blkt blkt;
|
||||
enum qeth_ipa_promisc_modes promisc_mode;
|
||||
__u32 diagass_support;
|
||||
__u32 hwtrap;
|
||||
};
|
||||
|
@ -1004,7 +1004,7 @@ void qeth_clear_ipacmd_list(struct qeth_card *);
|
|||
int qeth_qdio_clear_card(struct qeth_card *, int);
|
||||
void qeth_clear_working_pool_list(struct qeth_card *);
|
||||
void qeth_drain_output_queues(struct qeth_card *card);
|
||||
void qeth_setadp_promisc_mode(struct qeth_card *);
|
||||
void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable);
|
||||
int qeth_setadpparms_change_macaddr(struct qeth_card *);
|
||||
void qeth_tx_timeout(struct net_device *);
|
||||
void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
|
|
|
@ -4015,23 +4015,14 @@ static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
|||
return (cmd->hdr.return_code) ? -EIO : 0;
|
||||
}
|
||||
|
||||
void qeth_setadp_promisc_mode(struct qeth_card *card)
|
||||
void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable)
|
||||
{
|
||||
enum qeth_ipa_promisc_modes mode;
|
||||
struct net_device *dev = card->dev;
|
||||
enum qeth_ipa_promisc_modes mode = enable ? SET_PROMISC_MODE_ON :
|
||||
SET_PROMISC_MODE_OFF;
|
||||
struct qeth_cmd_buffer *iob;
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "setprom");
|
||||
|
||||
if (((dev->flags & IFF_PROMISC) &&
|
||||
(card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
|
||||
(!(dev->flags & IFF_PROMISC) &&
|
||||
(card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
|
||||
return;
|
||||
mode = SET_PROMISC_MODE_OFF;
|
||||
if (dev->flags & IFF_PROMISC)
|
||||
mode = SET_PROMISC_MODE_ON;
|
||||
QETH_CARD_TEXT_(card, 4, "mode:%x", mode);
|
||||
|
||||
iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
|
||||
|
|
|
@ -439,23 +439,14 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void qeth_promisc_to_bridge(struct qeth_card *card)
|
||||
static void qeth_l2_promisc_to_bridge(struct qeth_card *card, bool enable)
|
||||
{
|
||||
struct net_device *dev = card->dev;
|
||||
enum qeth_ipa_promisc_modes promisc_mode;
|
||||
int role;
|
||||
int rc;
|
||||
|
||||
QETH_CARD_TEXT(card, 3, "pmisc2br");
|
||||
|
||||
if (!card->options.sbp.reflect_promisc)
|
||||
return;
|
||||
promisc_mode = (dev->flags & IFF_PROMISC) ? SET_PROMISC_MODE_ON
|
||||
: SET_PROMISC_MODE_OFF;
|
||||
if (promisc_mode == card->info.promisc_mode)
|
||||
return;
|
||||
|
||||
if (promisc_mode == SET_PROMISC_MODE_ON) {
|
||||
if (enable) {
|
||||
if (card->options.sbp.reflect_promisc_primary)
|
||||
role = QETH_SBP_ROLE_PRIMARY;
|
||||
else
|
||||
|
@ -464,14 +455,26 @@ static void qeth_promisc_to_bridge(struct qeth_card *card)
|
|||
role = QETH_SBP_ROLE_NONE;
|
||||
|
||||
rc = qeth_bridgeport_setrole(card, role);
|
||||
QETH_CARD_TEXT_(card, 2, "bpm%c%04x",
|
||||
(promisc_mode == SET_PROMISC_MODE_ON) ? '+' : '-', rc);
|
||||
QETH_CARD_TEXT_(card, 2, "bpm%c%04x", enable ? '+' : '-', rc);
|
||||
if (!rc) {
|
||||
card->options.sbp.role = role;
|
||||
card->info.promisc_mode = promisc_mode;
|
||||
card->info.promisc_mode = enable;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void qeth_l2_set_promisc_mode(struct qeth_card *card)
|
||||
{
|
||||
bool enable = card->dev->flags & IFF_PROMISC;
|
||||
|
||||
if (card->info.promisc_mode == enable)
|
||||
return;
|
||||
|
||||
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
|
||||
qeth_setadp_promisc_mode(card, enable);
|
||||
else if (card->options.sbp.reflect_promisc)
|
||||
qeth_l2_promisc_to_bridge(card, enable);
|
||||
}
|
||||
|
||||
/* New MAC address is added to the hash table and marked to be written on card
|
||||
* only if there is not in the hash table storage already
|
||||
*
|
||||
|
@ -539,10 +542,7 @@ static void qeth_l2_rx_mode_work(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
|
||||
qeth_setadp_promisc_mode(card);
|
||||
else
|
||||
qeth_promisc_to_bridge(card);
|
||||
qeth_l2_set_promisc_mode(card);
|
||||
}
|
||||
|
||||
static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb,
|
||||
|
|
|
@ -1435,27 +1435,19 @@ static void qeth_l3_stop_card(struct qeth_card *card)
|
|||
flush_workqueue(card->event_wq);
|
||||
}
|
||||
|
||||
/*
|
||||
* test for and Switch promiscuous mode (on or off)
|
||||
* either for guestlan or HiperSocket Sniffer
|
||||
*/
|
||||
static void
|
||||
qeth_l3_handle_promisc_mode(struct qeth_card *card)
|
||||
static void qeth_l3_set_promisc_mode(struct qeth_card *card)
|
||||
{
|
||||
struct net_device *dev = card->dev;
|
||||
bool enable = card->dev->flags & IFF_PROMISC;
|
||||
|
||||
if (((dev->flags & IFF_PROMISC) &&
|
||||
(card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
|
||||
(!(dev->flags & IFF_PROMISC) &&
|
||||
(card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
|
||||
if (card->info.promisc_mode == enable)
|
||||
return;
|
||||
|
||||
if (IS_VM_NIC(card)) { /* Guestlan trace */
|
||||
if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
|
||||
qeth_setadp_promisc_mode(card);
|
||||
qeth_setadp_promisc_mode(card, enable);
|
||||
} else if (card->options.sniffer && /* HiperSockets trace */
|
||||
qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
if (enable) {
|
||||
QETH_CARD_TEXT(card, 3, "+promisc");
|
||||
qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE);
|
||||
} else {
|
||||
|
@ -1502,11 +1494,9 @@ static void qeth_l3_rx_mode_work(struct work_struct *work)
|
|||
addr->disp_flag = QETH_DISP_ADDR_DELETE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
|
||||
return;
|
||||
}
|
||||
qeth_l3_handle_promisc_mode(card);
|
||||
|
||||
qeth_l3_set_promisc_mode(card);
|
||||
}
|
||||
|
||||
static int qeth_l3_arp_makerc(u16 rc)
|
||||
|
|
Загрузка…
Ссылка в новой задаче