raw: separate src and dst addresses
In order to be able to convert to a generic address struct, separate source and destination address into separate fields. Signed-off-by: Jiri Benc <jbenc@redhat.com>master
parent
8c02ae53f2
commit
3d22154299
13
ether.h
13
ether.h
|
@ -26,25 +26,24 @@
|
||||||
#define PTP_DST_MAC 0x01, 0x1B, 0x19, 0x00, 0x00, 0x00
|
#define PTP_DST_MAC 0x01, 0x1B, 0x19, 0x00, 0x00, 0x00
|
||||||
#define P2P_DST_MAC 0x01, 0x80, 0xC2, 0x00, 0x00, 0x0E
|
#define P2P_DST_MAC 0x01, 0x80, 0xC2, 0x00, 0x00, 0x0E
|
||||||
|
|
||||||
struct eth_addr {
|
typedef uint8_t eth_addr[MAC_LEN];
|
||||||
uint8_t dst[MAC_LEN];
|
|
||||||
uint8_t src[MAC_LEN];
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct eth_hdr {
|
struct eth_hdr {
|
||||||
struct eth_addr mac;
|
eth_addr dst;
|
||||||
|
eth_addr src;
|
||||||
uint16_t type;
|
uint16_t type;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
#define VLAN_HLEN 4
|
#define VLAN_HLEN 4
|
||||||
|
|
||||||
struct vlan_hdr {
|
struct vlan_hdr {
|
||||||
struct eth_addr mac;
|
eth_addr dst;
|
||||||
|
eth_addr src;
|
||||||
uint16_t tpid;
|
uint16_t tpid;
|
||||||
uint16_t tci;
|
uint16_t tci;
|
||||||
uint16_t type;
|
uint16_t type;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
#define OFF_ETYPE sizeof(struct eth_addr)
|
#define OFF_ETYPE (2 * sizeof(eth_addr))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
22
raw.c
22
raw.c
|
@ -45,8 +45,9 @@
|
||||||
|
|
||||||
struct raw {
|
struct raw {
|
||||||
struct transport t;
|
struct transport t;
|
||||||
struct eth_addr ptp_addr;
|
eth_addr src_addr;
|
||||||
struct eth_addr p2p_addr;
|
eth_addr ptp_addr;
|
||||||
|
eth_addr p2p_addr;
|
||||||
int vlan;
|
int vlan;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -190,14 +191,12 @@ static int raw_open(struct transport *t, const char *name,
|
||||||
struct raw *raw = container_of(t, struct raw, t);
|
struct raw *raw = container_of(t, struct raw, t);
|
||||||
int efd, gfd;
|
int efd, gfd;
|
||||||
|
|
||||||
memcpy(raw->ptp_addr.dst, ptp_dst_mac, MAC_LEN);
|
memcpy(raw->ptp_addr, ptp_dst_mac, MAC_LEN);
|
||||||
memcpy(raw->p2p_addr.dst, p2p_dst_mac, MAC_LEN);
|
memcpy(raw->p2p_addr, p2p_dst_mac, MAC_LEN);
|
||||||
|
|
||||||
if (sk_interface_macaddr(name, raw->ptp_addr.src, MAC_LEN))
|
if (sk_interface_macaddr(name, raw->src_addr, MAC_LEN))
|
||||||
goto no_mac;
|
goto no_mac;
|
||||||
|
|
||||||
memcpy(raw->p2p_addr.src, raw->ptp_addr.src, MAC_LEN);
|
|
||||||
|
|
||||||
efd = open_socket(name, 1);
|
efd = open_socket(name, 1);
|
||||||
if (efd < 0)
|
if (efd < 0)
|
||||||
goto no_event;
|
goto no_event;
|
||||||
|
@ -277,9 +276,10 @@ static int raw_send(struct transport *t, struct fdarray *fda, int event, int pee
|
||||||
|
|
||||||
hdr = (struct eth_hdr *) ptr;
|
hdr = (struct eth_hdr *) ptr;
|
||||||
if (peer)
|
if (peer)
|
||||||
memcpy(&hdr->mac, &raw->p2p_addr, sizeof(hdr->mac));
|
memcpy(&hdr->dst, &raw->p2p_addr, MAC_LEN);
|
||||||
else
|
else
|
||||||
memcpy(&hdr->mac, &raw->ptp_addr, sizeof(hdr->mac));
|
memcpy(&hdr->dst, &raw->ptp_addr, MAC_LEN);
|
||||||
|
memcpy(&hdr->src, &raw->src_addr, MAC_LEN);
|
||||||
|
|
||||||
hdr->type = htons(ETH_P_1588);
|
hdr->type = htons(ETH_P_1588);
|
||||||
|
|
||||||
|
@ -303,14 +303,14 @@ static void raw_release(struct transport *t)
|
||||||
static int raw_physical_addr(struct transport *t, uint8_t *addr)
|
static int raw_physical_addr(struct transport *t, uint8_t *addr)
|
||||||
{
|
{
|
||||||
struct raw *raw = container_of(t, struct raw, t);
|
struct raw *raw = container_of(t, struct raw, t);
|
||||||
memcpy(addr, raw->ptp_addr.src, MAC_LEN);
|
memcpy(addr, raw->src_addr, MAC_LEN);
|
||||||
return MAC_LEN;
|
return MAC_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_protocol_addr(struct transport *t, uint8_t *addr)
|
static int raw_protocol_addr(struct transport *t, uint8_t *addr)
|
||||||
{
|
{
|
||||||
struct raw *raw = container_of(t, struct raw, t);
|
struct raw *raw = container_of(t, struct raw, t);
|
||||||
memcpy(addr, raw->ptp_addr.src, MAC_LEN);
|
memcpy(addr, raw->src_addr, MAC_LEN);
|
||||||
return MAC_LEN;
|
return MAC_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue