1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/**
* @file transport.c
* @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <arpa/inet.h>
#include "transport.h"
#include "transport_private.h"
#include "raw.h"
#include "udp.h"
#include "udp6.h"
#include "uds.h"
int transport_close(struct transport *t, struct fdarray *fda)
{
return t->close(t, fda);
}
int transport_open(struct transport *t, struct interface *iface,
struct fdarray *fda, enum timestamp_type tt)
{
return t->open(t, iface, fda, tt);
}
int transport_recv(struct transport *t, int fd, struct ptp_message *msg)
{
return t->recv(t, fd, msg, sizeof(msg->data), &msg->address, &msg->hwts);
}
int transport_send(struct transport *t, struct fdarray *fda,
enum transport_event event, struct ptp_message *msg)
{
int len = ntohs(msg->header.messageLength);
return t->send(t, fda, event, 0, msg, len, NULL, &msg->hwts);
}
int transport_peer(struct transport *t, struct fdarray *fda,
enum transport_event event, struct ptp_message *msg)
{
int len = ntohs(msg->header.messageLength);
return t->send(t, fda, event, 1, msg, len, NULL, &msg->hwts);
}
int transport_sendto(struct transport *t, struct fdarray *fda,
enum transport_event event, struct ptp_message *msg)
{
int len = ntohs(msg->header.messageLength);
return t->send(t, fda, event, 0, msg, len, &msg->address, &msg->hwts);
}
int transport_txts(struct fdarray *fda,
struct ptp_message *msg)
{
int cnt, len = ntohs(msg->header.messageLength);
struct hw_timestamp *hwts = &msg->hwts;
unsigned char pkt[1600];
cnt = sk_receive(fda->fd[FD_EVENT], pkt, len, NULL, hwts, MSG_ERRQUEUE);
return cnt > 0 ? 0 : cnt;
}
int transport_physical_addr(struct transport *t, uint8_t *addr)
{
if (t->physical_addr) {
return t->physical_addr(t, addr);
}
return 0;
}
int transport_protocol_addr(struct transport *t, uint8_t *addr)
{
if (t->protocol_addr) {
return t->protocol_addr(t, addr);
}
return 0;
}
enum transport_type transport_type(struct transport *t)
{
return t->type;
}
struct transport *transport_create(struct config *cfg,
enum transport_type type)
{
struct transport *t = NULL;
switch (type) {
case TRANS_UDS:
t = uds_transport_create();
break;
case TRANS_UDP_IPV4:
t = udp_transport_create();
break;
case TRANS_UDP_IPV6:
t = udp6_transport_create();
break;
case TRANS_IEEE_802_3:
t = raw_transport_create();
break;
case TRANS_DEVICENET:
case TRANS_CONTROLNET:
case TRANS_PROFINET:
break;
}
if (t) {
t->type = type;
t->cfg = cfg;
}
return t;
}
void transport_destroy(struct transport *t)
{
t->release(t);
}
|