void gc_mark( VALUE value ) { if( !IS_PTR_VALUE(value) ) { return; } if( FLAG_TEST( value, FLAG_GC_MARK ) ) { return; } if( RANY(value)->as.free.flags == 0 ) { return; } FLAG_SET( value, FLAG_GC_MARK ); gc_mark( R_BASIC(value)->klass ); switch(VALUE_TYPE(value)) { case TYPE_STRING: break; case TYPE_ARRAY: { int i; for( i=0; i< R_ARRAY(value)->len; ++i ) { gc_mark( R_ARRAY(value)->ptr[i] ); } break; } case TYPE_CLASS: gc_mark( (VALUE)(R_CLASS(value)->super) ); var_tbl_mark( R_CLASS(value)->ival_tbl ); var_tbl_mark( R_CLASS(value)->method_tbl ); break; case TYPE_OBJECT: gc_mark( (VALUE)(R_BASIC(value)->klass) ); var_tbl_mark( R_OBJECT(value)->ival_tbl ); break; case TYPE_METHOD: break; default: rabbit_bug("(GC MARK)未対応型のオブジェクトが送られてきました(type %d)", VALUE_TYPE(value) ); } }
void pfilter_init_vlan(char *fname) { pfilter_new(); pfilter_nop(); /* * This is a simplified set, for development, * to allow me write vlan support in software. * Mostly a subset of above set */ /* Local frame, using fake MAC: 12:34:56:78:9a:bc */ pfilter_cmp(0, 0x1234, 0xffff, MOV, FRAME_MAC_OK); pfilter_cmp(1, 0x5678, 0xffff, AND, FRAME_MAC_OK); pfilter_cmp(2, 0x9abc, 0xffff, AND, FRAME_MAC_OK); /* Broadcast frame */ pfilter_cmp(0, 0xffff, 0xffff, MOV, FRAME_BROADCAST); pfilter_cmp(1, 0xffff, 0xffff, AND, FRAME_BROADCAST); pfilter_cmp(2, 0xffff, 0xffff, AND, FRAME_BROADCAST); /* PTP UDP (end to end: 01:00:5e:00:01:81 224.0.1.129) */ pfilter_cmp(0, 0x0100, 0xffff, MOV, FRAME_MAC_PTP); pfilter_cmp(1, 0x5e00, 0xffff, AND, FRAME_MAC_PTP); pfilter_cmp(2, 0x0181, 0xffff, MOV, R_TMP); /* PTP UDP (peer-to-p: 01:00:5e:00:00:6b 224.0.0.197) */ pfilter_cmp(2, 0x006b, 0xffff, OR, R_TMP); pfilter_logic3(FRAME_MAC_OK, FRAME_MAC_PTP, AND, R_TMP, OR, FRAME_MAC_OK); /* Untagged is dropped. */ pfilter_cmp(6, 0x8100, 0xffff, MOV, R_TMP); pfilter_logic2(R_DROP, R_TMP, NOT, R_ZERO); /* Compare with our vlan (fake number 0xaaa) */ pfilter_cmp(7, 0x0aaa, 0x0fff, MOV, FRAME_OUR_VLAN); /* Identify some Ethertypes used later -- type latency is 0xcafe */ pfilter_cmp(8, 0x88f7, 0xffff, MOV, FRAME_TYPE_PTP2); pfilter_cmp(8, 0xcafe, 0xffff, OR, FRAME_TYPE_PTP2); pfilter_cmp(8, 0x0800, 0xffff, MOV, FRAME_TYPE_IPV4); pfilter_cmp(8, 0x0806, 0xffff, MOV, FRAME_TYPE_ARP); /* Loose match: keep all bcast, all our mac and all ptp ... */ pfilter_logic3(FRAME_FOR_CPU, FRAME_MAC_OK, OR, FRAME_BROADCAST, OR, FRAME_TYPE_PTP2); /* .... but only for our current VLAN */ pfilter_logic2(R_CLASS(0), FRAME_FOR_CPU, AND, FRAME_OUR_VLAN); /* * And route these build-time selected vlans to fabric 7 and 6. * Class 7 is etherbone and class 6 is streamer or nic (or whatever). * We get all broadcast and all frames for our mac. * * We reuse FRAME_OUR_VLAN, even if it's not OUR as in "this CPU" */ pfilter_logic2(R_TMP, FRAME_MAC_OK, OR, FRAME_BROADCAST); pfilter_cmp(7, CONFIG_VLAN_1_FOR_CLASS7, 0x0fff, MOV, FRAME_OUR_VLAN); pfilter_cmp(7, CONFIG_VLAN_2_FOR_CLASS7, 0x0fff, OR, FRAME_OUR_VLAN); pfilter_logic2(R_CLASS(7), R_TMP, AND, FRAME_OUR_VLAN); pfilter_cmp(7, CONFIG_VLAN_FOR_CLASS6, 0x0fff, MOV, FRAME_OUR_VLAN); pfilter_logic2(R_CLASS(6), R_TMP, AND, FRAME_OUR_VLAN); pfilter_output(fname); }
void pfilter_init_novlan(char *fname) { pfilter_new(); pfilter_nop(); /* * Make three sets of comparisons over the destination address. * After these instructions, the whole Eth header is there */ /* Local frame, using fake MAC: 12:34:56:78:9a:bc */ pfilter_cmp(0, 0x1234, 0xffff, MOV, FRAME_MAC_OK); pfilter_cmp(1, 0x5678, 0xffff, AND, FRAME_MAC_OK); pfilter_cmp(2, 0x9abc, 0xffff, AND, FRAME_MAC_OK); /* Broadcast frame */ pfilter_cmp(0, 0xffff, 0xffff, MOV, FRAME_BROADCAST); pfilter_cmp(1, 0xffff, 0xffff, AND, FRAME_BROADCAST); pfilter_cmp(2, 0xffff, 0xffff, AND, FRAME_BROADCAST); /* PTP UDP (end to end: 01:00:5e:00:01:81 224.0.1.129) */ pfilter_cmp(0, 0x0100, 0xffff, MOV, FRAME_MAC_PTP); pfilter_cmp(1, 0x5e00, 0xffff, AND, FRAME_MAC_PTP); pfilter_cmp(2, 0x0181, 0xffff, MOV, R_TMP); /* PTP UDP (peer-to-p: 01:00:5e:00:00:6b 224.0.0.197) */ pfilter_cmp(2, 0x006b, 0xffff, OR, R_TMP); pfilter_logic3(FRAME_MAC_OK, FRAME_MAC_PTP, AND, R_TMP, OR, FRAME_MAC_OK); /* Tagged is dropped. We'll invert the check in the vlan rule-set */ pfilter_cmp(6, 0x8100, 0xffff, MOV, R_TMP); pfilter_logic2(R_DROP, R_TMP, MOV, R_ZERO); /* Identify some Ethertypes used later -- type latency is 0xcafe */ pfilter_cmp(6, 0x88f7, 0xffff, MOV, FRAME_TYPE_PTP2); pfilter_cmp(6, 0xcafe, 0xffff, OR, FRAME_TYPE_PTP2); pfilter_cmp(6, 0x0800, 0xffff, MOV, FRAME_TYPE_IPV4); pfilter_cmp(6, 0x0806, 0xffff, MOV, FRAME_TYPE_ARP); /* Mark one bits for ip-valid (unicast or broadcast) */ pfilter_logic3(FRAME_IP_OK, FRAME_BROADCAST, OR, FRAME_MAC_OK, AND, FRAME_TYPE_IPV4); /* Ethernet = 14 bytes, Offset to type in IP: 8 bytes = 22/2 = 11 */ pfilter_cmp(11, 0x0001, 0x00ff, MOV, FRAME_ICMP); pfilter_cmp(11, 0x0011, 0x00ff, MOV, FRAME_UDP); pfilter_logic2(FRAME_UDP, FRAME_UDP, AND, FRAME_IP_OK); /* For CPU: arp or icmp unicast or ptp (or latency) */ pfilter_logic2(FRAME_FOR_CPU, FRAME_TYPE_ARP, OR, FRAME_TYPE_PTP2); pfilter_logic3(FRAME_FOR_CPU, FRAME_IP_OK, AND, FRAME_ICMP, OR, FRAME_FOR_CPU); /* Now look in UDP ports: at offset 18 (14 + 20 + 8 = 36) */ pfilter_cmp(18, 0x0000, 0xff00, MOV, PORT_UDP_HOST); /* ports 0-255 */ pfilter_cmp(18, 0x0100, 0xff00, OR, PORT_UDP_HOST); /* ports 256-511 */ /* The CPU gets those ports in a proper UDP frame, plus the previous selections */ pfilter_logic3(R_CLASS(0), FRAME_UDP, AND, PORT_UDP_HOST, OR, FRAME_FOR_CPU); /* Etherbone is UDP at port 0xebd0, let's "or" in the last move */ pfilter_cmp(18, 0xebd0, 0xffff, MOV, PORT_UDP_ETHERBONE); /* and now copy out fabric selections: 7 etherbone, 6 for anything else */ pfilter_logic2(R_CLASS(7), FRAME_UDP, AND, PORT_UDP_ETHERBONE); pfilter_logic2(R_CLASS(6), FRAME_UDP, NAND, PORT_UDP_ETHERBONE); /* * Note that earlier we used to be more strict in ptp ethtype (only proper multicast), * but since we want to accept peer-delay sooner than later, we'd better avoid the checks */ /* * Also, please note that "streamer" ethtype 0xdbff and "etherbone" udp port * 0xebd0 go to the fabric by being part of the "anything else" choice". */ pfilter_output(fname); }