blob: e913c00ed688714a8dfbd9716568ccea74b25b5e [file]
# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
# Copyright (c) 2020 Nvidia, Inc. All rights reserved. See COPYING file
from pyverbs.base import PyverbsRDMAErrno, PyverbsRDMAError
from pyverbs.providers.mlx5.dr_matcher import DrMatcher
from pyverbs.providers.mlx5.dr_domain cimport DrDomain
from pyverbs.providers.mlx5.dr_action cimport DrAction
from pyverbs.pyverbs_error import PyverbsError
from pyverbs.base cimport close_weakrefs
import weakref
cdef class DrTable(PyverbsCM):
def __init__(self, DrDomain domain, level):
"""
Initialize DrTable object over underlying mlx5dv_dr_table C object.
:param domain: Domain object
:param level: Table level
"""
super().__init__()
self.table = dv.mlx5dv_dr_table_create(domain.domain, level)
if self.table == NULL:
raise PyverbsRDMAErrno('DrTable creation failed.')
domain.add_ref(self)
self.dr_domain = domain
self.dr_matchers = weakref.WeakSet()
self.dr_actions = weakref.WeakSet()
cdef add_ref(self, obj):
if isinstance(obj, DrMatcher):
self.dr_matchers.add(obj)
elif isinstance(obj, DrAction):
self.dr_actions.add(obj)
else:
raise PyverbsError('Unrecognized object type')
def __dealloc__(self):
self.close()
cpdef close(self):
if self.table != NULL:
if self.logger:
self.logger.debug('Closing DrTable.')
close_weakrefs([self.dr_matchers, self.dr_actions])
rc = dv.mlx5dv_dr_table_destroy(self.table)
if rc:
raise PyverbsRDMAError('Failed to destroy DrTable.', rc)
self.table = NULL
self.dr_domain = None
self.dr_actions = None