Porting PicoTCP WIP

This commit is contained in:
2025-10-29 14:29:06 +01:00
parent 6722f42e68
commit 815c2239fe
464 changed files with 235009 additions and 24 deletions

View File

@ -0,0 +1,122 @@
/*********************************************************************
PicoTCP. Copyright (c) 2012-2017 Altran Intelligent Systems. Some rights
reserved. See LICENSE and COPYING for usage.
Authors: Jelle De Vleeschouwer
*********************************************************************/
#ifndef INCLUDE_PICO_6LOWPAN_LL
#define INCLUDE_PICO_6LOWPAN_LL
#include "pico_addressing.h"
#include "pico_protocol.h"
#include "pico_6lowpan.h"
#include "pico_device.h"
#include "pico_config.h"
#include "pico_frame.h"
#include "pico_ipv6.h"
/* Possible actions to perform on a received frame */
#define FRAME_6LOWPAN_LL_RELEASE (-1)
#define FRAME_6LOWPAN_LL_DISCARD (-2)
/*******************************************************************************
* CTX
******************************************************************************/
#ifdef PICO_6LOWPAN_IPHC_ENABLED
#define PICO_IPHC_CTX_COMPRESS (0x01u)
struct iphc_ctx
{
struct pico_device *dev;
struct pico_ip6 prefix;
uint8_t id;
uint8_t size;
uint8_t flags;
pico_time lifetime;
};
/*
* Looks up a context entry for a particular IPv6-address contained in 'addr' and returns it.
* Returns NULL if no entry is found. (See RFC4944)
*/
struct iphc_ctx * ctx_lookup(struct pico_ip6 addr);
/*
* Looks up a context entry that belongs to a certain context identifier.
* Returns NULL if no belonging entry is found. (See RFC4944)
*/
struct iphc_ctx * ctx_lookup_id(uint8_t id);
/*
* Creates a new, or updates and existing, context entry for a certain IPv6 address. (See RFC4944)
*/
void ctx_update(struct pico_ip6 addr, uint8_t id, uint8_t size, pico_time lifetime, uint8_t flags, struct pico_device *dev);
#endif
/******************************************************************************
* Interface with device drivers
******************************************************************************/
struct pico_dev_6lowpan
{
/* Interface with picoTCP */
struct pico_device dev;
/* Transmit-function:
*
* @param dev The device who's send-function got called
* @param _buf Buffer containing the frame to be send over the network
* @param len Length of _buf
* @param src Link Layer source address of the device (IETF-endianness)
* @param dst Link layer destination address of the device (IETF-endianness)
*
* @return length of the frame that is transmitted on success, -1 on failure
*/
int (* send)(struct pico_device *dev, void *_buf, int len, union pico_ll_addr src, union pico_ll_addr dst);
};
/* Initialisation routine for 6LoWPAN specific devices */
int pico_dev_6lowpan_init(struct pico_dev_6lowpan *dev, const char *name, uint8_t *mac, enum pico_ll_mode ll_mode, uint16_t mtu, uint8_t nomac,
int (* send)(struct pico_device *dev, void *_buf, int len, union pico_ll_addr src, union pico_ll_addr dst),
int (* poll)(struct pico_device *dev, int loop_score));
/******************************************************************************
* Interface with link layer
******************************************************************************/
struct pico_6lowpan_ll_protocol
{
int32_t (* process_in)(struct pico_frame *f);
int32_t (* process_out)(struct pico_frame *f);
int32_t (* estimate)(struct pico_frame *f);
int32_t (* addr_from_buf)(union pico_ll_addr *addr, uint8_t *buf);
int32_t (* addr_from_net)(union pico_ll_addr *addr, struct pico_frame *f, int32_t dest);
int32_t (* addr_len)(union pico_ll_addr *addr);
int32_t (* addr_cmp)(union pico_ll_addr *a, union pico_ll_addr *b);
int32_t (* addr_iid)(uint8_t *iid, union pico_ll_addr *addr);
struct pico_frame * (*alloc)(struct pico_device *dev, uint16_t size);
};
/******************************************************************************
* Public variables
******************************************************************************/
extern struct pico_6lowpan_ll_protocol pico_6lowpan_lls[];
extern struct pico_protocol pico_proto_6lowpan_ll;
/******************************************************************************
* Public functions
******************************************************************************/
void pico_6lowpan_ll_init(void);
int32_t pico_6lowpan_ll_push(struct pico_frame *f);
int32_t pico_6lowpan_ll_pull(struct pico_frame *f);
int32_t frame_6lowpan_ll_store_addr(struct pico_frame *f);
int32_t pico_6lowpan_ll_sendto_dev(struct pico_device *dev, struct pico_frame *f);
int32_t pico_6lowpan_stack_recv(struct pico_device *dev, uint8_t *buffer, uint32_t len, union pico_ll_addr *src, union pico_ll_addr *dst);
#endif /* INCLUDE_PICO_6LOWPAN_LL */