Print this page
6274 MAC tries to use aggr rings from downed links
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Approved by: Richard Lowe <richlowe@richlowe.net>

*** 19,29 **** * CDDL HEADER END */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright (c) 2014, Joyent, Inc. All rights reserved. */ /* * MAC Services Module * --- 19,29 ---- * CDDL HEADER END */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2015 Joyent, Inc. */ /* * MAC Services Module *
*** 1675,1684 **** --- 1675,1715 ---- MAC_TX(mip, rh, mp, mcip); return (mp); } + /* + * Private function that is only used by aggr to update the default transmission + * ring. Because aggr exposes a pseudo Tx ring even for ports that may + * temporarily be down, it may need to update the default ring that is used by + * MAC such that it refers to a link that can actively be used to send traffic. + * Note that this is different from the case where the port has been removed + * from the group. In those cases, all of the rings will be torn down because + * the ring will no longer exist. It's important to give aggr a case where the + * rings can still exist such that it may be able to continue to send LACP PDUs + * to potentially restore the link. + * + * Finally, we explicitly don't do anything if the ring hasn't been enabled yet. + * This is to help out aggr which doesn't really know the internal state that + * MAC does about the rings and can't know that it's not quite ready for use + * yet. + */ + void + mac_hwring_set_default(mac_handle_t mh, mac_ring_handle_t rh) + { + mac_impl_t *mip = (mac_impl_t *)mh; + mac_ring_t *ring = (mac_ring_t *)rh; + + ASSERT(MAC_PERIM_HELD(mh)); + VERIFY(mip->mi_state_flags & MIS_IS_AGGR); + + if (ring->mr_state != MR_INUSE) + return; + + mip->mi_default_tx_ring = rh; + } + int mac_hwgroup_addmac(mac_group_handle_t gh, const uint8_t *addr) { mac_group_t *group = (mac_group_t *)gh;