blob: 6dcf9cad4f107f24f5702c9c71d6070530b28efb [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 - 2021 DisplayLink (UK) Ltd.
*/
#ifndef __MAUSB_IP_LINK_H__
#define __MAUSB_IP_LINK_H__
#include <linux/in.h>
#include <linux/in6.h>
#include <linux/inet.h>
#include <linux/list.h>
#include <linux/miscdevice.h>
#include <linux/workqueue.h>
#define MAUSB_LINK_BUFF_SIZE 16777216
#define MAUSB_LINK_TOS_LEVEL_EF 0xB8
enum mausb_link_action {
MAUSB_LINK_CONNECT = 0,
MAUSB_LINK_DISCONNECT = 1,
MAUSB_LINK_RECV = 2,
MAUSB_LINK_SEND = 3,
};
enum mausb_channel {
MAUSB_CTRL_CHANNEL = 0,
MAUSB_ISOCH_CHANNEL = 1,
MAUSB_BULK_CHANNEL = 2,
MAUSB_INTR_CHANNEL = 3,
MAUSB_MGMT_CHANNEL = 4,
};
struct mausb_kvec_data_wrapper {
struct kvec *kvec;
u32 kvec_num;
u32 length;
};
struct mausb_ip_recv_ctx {
u16 left;
u16 received;
char *buffer;
char common_hdr[12] __aligned(4);
};
struct mausb_ip_ctx {
struct socket *client_socket;
union {
struct sockaddr_in sa_in;
#if IS_ENABLED(CONFIG_IPV6)
struct sockaddr_in6 sa_in6;
#endif
} dev_addr_in;
struct net *net_ns;
bool udp;
/* Queues to schedule rx work */
struct workqueue_struct *recv_workq;
struct workqueue_struct *connect_workq;
struct work_struct recv_work;
struct work_struct connect_work;
struct mausb_ip_recv_ctx recv_ctx; /* recv buffer */
enum mausb_channel channel;
void *ctx;
/* callback should store task into hpal queue */
void (*fn_callback)(void *ctx, enum mausb_channel channel,
enum mausb_link_action act, int status, void *data);
};
int mausb_init_ip_ctx(struct mausb_ip_ctx **ip_ctx,
struct net *net_ns,
char ip_addr[INET6_ADDRSTRLEN],
u16 port,
void *ctx,
void (*ctx_callback)(void *ctx,
enum mausb_channel channel,
enum mausb_link_action act,
int status, void *data),
enum mausb_channel channel);
int mausb_ip_disconnect(struct mausb_ip_ctx *ip_ctx);
int mausb_ip_send(struct mausb_ip_ctx *ip_ctx,
struct mausb_kvec_data_wrapper *wrapper);
void mausb_destroy_ip_ctx(struct mausb_ip_ctx *ip_ctx);
void mausb_ip_connect_async(struct mausb_ip_ctx *ip_ctx);
#endif /* __MAUSB_IP_LINK_H__ */