Commit 5604fc8e authored by Yonghong Song's avatar Yonghong Song

use 64bit ulonglong to represent mac address

Signed-off-by: default avatarYonghong Song <yhs@plumgrid.com>
parent 77b26e1a
...@@ -15,8 +15,10 @@ typedef struct bpf_dest { ...@@ -15,8 +15,10 @@ typedef struct bpf_dest {
u32 port_id; u32 port_id;
} bpf_dest_t; } bpf_dest_t;
// use u64 to represent eth_addr.
// maintain the structure though to indicate the semantics
typedef struct eth_addr { typedef struct eth_addr {
u8 addr[6]; u64 addr;
} eth_addr_t; } eth_addr_t;
// Program table definitions for tail calls // Program table definitions for tail calls
...@@ -115,7 +117,6 @@ static int br_common(struct __sk_buff *skb, int which_br) { ...@@ -115,7 +117,6 @@ static int br_common(struct __sk_buff *skb, int which_br) {
u32 tx_port_id; u32 tx_port_id;
bpf_dest_t *dest_p; bpf_dest_t *dest_p;
u32 index, *rtrif_p; u32 index, *rtrif_p;
u64 mac_addr;
if (skb->tc_index == 0) { if (skb->tc_index == 0) {
skb->tc_index = 1; skb->tc_index = 1;
...@@ -128,11 +129,10 @@ static int br_common(struct __sk_buff *skb, int which_br) { ...@@ -128,11 +129,10 @@ static int br_common(struct __sk_buff *skb, int which_br) {
BEGIN(ethernet); BEGIN(ethernet);
PROTO(ethernet) { PROTO(ethernet) {
mac_addr = bpf_htonll(ethernet->dst); dmac.addr = ethernet->dst;
_memcpy(dmac.addr, (u8 *)&mac_addr + 2, 6);
if (meta.prog_id != 0) { if (meta.prog_id != 0) {
/* send to the router */ /* send to the router */
if (dmac.addr[0] & dmac.addr[1] & dmac.addr[2] & dmac.addr[3] & dmac.addr[4] & dmac.addr[5] == 0xff) { if (dmac.addr == 0xffffffffffffULL) {
index = 0; index = 0;
if (which_br == 1) if (which_br == 1)
rtrif_p = br1_rtr.lookup(&index); rtrif_p = br1_rtr.lookup(&index);
...@@ -181,8 +181,7 @@ static int br_common(struct __sk_buff *skb, int which_br) { ...@@ -181,8 +181,7 @@ static int br_common(struct __sk_buff *skb, int which_br) {
__u32 ifindex = *rtrif_p; __u32 ifindex = *rtrif_p;
eth_addr_t smac; eth_addr_t smac;
mac_addr = bpf_htonll(ethernet->src); smac.addr = ethernet->src;
_memcpy(smac.addr, (u8 *)&mac_addr + 2, 6);
if (which_br == 1) if (which_br == 1)
br1_mac_ifindex.update(&smac, &ifindex); br1_mac_ifindex.update(&smac, &ifindex);
else else
......
...@@ -74,6 +74,7 @@ from time import sleep ...@@ -74,6 +74,7 @@ from time import sleep
from unittest import main, TestCase from unittest import main, TestCase
import subprocess import subprocess
import commands import commands
import struct
arg1 = sys.argv.pop(1) arg1 = sys.argv.pop(1)
...@@ -82,12 +83,7 @@ class Bpf_Dest(Structure): ...@@ -82,12 +83,7 @@ class Bpf_Dest(Structure):
("port_id", c_uint)] ("port_id", c_uint)]
class Eth_Addr(Structure): class Eth_Addr(Structure):
_fields_ = [("addr0", c_ubyte), _fields_ = [("addr", c_ulonglong)]
("addr1", c_ubyte),
("addr2", c_ubyte),
("addr3", c_ubyte),
("addr4", c_ubyte),
("addr5", c_ubyte)]
class TestBPFSocket(TestCase): class TestBPFSocket(TestCase):
def setup_vm_ns(self, ns, veth_in, veth_out): def setup_vm_ns(self, ns, veth_in, veth_out):
...@@ -150,12 +146,10 @@ class TestBPFSocket(TestCase): ...@@ -150,12 +146,10 @@ class TestBPFSocket(TestCase):
self.br1_dest = b.get_table("br1_dest", c_uint, Bpf_Dest) self.br1_dest = b.get_table("br1_dest", c_uint, Bpf_Dest)
self.br1_mac = b.get_table("br1_mac", Eth_Addr, c_uint) self.br1_mac = b.get_table("br1_mac", Eth_Addr, c_uint)
self.br1_rtr = b.get_table("br1_rtr", c_uint, c_uint) self.br1_rtr = b.get_table("br1_rtr", c_uint, c_uint)
self.br1_mac_ifindex = b.get_table("br1_mac_ifindex", Eth_Addr, c_uint)
self.br2_dest = b.get_table("br2_dest", c_uint, Bpf_Dest) self.br2_dest = b.get_table("br2_dest", c_uint, Bpf_Dest)
self.br2_mac = b.get_table("br2_mac", Eth_Addr, c_uint) self.br2_mac = b.get_table("br2_mac", Eth_Addr, c_uint)
self.br2_rtr = b.get_table("br2_rtr", c_uint, c_uint) self.br2_rtr = b.get_table("br2_rtr", c_uint, c_uint)
self.br2_mac_ifindex = b.get_table("br2_mac_ifindex", Eth_Addr, c_uint)
def connect_ports(self, prog_id_pem, prog_id_br, curr_pem_pid, curr_br_pid, def connect_ports(self, prog_id_pem, prog_id_br, curr_pem_pid, curr_br_pid,
ip, br_dest_map, br_mac_map, ip, br_dest_map, br_mac_map,
...@@ -167,9 +161,7 @@ class TestBPFSocket(TestCase): ...@@ -167,9 +161,7 @@ class TestBPFSocket(TestCase):
ifindex = ip.link_lookup(ifname=ns_eth_out)[0] ifindex = ip.link_lookup(ifname=ns_eth_out)[0]
self.pem_port.update(c_uint(curr_pem_pid), c_uint(ifindex)) self.pem_port.update(c_uint(curr_pem_pid), c_uint(ifindex))
self.pem_ifindex.update(c_uint(ifindex), c_uint(curr_pem_pid)) self.pem_ifindex.update(c_uint(ifindex), c_uint(curr_pem_pid))
mac1 = vm_mac.split(':') mac_addr = Eth_Addr(struct.unpack('!Q', "\0\0" + vm_mac.replace(':', '').decode('hex'))[0])
mac_addr = Eth_Addr(int(mac1[0], 16), int(mac1[1], 16), int(mac1[2], 16),
int(mac1[3], 16), int(mac1[4], 16), int(mac1[5], 16))
br_mac_map.update(mac_addr, c_uint(curr_br_pid)) br_mac_map.update(mac_addr, c_uint(curr_br_pid))
def attach_filter(self, ip, ifname, fd, name): def attach_filter(self, ip, ifname, fd, name):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment