def set_field_val(hsf, wc_obj, field, val, process_field=True): """ Set a specific field in a wildcard using pyretic fields. """ def ip2int(ip): assert isinstance(ip, IPv4Network) numeric_ip = 0 for p in str(ip.ip).split('.'): numeric_ip = (numeric_ip << 8) + int(p) return numeric_ip def mac2int(mac): assert isinstance(mac, str) numeric_mac = 0 for p in mac.split(':'): numeric_mac = (numeric_mac << 8) + int(p, 16) return numeric_mac if field in ['srcmac', 'dstmac']: int_val = mac2int(val) if process_field else val set_header_field(hsf, wc_obj, field, int_val, 0) elif field in ['srcip', 'dstip']: int_val = ip2int(val) if process_field else val right_pfx = (32 - val.prefixlen) if process_field else 0 set_header_field(hsf, wc_obj, field, int_val, right_pfx) elif field in ['vlan_offset', 'vlan_nbits', 'vlan_total_stages']: ''' ignore tagging helper fields. For now, we ensure that these fields are irrelevant by sending in a single-stage policy. ''' pass elif not field in ['switch', 'port']: assert "%s_pos" % field in hsf assert "%s_len" % field in hsf set_header_field(hsf, wc_obj, field, val, 0) else: ''' do nothing ''' pass return wc_obj
def set_field_val(hsf, wc_obj, field, val, process_field=True): """ Set a specific field in a wildcard using pyretic fields. """ def ip2int(ip): assert isinstance(ip, IPv4Network) numeric_ip = 0 for p in str(ip.ip).split('.'): numeric_ip = (numeric_ip << 8) + int(p) return numeric_ip def mac2int(mac): assert isinstance(mac, str) numeric_mac = 0 for p in mac.split(':'): numeric_mac = (numeric_mac << 8) + int(p, 16) return numeric_mac if field in ['srcmac', 'dstmac']: int_val = mac2int(val) if process_field else val set_header_field(hsf, wc_obj, field, int_val, 0) elif field in ['srcip', 'dstip']: int_val = ip2int(val) if process_field else val right_pfx = (32 - val.prefixlen) if process_field else 0 set_header_field(hsf, wc_obj, field, int_val, right_pfx) elif not field in ['switch', 'port']: set_header_field(hsf, wc_obj, field, val, 0) else: ''' do nothing ''' pass return wc_obj