aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lacp/ptx_machine.h
AgeCommit message (Collapse)AuthorFilesLines
2020-07-28bonding lacp: replace slave string with memberSteven Luong1-15/+15
- Replace textual string slave with member except APIs. - For APIs, mark the existing APIs as deprecated and introduce new APIs - While introducing sw_bond_interface_dump, add the optional filter by sw_if_index and enhance the testcases to make use of it. Type: improvement Signed-off-by: Steven Luong <sluong@cisco.com> Change-Id: Ib6626c514e45350308aeeda0decb70f3aba2f63e
2019-04-03lacp: passive mode support [VPP-1551]Steven Luong1-1/+11
By definition, passive mode means the node does not start sending lacp pdu until it first hears from the partner or remote. - Rename ptx machine's BEGIN state to NO_PERIODIC state. - Put periodic machine in NO_PERIDOIC state when the interface is enabled for lacp. ptx machine will transition out of NO_PERIODIC state when the local node hears from the remote or when the local node is configured for active mode. - Also add send and receive statistics for debugging. Change-Id: I747953b9595ed31328b2f4f3e7a8d15d01e04d7f Signed-off-by: Steven Luong <sluong@cisco.com>
2018-04-23lacp: partner may time us out if fast-rate is configured [VPP-1247]Steven1-7/+9
We should be sending LACP PDU every second if the partner has LACP_TIMEOUT flag set which means it will time us out in 3 seconds. Add interface name for lacp trace Change-Id: If7d816c062d03e80cc0dd7d10dba0b76ace0664a Signed-off-by: Steven <sluong@cisco.com>
2018-03-30lacp: faster convergence for slow-rate config optionSteven1-0/+15
Do fast-rate if we are not yet synchronized with the partner. Stop sending LACP updates as a flash in the worker thread. Just expire the timer and let the lacp_process handle sending LACP PDU. Change-Id: I8b36fe74e752e7f45bd4a8d70512c0341cc197a1 Signed-off-by: Steven <sluong@cisco.com>
2018-03-21bond: Add bonding driver and LACP protocolSteven1-0/+80
Add bonding driver to support creation of bond interface which composes of multiple slave interfaces. The slave interfaces could be physical interfaces, or just any virtual interfaces. For example, memif interfaces. The syntax to create a bond interface is create bond mode <lacp | xor | acitve-backup | broadcast | round-robin> To enslave an interface to the bond interface, enslave interface TenGigabitEthernet6/0/0 to BondEthernet0 Please see src/plugins/lacp/lacp_doc.md for more examples and additional options. LACP is a control plane protocol which manages and monitors the status of the slave interfaces. The protocol is part of 802.3ad standard. This patch implements LACPv1. LACPv2 is not supported. To enable LACP on the bond interface, specify "mode lacp" when the bond interface is created. The syntax to enslave a slave interface is the same as other bonding modes. Change-Id: I06581d3b87635972f9f0e1ec50b67560fc13e26c Signed-off-by: Steven <sluong@cisco.com>
6' href='#n6'>6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
# Copyright (c) 2018 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""CSIT Presentation and analytics layer.
"""

import sys
import argparse
import logging

from errors import PresentationError
from environment import Environment, clean_environment
from specification_parser import Specification
from input_data_files import download_data_files, unzip_files
from input_data_parser import InputData
from generator_tables import generate_tables
from generator_plots import generate_plots
from generator_files import generate_files
from static_content import prepare_static_content
from generator_report import generate_report
from generator_CPTA import generate_cpta

from pprint import pprint


def parse_args():
    """Parse arguments from cmd line.

    :returns: Parsed arguments.
    :rtype: ArgumentParser
    """

    parser = argparse.ArgumentParser(description=__doc__,
                                     formatter_class=argparse.
                                     RawDescriptionHelpFormatter)
    parser.add_argument("-s", "--specification",
                        required=True,
                        type=argparse.FileType('r'),
                        help="Specification YAML file.")
    parser.add_argument("-r", "--release",
                        default="master",
                        type=str,
                        help="Release string of the product.")
    parser.add_argument("-l", "--logging",
                        choices=["DEBUG", "INFO", "WARNING",
                                 "ERROR", "CRITICAL"],
                        default="ERROR",
                        help="Logging level.")
    parser.add_argument("-f", "--force",
                        action='store_true',
                        help="Force removing the old build(s) if present.")

    return parser.parse_args()


def main():
    """Main function."""

    log_levels = {"NOTSET": logging.NOTSET,
                  "DEBUG": logging.DEBUG,
                  "INFO": logging.INFO,
                  "WARNING": logging.WARNING,
                  "ERROR": logging.ERROR,
                  "CRITICAL": logging.CRITICAL}

    args = parse_args()
    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',
                        datefmt='%Y/%m/%d %H:%M:%S',
                        level=log_levels[args.logging])

    logging.info("Application started.")
    try:
        spec = Specification(args.specification)
        spec.read_specification()
    except PresentationError:
        logging.critical("Finished with error.")
        return 1

    ret_code = 0
    # try:
    env = Environment(spec.environment, args.force)
    env.set_environment()

    if spec.is_debug:
        if spec.debug["input-format"] == "zip":
            unzip_files(spec)
    else:
        download_data_files(spec)

    prepare_static_content(spec)

    data = InputData(spec)
    data.read_data()

    generate_tables(spec, data)
    generate_plots(spec, data)
    generate_files(spec, data)

    if spec.output["output"] == "report":
        generate_report(args.release, spec)
        logging.info("Successfully finished.")
    elif spec.output["output"] == "CPTA":
        sys.stdout.write(generate_cpta(spec, data))
        logging.info("Successfully finished.")
    else:
        logging.critical("The output '{0}' is not supported.".
                         format(spec.output["output"]))
        ret_code = 1

    # except (KeyError, ValueError, PresentationError) as err:
    #     logging.info("Finished with an error.")
    #     logging.critical(str(err))
    #     ret_code = 1
    # except Exception as err:
    #     logging.info("Finished with an unexpected error.")
    #     logging.critical(str(err))
    #     ret_code = 1
    # finally:
    #     if spec is not None and not spec.is_debug:
    #         clean_environment(spec.environment)
    #     return ret_code


if __name__ == '__main__':
    sys.exit(main())