def _send_periodic_internal(self, msg, period, duration=None):
        """Start sending a message at a given period on this bus.

        The kernel's broadcast manager will be used.

        :param can.Message msg:
            Message to transmit
        :param float period:
            Period in seconds between each message
        :param float duration:
            The duration to keep sending this message at given rate. If
            no duration is provided, the task will continue indefinitely.

        :return:
            A started task instance. This can be used to modify the data,
            pause/resume the transmission and to stop the transmission.
        :rtype: can.interfaces.socketcan.CyclicSendTask

        .. note::

            Note the duration before the message stops being sent may not
            be exactly the same as the duration specified by the user. In
            general the message will be sent at the given rate until at
            least *duration* seconds.

        """
        bcm_socket = self._get_bcm_socket(msg.channel or self.channel)
        task = CyclicSendTask(bcm_socket, msg, period, duration)
        return task