You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
97 lines
3.0 KiB
/********************************************************************* |
|
PicoTCP. Copyright (c) 2012-2015 Altran Intelligent Systems. Some rights reserved. |
|
See LICENSE and COPYING for usage. |
|
|
|
*********************************************************************/ |
|
#ifndef INCLUDE_PICO_PROTOCOL |
|
#define INCLUDE_PICO_PROTOCOL |
|
#include "pico_config.h" |
|
#include "pico_queue.h" |
|
|
|
#define PICO_LOOP_DIR_IN 1 |
|
#define PICO_LOOP_DIR_OUT 2 |
|
|
|
enum pico_layer { |
|
PICO_LAYER_DATALINK = 2, /* Ethernet only. */ |
|
PICO_LAYER_NETWORK = 3, /* IPv4, IPv6, ARP. Arp is there because it communicates with L2 */ |
|
PICO_LAYER_TRANSPORT = 4, /* UDP, TCP, ICMP */ |
|
PICO_LAYER_SOCKET = 5 /* Socket management */ |
|
}; |
|
|
|
enum pico_err_e { |
|
PICO_ERR_NOERR = 0, |
|
PICO_ERR_EPERM = 1, |
|
PICO_ERR_ENOENT = 2, |
|
/* ... */ |
|
PICO_ERR_EINTR = 4, |
|
PICO_ERR_EIO = 5, |
|
PICO_ERR_ENXIO = 6, |
|
/* ... */ |
|
PICO_ERR_EAGAIN = 11, |
|
PICO_ERR_ENOMEM = 12, |
|
PICO_ERR_EACCESS = 13, |
|
PICO_ERR_EFAULT = 14, |
|
/* ... */ |
|
PICO_ERR_EBUSY = 16, |
|
PICO_ERR_EEXIST = 17, |
|
/* ... */ |
|
PICO_ERR_EINVAL = 22, |
|
/* ... */ |
|
PICO_ERR_ENONET = 64, |
|
/* ... */ |
|
PICO_ERR_EPROTO = 71, |
|
/* ... */ |
|
PICO_ERR_ENOPROTOOPT = 92, |
|
PICO_ERR_EPROTONOSUPPORT = 93, |
|
/* ... */ |
|
PICO_ERR_EOPNOTSUPP = 95, |
|
PICO_ERR_EADDRINUSE = 98, |
|
PICO_ERR_EADDRNOTAVAIL = 99, |
|
PICO_ERR_ENETDOWN = 100, |
|
PICO_ERR_ENETUNREACH = 101, |
|
/* ... */ |
|
PICO_ERR_ECONNRESET = 104, |
|
/* ... */ |
|
PICO_ERR_EISCONN = 106, |
|
PICO_ERR_ENOTCONN = 107, |
|
PICO_ERR_ESHUTDOWN = 108, |
|
/* ... */ |
|
PICO_ERR_ETIMEDOUT = 110, |
|
PICO_ERR_ECONNREFUSED = 111, |
|
PICO_ERR_EHOSTDOWN = 112, |
|
PICO_ERR_EHOSTUNREACH = 113, |
|
}; |
|
|
|
typedef enum pico_err_e pico_err_t; |
|
extern volatile pico_err_t pico_err; |
|
|
|
#define IS_IPV6(f) (f && f->net_hdr && ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x60)) |
|
#define IS_IPV4(f) (f && f->net_hdr && ((((uint8_t *)(f->net_hdr))[0] & 0xf0) == 0x40)) |
|
|
|
#define MAX_PROTOCOL_NAME 16 |
|
|
|
struct pico_protocol { |
|
char name[MAX_PROTOCOL_NAME]; |
|
uint32_t hash; |
|
enum pico_layer layer; |
|
uint16_t proto_number; |
|
struct pico_queue *q_in; |
|
struct pico_queue *q_out; |
|
struct pico_frame *(*alloc)(struct pico_protocol *self, uint16_t size); /* Frame allocation. */ |
|
int (*push)(struct pico_protocol *self, struct pico_frame *p); /* Push function, for active outgoing pkts from above */ |
|
int (*process_out)(struct pico_protocol *self, struct pico_frame *p); /* Send loop. */ |
|
int (*process_in)(struct pico_protocol *self, struct pico_frame *p); /* Recv loop. */ |
|
uint16_t (*get_mtu)(struct pico_protocol *self); |
|
}; |
|
|
|
int pico_protocols_loop(int loop_score); |
|
void pico_protocol_init(struct pico_protocol *p); |
|
|
|
int pico_protocol_datalink_loop(int loop_score, int direction); |
|
int pico_protocol_network_loop(int loop_score, int direction); |
|
int pico_protocol_transport_loop(int loop_score, int direction); |
|
int pico_protocol_socket_loop(int loop_score, int direction); |
|
|
|
// static pico_err_t get_pico_err(); |
|
|
|
#endif
|
|
|