> WRT multicast TX, this was indeed implemented on the BEE2 (I recall playing
> with this some years ago) by Jouko in 2009. Emails predate archive, from 05
> Feb 2009. I'm not sure what happened to this patch, but it's simple enough to
> re-add.
Just dug up the email. Correction and apologies, this was added by Jan Wagner!
Begin forwarded message:
> From: Jan Wagner <[email protected]>
> Date: 05 February 2009 13:49:28 SAST
> To: [email protected]
> Subject: [casper] patch: tengbe pcore multicast support
>
> Hi,
>
> I added UDP multicast sending support to the 10G IP core.
>
> Now all 224.0.0.0 through 239.255.255.255 are sent correctly with the
> corresponding multicast MAC.
>
> Earlier these UDP packets would have incorrectly been routed through the
> gateway MAC (and e.g. our HP6400cl and Summit X450 did not detect and convert
> the header multicast-IP target MAC from the wrong into the correct multicast
> MAC upon switching the packet to another 10G port).
>
> The "patch" is attached. It is a diff to "some" version of the 10G core, not
> the SVN, but the patch is rather short and you can apply it manually if it
> doesn't work directly.
>
> Maybe you can commit the changes to the ibob/roach SVN?
>
> By the way, there is one remaining TODO: I added provisions for TTL
> ('tx_ip_ttl'). Default TTL is 0xFF, but for multicast 0x01 is preferrable.
> The magic value X"8412" in the tx_ip_checksum_fixed_0 sum needs to be changed
> to include 'tx_ip_ttl'. I couldn't make sense of the X"8412" so the 0x01 TTL
> is not supported by the patch yet. Maybe somebody can figure out the
> computation?
>
> - Jan
>
> --
> ****************************************************
> Helsinki University of Technology
> Dept. of Metsähovi Radio Observatory
> http://www.metsahovi.fi/~jwagner/
> Work +358-9-428320-36--- original/ten_gb_eth.vhd 2008-12-13 23:09:44.000000000 +0200
+++ ten_gb_eth.vhd 2009-02-05 13:23:49.000000000 +0200
@@ -179,6 +179,7 @@ architecture ten_gb_eth_arch of ten_gb_e
type tx_fsm_state is (
IDLE,
SEND_HDR_WORD_1,
+ SEND_HDR_WORD_1_MULTICAST,
SEND_HDR_WORD_2,
SEND_HDR_WORD_3,
SEND_HDR_WORD_4,
@@ -592,6 +593,7 @@ architecture ten_gb_eth_arch of ten_gb_e
signal tx_addrfifo_full : std_logic;
signal tx_addrfifo_write_data : std_logic_vector(63
downto 0);
signal tx_data_count : std_logic_vector(15
downto 0) := (others => '0');
+ signal tx_ip_ttl : std_logic_vector( 7
downto 0) := (others => '1');
signal tx_ip_length : std_logic_vector(15
downto 0) := (others => '0');
signal tx_udp_length : std_logic_vector(15
downto 0) := (others => '0');
signal tx_ip_checksum_0 : std_logic_vector(17
downto 0) := (others => '0');
@@ -937,7 +938,13 @@ begin
-- if the address fifo has anything for
us and the local parameters are valid, we can safely assume that there is also
data in the buffer and start a frame transmission
if tx_addrfifo_valid = '1' and
local_valid_retimed = '1' then
-- the request for the MAC is
done by combinatorial logic
+ if tx_addrfifo_read_data(31 downto 28) = "1110" then
+ tx_ip_ttl <= X"FF";
+ tx_state <= SEND_HDR_WORD_1_MULTICAST;
+ else
+ tx_ip_ttl <= X"FF";
tx_state <=
SEND_HDR_WORD_1;
+ end if;
mac_tx_data_valid <= "11111111";
end if;
-- if the current cpu buffer is valid,
we can start a frame transmission
@@ -946,6 +953,11 @@ begin
tx_state <=
SEND_CPU_DATA;
mac_tx_data_valid <= "11111111";
end if;
+ when SEND_HDR_WORD_1_MULTICAST =>
+ -- if the MAC is ready then we can send
the rest of the header and the data
+ if mac_tx_ack = '1' then
+ tx_state <=
SEND_HDR_WORD_2;
+ end if;
when SEND_HDR_WORD_1 =>
-- if the MAC is ready then we can send
the rest of the header and the data
if mac_tx_ack = '1' then
@@ -1046,12 +1058,17 @@ with tx_state select mac_tx_data <=
tx_arp_cache_read_data(23 downto 16) &
tx_arp_cache_read_data(31 downto 24) &
tx_arp_cache_read_data(39 downto 32) &
tx_arp_cache_read_data(47 downto 40)
when SEND_HDR_WORD_1,
+ local_mac(39 downto 32) & local_mac(47 downto 40) &
+ tx_addrfifo_read_data(7 downto 0) & tx_addrfifo_read_data(15
downto 8) &
+ "0" & tx_addrfifo_read_data(22 downto 16) &
+ "01011110" & "00000000" & "00000001"
+ when SEND_HDR_WORD_1_MULTICAST,
X"00" & X"45" &
X"00" & X"08" &
local_mac(7 downto 0) & local_mac(15 downto 8) &
local_mac(23 downto 16) & local_mac(31 downto 24)
when SEND_HDR_WORD_2,
- X"11" & X"FF" &
+ X"11" & tx_ip_ttl & -- 0x11=UDP, 0xFF=TTL
X"00" & X"40" &
X"00" & X"00" &
tx_ip_length(7 downto 0) & tx_ip_length(15 downto 8)
@@ -1089,7 +1106,7 @@ with tx_state select mac_tx_data <=
(others => '0')
when others;
-- compute the fixed part of the ip checksum (1's complement logic)
-tx_ip_checksum_fixed_0 <= ("00" & X"8412"
)+
+tx_ip_checksum_fixed_0 <= ("00" & X"8412"
)+ -- TODO: X"8412"==TTL 0xFF, what for TTL of 0x01?
("00" & local_ip(31 downto 16)
)+
("00" & local_ip(15 downto 0)
);
tx_ip_checksum_fixed_1 <= ("0" & tx_ip_checksum_fixed_0(15 downto 0)
)+