def tunnel_create(self, tunnel_id, peer_tunnel_id, socket): """ Creates a new L2TP tunnel. :param tunnel_id: Local tunnel identifier :param peer_tunnel_id: Remote peer tunnel identifier :param socket: UDP socket file descriptor """ msg = self._create_message(L2TP_CMD_TUNNEL_CREATE, [ netlink.U32Attr(L2TP_ATTR_CONN_ID, tunnel_id), netlink.U32Attr(L2TP_ATTR_PEER_CONN_ID, peer_tunnel_id), netlink.U8Attr(L2TP_ATTR_PROTO_VERSION, 3), netlink.U16Attr(L2TP_ATTR_ENCAP_TYPE, L2TP_ENCAPTYPE_UDP), netlink.U32Attr(L2TP_ATTR_FD, socket), ]) msg.send(self.connection) try: self.connection.recv() except OSError, e: if e.errno == errno.EEXIST: # This tunnel identifier is already in use; make sure to remove it from # our pool of assignable tunnel identifiers. raise L2TPTunnelExists(tunnel_id) raise NetlinkError
def session_create(self, tunnel_id, session_id, peer_session_id, name): """ Creates a new ethernet session over the tunnel. :param tunnel_id: Local tunnel identifier :param session_id: Local session identifier :param peer_session_id: Remote peer session identifier :param name: Interface name """ msg = self._create_message( L2TP_CMD_SESSION_CREATE, [ netlink.U32Attr(L2TP_ATTR_CONN_ID, tunnel_id), netlink.U32Attr(L2TP_ATTR_SESSION_ID, session_id), netlink.U32Attr(L2TP_ATTR_PEER_SESSION_ID, peer_session_id), netlink.U16Attr(L2TP_ATTR_PW_TYPE, L2TP_PWTYPE_ETH), # TODO: Cookies. netlink.NulStrAttr(L2TP_ATTR_IFNAME, name), ]) msg.send(self.connection) try: self.connection.recv() except OSError, e: if e.errno == errno.EEXIST: raise L2TPSessionExists(session_id) raise NetlinkError
def destroy_radio(self, radio_id): attrs = [netlink.U32Attr(HWSIM_ATTR_RADIO_ID, radio_id)] msg = netlink.GenlMessage(self._fid, HWSIM_CMD_DESTROY_RADIO, flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK, attrs = attrs) msg.send_and_recv(self._conn)
def session_delete(self, tunnel_id, session_id): """ Deletes an existing session. :param tunnel_id: Local tunnel identifier :param session_id: Local session identifier """ msg = self._create_message(L2TP_CMD_SESSION_DELETE, [ netlink.U32Attr(L2TP_ATTR_CONN_ID, tunnel_id), netlink.U32Attr(L2TP_ATTR_SESSION_ID, session_id), ]) msg.send(self.connection) try: reply = self.connection.recv() except OSError: logger.debug(traceback.format_exc()) logger.warning("Unable to remove tunnel %d session %d!" % (tunnel_id, session_id))
def create_radio(self, n_channels=None): attrs = [] if n_channels: attrs.append(netlink.U32Attr(HWSIM_ATTR_CHANNELS, n_channels)) msg = netlink.GenlMessage(self._fid, HWSIM_CMD_CREATE_RADIO, flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK, attrs = attrs) return msg.send_and_recv(self._conn).ret
def destroy_radio(self, radio_id): try: int(radio_id) attrs = [netlink.U32Attr(HWSIM_ATTR_RADIO_ID, int(radio_id))] except ValueError: attrs = [netlink.NulStrAttr(HWSIM_ATTR_RADIO_NAME, radio_id)] msg = netlink.GenlMessage(self._fid, HWSIM_CMD_DESTROY_RADIO, flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK, attrs = attrs) msg.send_and_recv(self._conn)
def session_modify(self, tunnel_id, session_id, mtu): """ Modifies an existing session. :param tunnel_id: Local tunnel identifier :param session_id: Local session identifier """ msg = self._create_message(L2TP_CMD_SESSION_MODIFY, [ netlink.U32Attr(L2TP_ATTR_CONN_ID, tunnel_id), netlink.U32Attr(L2TP_ATTR_SESSION_ID, session_id), netlink.U16Attr(L2TP_ATTR_MTU, mtu), ]) msg.send(self.connection) try: self.connection.recv() except OSError: logger.debug(traceback.format_exc()) logger.warning("Unable to modify tunnel %d session %d!" % (tunnel_id, session_id))
def create_radio(self, n_channels=None, use_chanctx=False, use_p2p_device=False): attrs = [] if n_channels: attrs.append(netlink.U32Attr(HWSIM_ATTR_CHANNELS, n_channels)) if use_chanctx: attrs.append(netlink.FlagAttr(HWSIM_ATTR_USE_CHANCTX)) if use_p2p_device: attrs.append(netlink.FlagAttr(HWSIM_ATTR_SUPPORT_P2P_DEVICE)) msg = netlink.GenlMessage(self._fid, HWSIM_CMD_CREATE_RADIO, flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK, attrs = attrs) return msg.send_and_recv(self._conn).ret
def create_radio(self, n_channels=None, use_chanctx=False, hwname=None, no_vdev=False): attrs = [] if n_channels: attrs.append(netlink.U32Attr(HWSIM_ATTR_CHANNELS, n_channels)) if use_chanctx: attrs.append(netlink.FlagAttr(HWSIM_ATTR_USE_CHANCTX)) if hwname: attrs.append(netlink.NulStrAttr(HWSIM_ATTR_RADIO_NAME, hwname)) if no_vdev: attrs.append(netlink.FlagAttr(HWSIM_ATTR_NO_VDEV)) msg = netlink.GenlMessage(self._fid, HWSIM_CMD_CREATE_RADIO, flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK, attrs = attrs) return msg.send_and_recv(self._conn).ret
def tunnel_delete(self, tunnel_id): """ Deletes an existing tunnel. :param tunnel_id: Local tunnel identifier """ msg = self._create_message(L2TP_CMD_TUNNEL_DELETE, [ netlink.U32Attr(L2TP_ATTR_CONN_ID, tunnel_id), ]) msg.send(self.connection) try: self.connection.recv() except OSError: logger.debug(traceback.format_exc()) logger.warning("Unable to remove tunnel %d!" % tunnel_id)