Commit 38cc5d62 authored by Teng Qin's avatar Teng Qin

Use bpf_get_first_key in Python API

parent e0f347a1
...@@ -69,6 +69,8 @@ lib.bpf_table_leaf_sscanf.argtypes = [ct.c_void_p, ct.c_ulonglong, ...@@ -69,6 +69,8 @@ lib.bpf_table_leaf_sscanf.argtypes = [ct.c_void_p, ct.c_ulonglong,
# keep in sync with libbpf.h # keep in sync with libbpf.h
lib.bpf_get_next_key.restype = ct.c_int lib.bpf_get_next_key.restype = ct.c_int
lib.bpf_get_next_key.argtypes = [ct.c_int, ct.c_void_p, ct.c_void_p] lib.bpf_get_next_key.argtypes = [ct.c_int, ct.c_void_p, ct.c_void_p]
lib.bpf_get_first_key.restype = ct.c_int
lib.bpf_get_first_key.argtypes = [ct.c_int, ct.c_void_p, ct.c_uint]
lib.bpf_lookup_elem.restype = ct.c_int lib.bpf_lookup_elem.restype = ct.c_int
lib.bpf_lookup_elem.argtypes = [ct.c_int, ct.c_void_p, ct.c_void_p] lib.bpf_lookup_elem.argtypes = [ct.c_int, ct.c_void_p, ct.c_void_p]
lib.bpf_update_elem.restype = ct.c_int lib.bpf_update_elem.restype = ct.c_int
......
...@@ -245,25 +245,15 @@ class TableBase(MutableMapping): ...@@ -245,25 +245,15 @@ class TableBase(MutableMapping):
self[k] = self.Leaf() self[k] = self.Leaf()
def __iter__(self): def __iter__(self):
return TableBase.Iter(self, self.Key) return TableBase.Iter(self)
def iter(self): return self.__iter__() def iter(self): return self.__iter__()
def keys(self): return self.__iter__() def keys(self): return self.__iter__()
class Iter(object): class Iter(object):
def __init__(self, table, keytype): def __init__(self, table):
self.Key = keytype
self.table = table self.table = table
k = self.Key() self.key = None
kp = ct.pointer(k)
# if 0 is a valid key, try a few alternatives
if k in table:
ct.memset(kp, 0xff, ct.sizeof(k))
if k in table:
ct.memset(kp, 0x55, ct.sizeof(k))
if k in table:
raise Exception("Unable to allocate iterator")
self.key = k
def __iter__(self): def __iter__(self):
return self return self
def __next__(self): def __next__(self):
...@@ -275,10 +265,17 @@ class TableBase(MutableMapping): ...@@ -275,10 +265,17 @@ class TableBase(MutableMapping):
def next(self, key): def next(self, key):
next_key = self.Key() next_key = self.Key()
next_key_p = ct.pointer(next_key) next_key_p = ct.pointer(next_key)
if key is None:
res = lib.bpf_get_first_key(self.map_fd,
ct.cast(next_key_p, ct.c_void_p),
ct.sizeof(self.Key))
else:
key_p = ct.pointer(key) key_p = ct.pointer(key)
res = lib.bpf_get_next_key(self.map_fd, res = lib.bpf_get_next_key(self.map_fd,
ct.cast(key_p, ct.c_void_p), ct.cast(key_p, ct.c_void_p),
ct.cast(next_key_p, ct.c_void_p)) ct.cast(next_key_p, ct.c_void_p))
if res < 0: if res < 0:
raise StopIteration() raise StopIteration()
return next_key return next_key
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment