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())
