# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) # Copyright (c) 2020 Nvidia, Inc. All rights reserved. See COPYING file from libc.stdlib cimport calloc, free from pyverbs.providers.mlx5.mlx5dv_flow cimport Mlx5FlowMatchParameters from pyverbs.base import PyverbsRDMAErrno, PyverbsRDMAError from pyverbs.providers.mlx5.dr_matcher cimport DrMatcher from pyverbs.providers.mlx5.dr_action cimport DrAction from pyverbs.pyverbs_error import PyverbsError cdef class DrRule(PyverbsCM): def __init__(self, DrMatcher matcher, Mlx5FlowMatchParameters value, actions=None): """ Initialize DrRule object over underlying mlx5dv_dr_rule C object. :param matcher: A matcher with the fields to match on :param value: Match parameters with values to match on :param actions: List of actions to perform """ super().__init__() cdef dv.mlx5dv_dr_action**actions_arr actions = [] if actions is None else actions actions_arr = calloc(len(actions), sizeof(dv.mlx5dv_dr_action*)) if actions_arr == NULL: raise PyverbsError('Failed to allocate memory.') for i in range(0, len(actions)): actions_arr[i] = (actions[i]).action self.rule = dv.mlx5dv_dr_rule_create(matcher.matcher, value.params, len(actions), actions_arr) free(actions_arr) if self.rule == NULL: raise PyverbsRDMAErrno('DrRule creation failed.') for i in range(0, len(actions)): (actions[i]).add_ref(self) matcher.add_ref(self) self.dr_matcher = matcher def __dealloc__(self): self.close() cpdef close(self): if self.rule != NULL: if self.logger: self.logger.debug('Closing DrRule.') rc = dv.mlx5dv_dr_rule_destroy(self.rule) if rc: raise PyverbsRDMAError('Failed to destroy DrRule.', rc) self.rule = NULL self.dr_matcher = None