예제 #1
0
 def __enter__(self):
     self.conntrack_handler = nfct.nfct_open(
         nl_constants.NFNL_SUBSYS_CTNETLINK, nl_constants.CONNTRACK)
     if not self.conntrack_handler:
         LOG.critical("Failed to open new conntrack handler")
         raise exceptions.CTZoneExhaustedError()
     return self
예제 #2
0
 def delete_entries(self, entries):
     conntrack = nfct.nfct_new()
     try:
         for entry in entries:
             self._set_attributes(conntrack, entry)
             self._query(nl_constants.NFCT_Q_DESTROY, conntrack)
     except Exception as e:
         LOG.critical("Failed to delete conntrack entries %s", e)
         raise exceptions.CTZoneExhaustedError()
     finally:
         nfct.nfct_destroy(conntrack)
예제 #3
0
 def _find_open_zone(self):
     # call set to dedup because old ports may be mapped to the same zone.
     zones_in_use = sorted(set(self._device_zone_map.values()))
     if not zones_in_use:
         return ZONE_START
     # attempt to increment onto the highest used zone first. if we hit the
     # end, go back and look for any gaps left by removed devices.
     last = zones_in_use[-1]
     if last < MAX_CONNTRACK_ZONES:
         return max(last + 1, ZONE_START)
     for index, used in enumerate(zones_in_use):
         if used - index != ZONE_START:
             # gap found, let's use it!
             return index + ZONE_START
     # conntrack zones exhausted :( :(
     raise exceptions.CTZoneExhaustedError()