def register_for_packet_match(self, handler, priority, expr): """\brief Register a handler for every packet in event matching the passed in expression. The handler will be called with: handler(dpid, in_port, reason, total_frame_len, buffer_id, captured_data) \note For an explanation of these arguments, see the documentation for \note register_for_packet_in. In this case, 'buffer_id' == None if the \note datapath does not have a buffer for the frame. @param handler the handler function @param priority the priority the installed classifier rule should have @param expr the flow match as a dictionary (see comment above). """ e = Packet_expr() for key, val in expr.items(): if key == AP_SRC: field = Packet_expr.AP_SRC val = htons(val) elif key == AP_DST: field = Packet_expr.AP_DST val = htons(val) elif key == DL_VLAN: field = Packet_expr.DL_VLAN val = htons(val) elif key == DL_VLAN_PCP: field = Packet_expr.DL_VLAN_PCP val = val elif key == DL_TYPE: field = Packet_expr.DL_TYPE val = htons(val) elif key == DL_SRC: field = Packet_expr.DL_SRC val = convert_to_eaddr(val) if val == None: raise RuntimeError('invalid ethernet addr') elif key == DL_DST: field = Packet_expr.DL_DST val = convert_to_eaddr(val) if val == None: raise RuntimeError('invalid ethernet addr') elif key == NW_SRC: field = Packet_expr.NW_SRC val = convert_to_ipaddr(val) if val == None: raise RuntimeError('invalid ip addr') elif key == NW_DST: field = Packet_expr.NW_DST val = convert_to_ipaddr(val) if val == None: raise RuntimeError('invalid ip addr') elif key == NW_PROTO: field = Packet_expr.NW_PROTO elif key == TP_SRC: field = Packet_expr.TP_SRC val = htons(val) elif key == TP_DST: field = Packet_expr.TP_DST val = htons(val) elif key == GROUP_SRC: field = Packet_expr.GROUP_SRC val = htonl(val) elif key == GROUP_DST: field = Packet_expr.GROUP_DST val = htonl(val) else: raise RuntimeError('invalid key: %s' % (key,)) if isinstance(val, ethernetaddr): e.set_eth_field(field, val) else: # check for max? if val > UINT32_MAX: raise RuntimeError('value %u exceeds accepted range:' % (val, )) e.set_uint32_field(field, val) return self.ctxt.register_handler_on_match(gen_packet_in_callback(handler), priority, e)
def register_for_packet_match(self, handler, priority, expr): """\brief Register a handler for every packet in event matching the passed in expression. The handler will be called with: handler(dpid, in_port, reason, total_frame_len, buffer_id, captured_data) \note For an explanation of these arguments, see the documentation for \note register_for_packet_in. In this case, 'buffer_id' == None if the \note datapath does not have a buffer for the frame. @param handler the handler function @param priority the priority the installed classifier rule should have @param expr the flow match as a dictionary (see comment above). """ e = Packet_expr() for key, val in expr.items(): if key == AP_SRC: field = Packet_expr.AP_SRC val = htons(val) elif key == AP_DST: field = Packet_expr.AP_DST val = htons(val) elif key == DL_VLAN: field = Packet_expr.DL_VLAN val = htons(val) elif key == DL_VLAN_PCP: field = Packet_expr.DL_VLAN_PCP val = val elif key == DL_TYPE: field = Packet_expr.DL_TYPE val = htons(val) elif key == DL_SRC: field = Packet_expr.DL_SRC val = convert_to_eaddr(val) if val == None: raise RuntimeError('invalid ethernet addr') elif key == DL_DST: field = Packet_expr.DL_DST val = convert_to_eaddr(val) if val == None: raise RuntimeError('invalid ethernet addr') elif key == NW_SRC: field = Packet_expr.NW_SRC val = convert_to_ipaddr(val) if val == None: raise RuntimeError('invalid ip addr') elif key == NW_DST: field = Packet_expr.NW_DST val = convert_to_ipaddr(val) if val == None: raise RuntimeError('invalid ip addr') elif key == NW_PROTO: field = Packet_expr.NW_PROTO elif key == TP_SRC: field = Packet_expr.TP_SRC val = htons(val) elif key == TP_DST: field = Packet_expr.TP_DST val = htons(val) elif key == GROUP_SRC: field = Packet_expr.GROUP_SRC val = htonl(val) elif key == GROUP_DST: field = Packet_expr.GROUP_DST val = htonl(val) else: raise RuntimeError('invalid key: %s' % (key, )) if isinstance(val, ethernetaddr): e.set_eth_field(field, val) else: # check for max? if val > UINT32_MAX: raise RuntimeError('value %u exceeds accepted range:' % (val, )) e.set_uint32_field(field, val) return self.ctxt.register_handler_on_match( gen_packet_in_callback(handler), priority, e)
def register_for_packet_match(self, handler, priority, expr): e = Packet_expr() for key, val in expr.items(): if key == AP_SRC: field = Packet_expr.AP_SRC val = htons(val) elif key == AP_DST: field = Packet_expr.AP_DST val = htons(val) elif key == DL_VLAN: field = Packet_expr.DL_VLAN val = htons(val) elif key == DL_VLAN_PCP: field = Packet_expr.DL_VLAN_PCP val = val elif key == DL_TYPE: field = Packet_expr.DL_TYPE val = htons(val) elif key == DL_SRC: field = Packet_expr.DL_SRC val = convert_to_eaddr(val) if val == None: print 'invalid ethernet addr' return False elif key == DL_DST: field = Packet_expr.DL_DST val = convert_to_eaddr(val) if val == None: print 'invalid ethernet addr' return False elif key == NW_SRC: field = Packet_expr.NW_SRC val = convert_to_ipaddr(val) if val == None: print 'invalid ip addr' return False elif key == NW_DST: field = Packet_expr.NW_DST val = convert_to_ipaddr(val) if val == None: print 'invalid ip addr' return False elif key == NW_PROTO: field = Packet_expr.NW_PROTO elif key == TP_SRC: field = Packet_expr.TP_SRC val = htons(val) elif key == TP_DST: field = Packet_expr.TP_DST val = htons(val) elif key == GROUP_SRC: field = Packet_expr.GROUP_SRC val = htonl(val) elif key == GROUP_DST: field = Packet_expr.GROUP_DST val = htonl(val) else: print 'invalid key', key return False if isinstance(val, ethernetaddr): e.set_eth_field(field, val) else: # check for max? if val > UINT32_MAX: print 'value %u exceeds accepted range', val return False e.set_uint32_field(field, val) return self.ctxt.register_handler_on_match(gen_packet_in_cb(handler), priority, e)