コード例 #1
0
ファイル: memory.c プロジェクト: hinovana/rabbitlang
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) );
	}

}
コード例 #2
0
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);
}
コード例 #3
0
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);

}