def merge_protocols(ports=[]):
    """
    This function merge rows having the exact same data (port, name,
    description) but a different protocol.

    :param ports: the list of ports
    :return: all ports with merged protocols
    :rtype: list
    """
    keys = {}
    for port in ports:
        key = "{}-{}-{}".format(
            port.get("description"), port.get("name"), port.get("port")
        )
        if key not in keys:
            keys[key] = port
        else:
            keys[key]["protocol"] += ", {}".format(port.get("protocol"))
    return list(keys.values())