mirror of
https://github.com/openharmony/kernel_linux_common_modules.git
synced 2026-08-27 01:31:36 -04:00
!30 NewIP code problem modification
Merge pull request !30 from liangbotong/master
This commit is contained in:
@@ -42,7 +42,7 @@ void _check_nip_enable(void)
|
||||
g_nip_enable = atoi(tmp) ? 0 : 1;
|
||||
}
|
||||
|
||||
bool check_nip_enable(void)
|
||||
int check_nip_enable(void)
|
||||
{
|
||||
if (g_nip_enable == NIP_ENABLE_INVALID) {
|
||||
_check_nip_enable();
|
||||
|
||||
@@ -66,9 +66,9 @@ enum nip_32bit_addr_index {
|
||||
NIP_32BIT_ADDR_INDEX_MAX,
|
||||
};
|
||||
|
||||
#define nip_addr_field8 v.u.field8
|
||||
#define nip_addr_field16 v.u.field16
|
||||
#define nip_addr_field32 v.u.field32
|
||||
#define NIP_ADDR_FIELD8 v.u.field8
|
||||
#define NIP_ADDR_FIELD16 v.u.field16
|
||||
#define NIP_ADDR_FIELD32 v.u.field32
|
||||
|
||||
#pragma pack(1)
|
||||
struct nip_addr_field {
|
||||
|
||||
@@ -35,7 +35,7 @@ int nip_add_addr(int ifindex, const unsigned char *addr, unsigned char addr_len)
|
||||
|
||||
memset(&ifrn, 0, sizeof(ifrn));
|
||||
ifrn.ifrn_addr.bitlen = addr_len * BITS_PER_BYTE; // Byte length is converted to bit length
|
||||
memcpy(ifrn.ifrn_addr.nip_addr_field8, addr, addr_len);
|
||||
memcpy(ifrn.ifrn_addr.NIP_ADDR_FIELD8, addr, addr_len);
|
||||
ifrn.ifrn_ifindex = ifindex;
|
||||
|
||||
ret = ioctl(fd, SIOCSIFADDR, &ifrn);
|
||||
|
||||
@@ -97,9 +97,9 @@ int nip_addr_fmt(char *addr_str, struct nip_addr *sap, int addrlen_input)
|
||||
printf("*************************************************\n");
|
||||
printf("Newip addr len=%d\n", addrlen);
|
||||
for (i = 0; i < addrlen; i++) {
|
||||
sap->nip_addr_field8[i] = addr_str[i * INDEX_2] << INDEX_4;
|
||||
sap->nip_addr_field8[i] += addr_str[i * INDEX_2 + 1];
|
||||
printf("%02x ", sap->nip_addr_field8[i]);
|
||||
sap->NIP_ADDR_FIELD8[i] = addr_str[i * INDEX_2] << INDEX_4;
|
||||
sap->NIP_ADDR_FIELD8[i] += addr_str[i * INDEX_2 + 1];
|
||||
printf("%02x ", sap->NIP_ADDR_FIELD8[i]);
|
||||
}
|
||||
printf("\n*************************************************\n\n");
|
||||
|
||||
|
||||
@@ -41,11 +41,11 @@ int nip_route_add(int ifindex, const unsigned char *dst_addr, uint8_t dst_addr_l
|
||||
rt.rtmsg_ifindex = ifindex;
|
||||
rt.rtmsg_flags = RTF_UP;
|
||||
rt.rtmsg_dst.bitlen = dst_addr_len * BITS_PER_BYTE;
|
||||
memcpy(rt.rtmsg_dst.nip_addr_field8, dst_addr, dst_addr_len);
|
||||
memcpy(rt.rtmsg_dst.NIP_ADDR_FIELD8, dst_addr, dst_addr_len);
|
||||
|
||||
if (gateway_addr) {
|
||||
rt.rtmsg_gateway.bitlen = gateway_addr_len * BITS_PER_BYTE;
|
||||
memcpy(rt.rtmsg_gateway.nip_addr_field8, gateway_addr, gateway_addr_len);
|
||||
memcpy(rt.rtmsg_gateway.NIP_ADDR_FIELD8, gateway_addr, gateway_addr_len);
|
||||
rt.rtmsg_flags |= RTF_GATEWAY;
|
||||
}
|
||||
|
||||
|
||||
@@ -119,16 +119,16 @@ int main(int argc, char **argv)
|
||||
si_server.sin_family = AF_NINET;
|
||||
si_server.sin_port = htons(TCP_SERVER_PORT);
|
||||
// 2-byte address of the server: 0xDE00
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_0] = 0xDE;
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_1] = 0x00;
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_0] = 0xDE;
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_1] = 0x00;
|
||||
si_server.sin_addr.bitlen = NIP_ADDR_BIT_LEN_16; // 2-byte: 16bit
|
||||
if (connect(cfd, (struct sockaddr *)&si_server, sizeof(si_server)) < 0) {
|
||||
perror("connect");
|
||||
return -1;
|
||||
}
|
||||
printf("connect success, addr=0x%02x%02x, port=%d\n",
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_0],
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_1], TCP_SERVER_PORT);
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_0],
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_1], TCP_SERVER_PORT);
|
||||
|
||||
th_args.si_server = si_server;
|
||||
th_args.si_server.sin_port = htons(TCP_SERVER_PORT);
|
||||
|
||||
@@ -67,8 +67,8 @@ int main(int argc, char **argv)
|
||||
si_local.sin_family = AF_NINET;
|
||||
si_local.sin_port = htons(TCP_SERVER_PORT);
|
||||
// 2-byte address of the server: 0xDE00
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_0] = 0xDE;
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_1] = 0x00;
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_0] = 0xDE;
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_1] = 0x00;
|
||||
si_local.sin_addr.bitlen = NIP_ADDR_BIT_LEN_16; // 2-byte: 16bit
|
||||
|
||||
if (bind(fd, (const struct sockaddr *)&si_local, sizeof(si_local)) < 0) {
|
||||
@@ -76,8 +76,8 @@ int main(int argc, char **argv)
|
||||
goto END;
|
||||
}
|
||||
printf("bind success, addr=0x%02x%02x, port=%d\n",
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_0],
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_1], TCP_SERVER_PORT);
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_0],
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_1], TCP_SERVER_PORT);
|
||||
|
||||
if (listen(fd, LISTEN_MAX) < 0) {
|
||||
perror("listen");
|
||||
|
||||
@@ -117,8 +117,8 @@ int main(int argc, char **argv)
|
||||
si_server.sin_family = AF_NINET;
|
||||
si_server.sin_port = htons(UDP_SERVER_PORT);
|
||||
// 2-byte address of the server: 0xDE00
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_0] = 0xDE;
|
||||
si_server.sin_addr.nip_addr_field8[INDEX_1] = 0x00;
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_0] = 0xDE;
|
||||
si_server.sin_addr.NIP_ADDR_FIELD8[INDEX_1] = 0x00;
|
||||
si_server.sin_addr.bitlen = NIP_ADDR_BIT_LEN_16; // 2-byte: 16bit
|
||||
|
||||
th_args.si_server = si_server;
|
||||
|
||||
@@ -45,7 +45,7 @@ void *recv_send(void *args)
|
||||
;
|
||||
} else {
|
||||
printf("Received -- %s -- from 0x%x:%d\n", buf,
|
||||
si_remote.sin_addr.nip_addr_field16[0], ntohs(si_remote.sin_port));
|
||||
si_remote.sin_addr.NIP_ADDR_FIELD16[0], ntohs(si_remote.sin_port));
|
||||
slen = sizeof(si_remote);
|
||||
ret = sendto(fd, buf, BUFLEN, 0, (struct sockaddr *)&si_remote, slen);
|
||||
if (ret < 0) {
|
||||
@@ -53,7 +53,7 @@ void *recv_send(void *args)
|
||||
goto END;
|
||||
}
|
||||
printf("Sending -- %s -- to 0x%0x:%d\n", buf,
|
||||
si_remote.sin_addr.nip_addr_field8[0], ntohs(si_remote.sin_port));
|
||||
si_remote.sin_addr.NIP_ADDR_FIELD8[0], ntohs(si_remote.sin_port));
|
||||
}
|
||||
count++;
|
||||
}
|
||||
@@ -76,8 +76,8 @@ int main(int argc, char **argv)
|
||||
si_local.sin_family = AF_NINET;
|
||||
si_local.sin_port = htons(UDP_SERVER_PORT);
|
||||
// 2-byte address of the server: 0xDE00
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_0] = 0xDE;
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_1] = 0x00;
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_0] = 0xDE;
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_1] = 0x00;
|
||||
si_local.sin_addr.bitlen = NIP_ADDR_BIT_LEN_16; // 2-byte: 16bit
|
||||
|
||||
if (bind(fd, (const struct sockaddr *)&si_local, sizeof(si_local)) < 0) {
|
||||
@@ -86,8 +86,8 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
printf("bind success, addr=0x%02x%02x, port=%d\n",
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_0],
|
||||
si_local.sin_addr.nip_addr_field8[INDEX_1], UDP_SERVER_PORT);
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_0],
|
||||
si_local.sin_addr.NIP_ADDR_FIELD8[INDEX_1], UDP_SERVER_PORT);
|
||||
|
||||
pthread_create(&th, NULL, recv_send, &fd);
|
||||
/* Wait for the thread to end and synchronize operations between threads */
|
||||
|
||||
+19
-19
@@ -16,20 +16,20 @@
|
||||
*/
|
||||
const struct nip_addr nip_any_addr = {
|
||||
.bitlen = NIP_ADDR_BIT_LEN_16,
|
||||
.nip_addr_field8[0] = 0xFF, /* 0xFF09 addr, big-endian */
|
||||
.nip_addr_field8[1] = 0x09,
|
||||
.NIP_ADDR_FIELD8[0] = 0xFF, /* 0xFF09 addr, big-endian */
|
||||
.NIP_ADDR_FIELD8[1] = 0x09,
|
||||
};
|
||||
|
||||
const struct nip_addr nip_broadcast_addr_arp = {
|
||||
.bitlen = NIP_ADDR_BIT_LEN_16,
|
||||
.nip_addr_field8[0] = 0xFF, /* 0xFF04 addr, big-endian */
|
||||
.nip_addr_field8[1] = 0x04,
|
||||
.NIP_ADDR_FIELD8[0] = 0xFF, /* 0xFF04 addr, big-endian */
|
||||
.NIP_ADDR_FIELD8[1] = 0x04,
|
||||
};
|
||||
|
||||
static const struct nip_addr nip_local_addr = {
|
||||
.bitlen = NIP_ADDR_BIT_LEN_16,
|
||||
.nip_addr_field8[0] = 0xFF, /* 0xFF00 addr, big-endian */
|
||||
.nip_addr_field8[1] = 0x00,
|
||||
.NIP_ADDR_FIELD8[0] = 0xFF, /* 0xFF00 addr, big-endian */
|
||||
.NIP_ADDR_FIELD8[1] = 0x00,
|
||||
};
|
||||
|
||||
enum addr_check_ret {
|
||||
@@ -133,8 +133,8 @@ int is_nip_local_addr(const struct nip_addr *addr)
|
||||
int result = 0;
|
||||
|
||||
if (addr->bitlen == NIP_ADDR_BIT_LEN_16) {
|
||||
if (addr->nip_addr_field16[0] == nip_local_addr.nip_addr_field16[0] &&
|
||||
addr->nip_addr_field16[1] == nip_local_addr.nip_addr_field16[1])
|
||||
if (addr->NIP_ADDR_FIELD16[0] == nip_local_addr.NIP_ADDR_FIELD16[0] &&
|
||||
addr->NIP_ADDR_FIELD16[1] == nip_local_addr.NIP_ADDR_FIELD16[1])
|
||||
result = 1;
|
||||
}
|
||||
return result;
|
||||
@@ -308,14 +308,14 @@ int nip_addr_invalid(const struct nip_addr *addr)
|
||||
int ret = NIP_ADDR_UNKNOWN;
|
||||
unsigned char first_byte, second_byte, third_byte;
|
||||
|
||||
first_byte = addr->nip_addr_field8[NIP_8BIT_ADDR_INDEX_0];
|
||||
second_byte = addr->nip_addr_field8[NIP_8BIT_ADDR_INDEX_1];
|
||||
third_byte = addr->nip_addr_field8[NIP_8BIT_ADDR_INDEX_2];
|
||||
first_byte = addr->NIP_ADDR_FIELD8[NIP_8BIT_ADDR_INDEX_0];
|
||||
second_byte = addr->NIP_ADDR_FIELD8[NIP_8BIT_ADDR_INDEX_1];
|
||||
third_byte = addr->NIP_ADDR_FIELD8[NIP_8BIT_ADDR_INDEX_2];
|
||||
addr_len = addr->bitlen / NIP_ADDR_BIT_LEN_8;
|
||||
|
||||
/* The value of the field after the effective length of the short address should be 0 */
|
||||
for (i = addr_len; i < NIP_8BIT_ADDR_INDEX_MAX; i++) {
|
||||
if (addr->nip_addr_field8[i] > 0x00)
|
||||
if (addr->NIP_ADDR_FIELD8[i] > 0x00)
|
||||
return ADDR_BITLEN_INVALID;
|
||||
}
|
||||
|
||||
@@ -345,7 +345,7 @@ int nip_addr_invalid(const struct nip_addr *addr)
|
||||
*/
|
||||
int nip_addr_public(const struct nip_addr *addr)
|
||||
{
|
||||
if (is_public_addr_flag(addr->nip_addr_field8[NIP_8BIT_ADDR_INDEX_0]) &&
|
||||
if (is_public_addr_flag(addr->NIP_ADDR_FIELD8[NIP_8BIT_ADDR_INDEX_0]) &&
|
||||
addr->bitlen == NIP_ADDR_BIT_LEN_16)
|
||||
return 1;
|
||||
else
|
||||
@@ -358,8 +358,8 @@ int nip_addr_any(const struct nip_addr *addr)
|
||||
int result = 0;
|
||||
|
||||
if (addr->bitlen == NIP_ADDR_BIT_LEN_16) {
|
||||
if (addr->nip_addr_field16[0] == nip_any_addr.nip_addr_field16[0] &&
|
||||
addr->nip_addr_field16[1] == nip_any_addr.nip_addr_field16[1])
|
||||
if (addr->NIP_ADDR_FIELD16[0] == nip_any_addr.NIP_ADDR_FIELD16[0] &&
|
||||
addr->NIP_ADDR_FIELD16[1] == nip_any_addr.NIP_ADDR_FIELD16[1])
|
||||
result = 1;
|
||||
}
|
||||
return result;
|
||||
@@ -368,7 +368,7 @@ int nip_addr_any(const struct nip_addr *addr)
|
||||
int get_nip_addr_len(const struct nip_addr *addr)
|
||||
{
|
||||
int len = 0;
|
||||
unsigned char first_byte = addr->nip_addr_field8[0];
|
||||
unsigned char first_byte = addr->NIP_ADDR_FIELD8[0];
|
||||
|
||||
if (is_1byte_addr_flag(first_byte))
|
||||
len = NIP_ADDR_LEN_1;
|
||||
@@ -396,7 +396,7 @@ unsigned char *build_nip_addr(const struct nip_addr *addr, unsigned char *buf)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < addr_len; i++) {
|
||||
*p = addr->nip_addr_field8[i];
|
||||
*p = addr->NIP_ADDR_FIELD8[i];
|
||||
p++;
|
||||
}
|
||||
|
||||
@@ -410,13 +410,13 @@ unsigned char *decode_nip_addr(unsigned char *buf, struct nip_addr *addr)
|
||||
int addr_len;
|
||||
unsigned char *p = buf;
|
||||
|
||||
addr->nip_addr_field8[0] = *p;
|
||||
addr->NIP_ADDR_FIELD8[0] = *p;
|
||||
addr_len = get_nip_addr_len(addr);
|
||||
if (addr_len == 0)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < addr_len; i++) {
|
||||
addr->nip_addr_field8[i] = *p;
|
||||
addr->NIP_ADDR_FIELD8[i] = *p;
|
||||
p++;
|
||||
}
|
||||
addr->bitlen = addr_len * NIP_ADDR_BIT_LEN_8;
|
||||
|
||||
@@ -66,9 +66,9 @@ enum nip_32bit_addr_index {
|
||||
NIP_32BIT_ADDR_INDEX_MAX,
|
||||
};
|
||||
|
||||
#define nip_addr_field8 v.u.field8
|
||||
#define nip_addr_field16 v.u.field16
|
||||
#define nip_addr_field32 v.u.field32
|
||||
#define NIP_ADDR_FIELD8 v.u.field8
|
||||
#define NIP_ADDR_FIELD16 v.u.field16
|
||||
#define NIP_ADDR_FIELD32 v.u.field32
|
||||
|
||||
#pragma pack(1)
|
||||
struct nip_addr_field {
|
||||
|
||||
@@ -41,7 +41,7 @@ unsigned int _nip_header_chksum(struct nip_pseudo_header *chksum_header)
|
||||
if (addr_len) {
|
||||
j = 0;
|
||||
for (i = 0; i < addr_len; i++, j++)
|
||||
pseudo_header[j] = chksum_header->saddr.nip_addr_field8[i];
|
||||
pseudo_header[j] = chksum_header->saddr.NIP_ADDR_FIELD8[i];
|
||||
hdr_len += addr_len;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ unsigned int _nip_header_chksum(struct nip_pseudo_header *chksum_header)
|
||||
if (addr_len) {
|
||||
j = hdr_len;
|
||||
for (i = 0; i < addr_len; i++, j++)
|
||||
pseudo_header[j] = chksum_header->daddr.nip_addr_field8[i];
|
||||
pseudo_header[j] = chksum_header->daddr.NIP_ADDR_FIELD8[i];
|
||||
hdr_len += addr_len;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,20 +14,20 @@
|
||||
|
||||
#include "btdev.h"
|
||||
|
||||
#define NDEV_NAME(vnet) bt_virnet_get_ndev_name(vnet) /* btn1/2/3/4/... */
|
||||
#define CDEV_NAME(vnet) bt_virnet_get_cdev_name(vnet) /* dev/btdev1/2/3/4/... */
|
||||
#define ndev_name(vnet) bt_virnet_get_ndev_name(vnet) /* btn1/2/3/4/... */
|
||||
#define cdev_name(vnet) bt_virnet_get_cdev_name(vnet) /* dev/btdev1/2/3/4/... */
|
||||
|
||||
/* /sys/module/btdev/parameters/btdev_debug */
|
||||
bool g_btdev_debug;
|
||||
module_param_named(btdev_debug, g_btdev_debug, bool, 0644);
|
||||
|
||||
#define BTDEV_DBG(fmt, ...) \
|
||||
#define btdev_dbg(fmt, ...) \
|
||||
do { \
|
||||
if (g_btdev_debug) \
|
||||
pr_crit(fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define BTDEV_DBG_ERR(fmt, ...) pr_err(fmt, ##__VA_ARGS__)
|
||||
#define btdev_dbg_err(fmt, ...) pr_err(fmt, ##__VA_ARGS__)
|
||||
|
||||
static struct bt_drv *g_bt_drv;
|
||||
|
||||
@@ -36,7 +36,7 @@ static int bt_seq_show(struct seq_file *m, void *v)
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!g_bt_drv)) {
|
||||
BTDEV_DBG_ERR("invalid bt_drv");
|
||||
btdev_dbg_err("invalid bt_drv");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ static int bt_seq_show(struct seq_file *m, void *v)
|
||||
|
||||
list_for_each_entry(vnet, &g_bt_drv->devices_table->head, virnet_entry) {
|
||||
seq_printf(m, "dev: %12s, interface: %7s, state: %12s, MTU: %4d\n",
|
||||
CDEV_NAME(vnet), NDEV_NAME(vnet),
|
||||
cdev_name(vnet), ndev_name(vnet),
|
||||
bt_virnet_get_state_rep(vnet), vnet->ndev->mtu);
|
||||
seq_printf(m, "ring head: %4d, ring tail: %4d, packets num: %4d\n",
|
||||
vnet->tx_ring->head, vnet->tx_ring->tail,
|
||||
@@ -59,7 +59,7 @@ static int bt_seq_show(struct seq_file *m, void *v)
|
||||
static int bt_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (unlikely(!inode) || unlikely(!file)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -100,15 +100,15 @@ static int __bt_virnet_open(struct file *filp, struct bt_virnet *vnet)
|
||||
|
||||
if (unlikely(ret < 0)) {
|
||||
rtnl_unlock();
|
||||
BTDEV_DBG_ERR("%s dev change flags failed, ret=%d", CDEV_NAME(vnet), ret);
|
||||
btdev_dbg_err("%s dev change flags failed, ret=%d", cdev_name(vnet), ret);
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
set_state(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
filp->private_data = vnet;
|
||||
BTDEV_DBG("%s has been opened", CDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been opened", cdev_name(vnet));
|
||||
return OK;
|
||||
|
||||
/* If the file is not opened for the first time, an error occurs
|
||||
@@ -116,12 +116,12 @@ static int __bt_virnet_open(struct file *filp, struct bt_virnet *vnet)
|
||||
*/
|
||||
read_twice_already:
|
||||
atomic_inc(&vnet->io_file->read_open_limit);
|
||||
BTDEV_DBG_ERR("%s has been opened for read twice already", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s has been opened for read twice already", cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
|
||||
write_twice_already:
|
||||
atomic_inc(&vnet->io_file->write_open_limit);
|
||||
BTDEV_DBG_ERR("%s has been opened for write twice already", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s has been opened for write twice already", cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!node) || unlikely(!filp)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -146,12 +146,12 @@ static int bt_io_file_release(struct inode *node, struct file *filp)
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!filp) || unlikely(!filp->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vnet = filp->private_data;
|
||||
BTDEV_DBG("%s has been released", CDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been released", cdev_name(vnet));
|
||||
|
||||
/* Set xx_open_limit to 1 when the file is closed */
|
||||
if ((filp->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
@@ -163,7 +163,7 @@ static int bt_io_file_release(struct inode *node, struct file *filp)
|
||||
atomic_inc(&vnet->io_file->write_open_limit);
|
||||
}
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_DISCONNECTED);
|
||||
set_state(vnet, BT_VIRNET_STATE_DISCONNECTED);
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
if (unlikely(!filp) || unlikely(!buffer) || unlikely(!filp->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
|
||||
skb = bt_ring_current(vnet->tx_ring);
|
||||
if (unlikely(!skb)) {
|
||||
BTDEV_DBG_ERR("%s invalid skb", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s invalid skb", cdev_name(vnet));
|
||||
return -EINVAL;
|
||||
}
|
||||
out_sz = skb->len - MACADDR_LEN;
|
||||
@@ -202,8 +202,8 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
* the skb cannot be released at this time, because the skb is still unchained
|
||||
* on the ring buf.
|
||||
*/
|
||||
BTDEV_DBG_ERR("%s usr-buf too small, skb-len=%ld, usr-buf-len=%ld",
|
||||
CDEV_NAME(vnet), (long)out_sz, (long)size);
|
||||
btdev_dbg_err("%s usr-buf too small, skb-len=%ld, usr-buf-len=%ld",
|
||||
cdev_name(vnet), (long)out_sz, (long)size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -213,15 +213,15 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
* from the ring buf. In this case, the skb needs to be released when the skb data
|
||||
* fails to be copied to the user mode.
|
||||
*/
|
||||
BTDEV_DBG_ERR("%s copy to user failed", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s copy to user failed", cdev_name(vnet));
|
||||
dev_kfree_skb(skb);
|
||||
return -EIO;
|
||||
}
|
||||
dev_kfree_skb(skb);
|
||||
|
||||
BTDEV_DBG("read %ld data from %s", (long)out_sz, CDEV_NAME(vnet));
|
||||
btdev_dbg("read %ld data from %s", (long)out_sz, cdev_name(vnet));
|
||||
if (unlikely(netif_queue_stopped(vnet->ndev))) {
|
||||
BTDEV_DBG("consume data: wake the queue");
|
||||
btdev_dbg("consume data: wake the queue");
|
||||
netif_wake_queue(vnet->ndev);
|
||||
}
|
||||
|
||||
@@ -239,7 +239,7 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
ssize_t in_sz;
|
||||
|
||||
if (unlikely(!filp) || unlikely(!buffer) || unlikely(!filp->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -256,7 +256,7 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
|
||||
memset(skb->data, 0, MACADDR_LEN);
|
||||
if (copy_from_user(skb->data + MACADDR_LEN, buffer, size)) {
|
||||
BTDEV_DBG_ERR("%s copy from user failed", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s copy from user failed", cdev_name(vnet));
|
||||
dev_kfree_skb(skb);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -267,11 +267,11 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
ret = netif_rx_ni(skb);
|
||||
|
||||
if (ret == NET_RX_SUCCESS) {
|
||||
BTDEV_DBG("write %lu bytes data to %s", size, CDEV_NAME(vnet));
|
||||
btdev_dbg("write %lu bytes data to %s", size, cdev_name(vnet));
|
||||
vnet->ndev->stats.rx_packets++;
|
||||
vnet->ndev->stats.rx_bytes += len;
|
||||
} else {
|
||||
BTDEV_DBG_ERR("failed to write %lu bytes data to %s", size, CDEV_NAME(vnet));
|
||||
btdev_dbg_err("failed to write %lu bytes data to %s", size, cdev_name(vnet));
|
||||
vnet->ndev->stats.rx_errors++;
|
||||
vnet->ndev->stats.rx_dropped++;
|
||||
}
|
||||
@@ -282,10 +282,10 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
static int bt_virnet_change_mtu(struct net_device *dev, int mtu)
|
||||
{
|
||||
if (unlikely(!dev) || unlikely(mtu < 0) || unlikely(mtu > BT_MAX_MTU)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
BTDEV_DBG("change %s mtu %u to %u", dev->name, dev->mtu, mtu);
|
||||
btdev_dbg("change %s mtu %u to %u", dev->name, dev->mtu, mtu);
|
||||
dev->mtu = mtu;
|
||||
return OK;
|
||||
}
|
||||
@@ -295,7 +295,7 @@ static int bt_set_mtu(struct net_device *dev, int mtu)
|
||||
int err = OK;
|
||||
|
||||
if (unlikely(mtu < 0) || unlikely(mtu > BT_MAX_MTU)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -303,9 +303,9 @@ static int bt_set_mtu(struct net_device *dev, int mtu)
|
||||
err = dev_set_mtu(dev, mtu);
|
||||
rtnl_unlock();
|
||||
if (err < 0)
|
||||
BTDEV_DBG_ERR("failed to set %s mtu to %d, err=%d", dev->name, mtu, err);
|
||||
btdev_dbg_err("failed to set %s mtu to %d, err=%d", dev->name, mtu, err);
|
||||
else
|
||||
BTDEV_DBG("set %s mtu to %d", dev->name, mtu);
|
||||
btdev_dbg("set %s mtu to %d", dev->name, mtu);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -315,7 +315,7 @@ static int bt_cmd_enable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
int ret;
|
||||
|
||||
if (unlikely(vnet->state != BT_VIRNET_STATE_DISABLED)) {
|
||||
BTDEV_DBG_ERR("%s enable can only be set at disabled state", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s enable can only be set at disabled state", cdev_name(vnet));
|
||||
return -EINVAL; // enable failed
|
||||
}
|
||||
|
||||
@@ -323,12 +323,12 @@ static int bt_cmd_enable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags | IFF_UP, NULL);
|
||||
rtnl_unlock();
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG_ERR("%s dev change flags failed, ret=%d", CDEV_NAME(vnet), ret);
|
||||
btdev_dbg_err("%s dev change flags failed, ret=%d", cdev_name(vnet), ret);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been enabled", CDEV_NAME(vnet));
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
btdev_dbg("%s has been enabled", cdev_name(vnet));
|
||||
set_state(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -337,7 +337,7 @@ static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
int ret;
|
||||
|
||||
if (unlikely(vnet->state != BT_VIRNET_STATE_CONNECTED)) {
|
||||
BTDEV_DBG_ERR("%s disable can only be set at connected state", CDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s disable can only be set at connected state", cdev_name(vnet));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -345,12 +345,12 @@ static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags & ~IFF_UP, NULL);
|
||||
rtnl_unlock();
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG_ERR("%s dev change flags failed, ret=%d", CDEV_NAME(vnet), ret);
|
||||
btdev_dbg_err("%s dev change flags failed, ret=%d", cdev_name(vnet), ret);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been disabled", CDEV_NAME(vnet));
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_DISABLED);
|
||||
btdev_dbg("%s has been disabled", cdev_name(vnet));
|
||||
set_state(vnet, BT_VIRNET_STATE_DISABLED);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -360,17 +360,17 @@ static int bt_cmd_change_mtu(struct bt_virnet *vnet, unsigned long arg)
|
||||
int ret;
|
||||
|
||||
if (unlikely(get_user(mtu, (int __user *)arg))) {
|
||||
BTDEV_DBG_ERR("%s get user failed", NDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s get user failed", ndev_name(vnet));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = bt_set_mtu(vnet->ndev, mtu);
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG_ERR("%s changed mtu to %d failed", NDEV_NAME(vnet), mtu);
|
||||
btdev_dbg_err("%s changed mtu to %d failed", ndev_name(vnet), mtu);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s changed mtu to %d", NDEV_NAME(vnet), mtu);
|
||||
btdev_dbg("%s changed mtu to %d", ndev_name(vnet), mtu);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -380,7 +380,7 @@ static int bt_cmd_peek_packet(struct bt_virnet *vnet, unsigned long arg)
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (unlikely(bt_ring_is_empty(vnet->tx_ring))) {
|
||||
BTDEV_DBG_ERR("%s ring is empty", NDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s ring is empty", ndev_name(vnet));
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
@@ -389,17 +389,17 @@ static int bt_cmd_peek_packet(struct bt_virnet *vnet, unsigned long arg)
|
||||
*/
|
||||
skb = bt_ring_current(vnet->tx_ring);
|
||||
if (unlikely(!skb)) {
|
||||
BTDEV_DBG_ERR("%s invalid skb", NDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s invalid skb", ndev_name(vnet));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
len = skb->len - MACADDR_LEN;
|
||||
if (unlikely(put_user(len, (int __user *)arg))) {
|
||||
BTDEV_DBG_ERR("%s put_user failed", NDEV_NAME(vnet));
|
||||
btdev_dbg_err("%s put_user failed", ndev_name(vnet));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s get packet len is %u", NDEV_NAME(vnet), len);
|
||||
btdev_dbg("%s get packet len is %u", ndev_name(vnet), len);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -411,7 +411,7 @@ static long bt_io_file_ioctl(struct file *filep,
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!filep) || unlikely(!filep->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
vnet = filep->private_data;
|
||||
@@ -429,7 +429,7 @@ static long bt_io_file_ioctl(struct file *filep,
|
||||
ret = bt_cmd_peek_packet(vnet, arg);
|
||||
break;
|
||||
default:
|
||||
BTDEV_DBG_ERR("not a valid cmd(%u)", cmd);
|
||||
btdev_dbg_err("not a valid cmd(%u)", cmd);
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ static unsigned int bt_io_file_poll(struct file *filp, poll_table *wait)
|
||||
unsigned int mask = 0;
|
||||
|
||||
if (unlikely(!filp) || unlikely(!wait) || unlikely(!filp->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
vnet = filp->private_data;
|
||||
@@ -470,7 +470,7 @@ static const struct file_operations g_bt_io_file_ops = {
|
||||
static int bt_mng_file_open(struct inode *node, struct file *filp)
|
||||
{
|
||||
if (unlikely(!filp)) {
|
||||
BTDEV_DBG_ERR("bt mng file open: invalid filp");
|
||||
btdev_dbg_err("bt mng file open: invalid filp");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -480,7 +480,7 @@ static int bt_mng_file_open(struct inode *node, struct file *filp)
|
||||
* and open_limit is restored to the open state. (set to 0)
|
||||
*/
|
||||
atomic_inc(&g_bt_drv->mng_file->open_limit);
|
||||
BTDEV_DBG_ERR("file %s has been opened already",
|
||||
btdev_dbg_err("file %s has been opened already",
|
||||
g_bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -488,7 +488,7 @@ static int bt_mng_file_open(struct inode *node, struct file *filp)
|
||||
/* open_limit becomes 0 after the file is first opened */
|
||||
filp->private_data = g_bt_drv;
|
||||
|
||||
BTDEV_DBG("%s has been opened", g_bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
btdev_dbg("%s has been opened", g_bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -497,7 +497,7 @@ static int bt_mng_file_release(struct inode *node, struct file *filp)
|
||||
struct bt_drv *drv = NULL;
|
||||
|
||||
if (unlikely(!filp) || unlikely(!filp->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
drv = filp->private_data;
|
||||
@@ -505,7 +505,7 @@ static int bt_mng_file_release(struct inode *node, struct file *filp)
|
||||
/* Set open_limit to 1 when the file is closed */
|
||||
atomic_inc(&drv->mng_file->open_limit);
|
||||
|
||||
BTDEV_DBG("%s has been released", g_bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
btdev_dbg("%s has been released", g_bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -519,39 +519,38 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
|
||||
mutex_lock(&bt_mng->bitmap_lock);
|
||||
id = bt_get_unused_id(bt_mng->bitmap);
|
||||
|
||||
if ((unlikely(bt_mng->devices_table->num >= BT_VIRNET_MAX_NUM)) ||
|
||||
(unlikely(id < 0))) {
|
||||
BTDEV_DBG_ERR("reach the limit of max virnets");
|
||||
btdev_dbg_err("reach the limit of max virnets");
|
||||
goto virnet_create_failed;
|
||||
}
|
||||
vnet = bt_virnet_create(bt_mng, id);
|
||||
if (unlikely(!vnet)) {
|
||||
BTDEV_DBG_ERR("bt virnet create failed");
|
||||
btdev_dbg_err("bt virnet create failed");
|
||||
goto virnet_create_failed;
|
||||
}
|
||||
|
||||
ret = bt_table_add_device(bt_mng->devices_table, vnet);
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG_ERR("bt table add device failed: ret=%d", ret);
|
||||
btdev_dbg_err("bt table add device failed: ret=%d", ret);
|
||||
goto add_device_failed;
|
||||
}
|
||||
|
||||
bt_set_bit(&bt_mng->bitmap, id);
|
||||
mutex_unlock(&bt_mng->bitmap_lock);
|
||||
|
||||
memcpy(vp.ifa_name, NDEV_NAME(vnet), sizeof(vp.ifa_name));
|
||||
memcpy(vp.cfile_name, CDEV_NAME(vnet), sizeof(vp.cfile_name));
|
||||
memcpy(vp.ifa_name, ndev_name(vnet), sizeof(vp.ifa_name));
|
||||
memcpy(vp.cfile_name, cdev_name(vnet), sizeof(vp.cfile_name));
|
||||
|
||||
mdelay(DELAY_100_MS);
|
||||
|
||||
size = copy_to_user((void __user *)arg, &vp, sizeof(struct bt_uioc_args));
|
||||
if (unlikely(size)) {
|
||||
BTDEV_DBG_ERR("copy_to_user failed: left size=%lu", size);
|
||||
btdev_dbg_err("copy_to_user failed: left size=%lu", size);
|
||||
goto copy_to_user_failed;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been created", NDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been created", ndev_name(vnet));
|
||||
return OK;
|
||||
|
||||
copy_to_user_failed:
|
||||
@@ -578,17 +577,17 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
size = copy_from_user(&vp, (void __user *)arg,
|
||||
sizeof(struct bt_uioc_args));
|
||||
if (unlikely(size)) {
|
||||
BTDEV_DBG_ERR("copy_from_user failed: left size=%lu", size);
|
||||
btdev_dbg_err("copy_from_user failed: left size=%lu", size);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
vnet = bt_table_find(bt_mng->devices_table, vp.ifa_name);
|
||||
if (unlikely(!vnet)) {
|
||||
BTDEV_DBG_ERR("virnet: %s cannot be found in bt table", vp.ifa_name);
|
||||
btdev_dbg_err("virnet: %s cannot be found in bt table", vp.ifa_name);
|
||||
return -EIO; // not found
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been deleted", NDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been deleted", ndev_name(vnet));
|
||||
mutex_lock(&bt_mng->bitmap_lock);
|
||||
err = bt_virnet_get_cdev_number(vnet, &number);
|
||||
if (likely(!err))
|
||||
@@ -602,7 +601,7 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
static int bt_cmd_query_all_virnets(struct bt_drv *bt_mng, unsigned long arg)
|
||||
{
|
||||
if (unlikely(put_user(bt_mng->bitmap, (u32 *)arg))) {
|
||||
BTDEV_DBG_ERR("put_user failed");
|
||||
btdev_dbg_err("put_user failed");
|
||||
return -EIO;
|
||||
}
|
||||
return OK;
|
||||
@@ -621,7 +620,7 @@ static long bt_mng_file_ioctl(struct file *filep,
|
||||
struct bt_drv *bt_mng = NULL;
|
||||
|
||||
if (unlikely(!filep) || unlikely(!filep->private_data)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
bt_mng = filep->private_data;
|
||||
@@ -640,7 +639,7 @@ static long bt_mng_file_ioctl(struct file *filep,
|
||||
ret = bt_cmd_delete_all_virnets(bt_mng, arg);
|
||||
break;
|
||||
default:
|
||||
BTDEV_DBG_ERR("not a valid cmd(%u)", cmd);
|
||||
btdev_dbg_err("not a valid cmd(%u)", cmd);
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
return ret;
|
||||
@@ -660,21 +659,20 @@ static netdev_tx_t bt_virnet_xmit(struct sk_buff *skb,
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!skb) || unlikely(!dev)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vnet = bt_table_find(g_bt_drv->devices_table, dev->name);
|
||||
if (unlikely(!vnet)) {
|
||||
BTDEV_DBG_ERR("bt_table_find %s failed", NDEV_NAME(vnet));
|
||||
btdev_dbg_err("bt_table_find %s failed", ndev_name(vnet));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = bt_virnet_produce_data(vnet, (void *)skb);
|
||||
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG("%s produce data failed: ring is full, need to stop queue",
|
||||
NDEV_NAME(vnet));
|
||||
btdev_dbg("%s produce data failed: ring is full, need to stop queue",
|
||||
ndev_name(vnet));
|
||||
netif_stop_queue(vnet->ndev);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
@@ -682,7 +680,7 @@ static netdev_tx_t bt_virnet_xmit(struct sk_buff *skb,
|
||||
vnet->ndev->stats.tx_packets++;
|
||||
vnet->ndev->stats.tx_bytes += skb->len;
|
||||
|
||||
BTDEV_DBG("%s send success, skb-len=%u", NDEV_NAME(vnet), skb->len);
|
||||
btdev_dbg("%s send success, skb-len=%u", ndev_name(vnet), skb->len);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -695,7 +693,7 @@ static struct bt_table *bt_table_init(void)
|
||||
struct bt_table *tbl = kmalloc(sizeof(*tbl), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!tbl)) {
|
||||
BTDEV_DBG_ERR("alloc failed");
|
||||
btdev_dbg_err("alloc failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -710,17 +708,17 @@ static int bt_table_add_device(struct bt_table *tbl, struct bt_virnet *vn)
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!tbl)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vnet = bt_table_find(tbl, NDEV_NAME(vn));
|
||||
vnet = bt_table_find(tbl, ndev_name(vn));
|
||||
if (unlikely(vnet)) {
|
||||
BTDEV_DBG_ERR("found duplicated device %s", NDEV_NAME(vn));
|
||||
btdev_dbg_err("found duplicated device %s", ndev_name(vn));
|
||||
return -ENOIOCTLCMD; // duplicated
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been added", NDEV_NAME(vn));
|
||||
btdev_dbg("%s has been added", ndev_name(vn));
|
||||
mutex_lock(&tbl->tbl_lock);
|
||||
list_add_tail(&vn->virnet_entry, &tbl->head);
|
||||
if (tbl->num < UINT32_MAX)
|
||||
@@ -735,7 +733,7 @@ static void bt_table_remove_device(struct bt_table *tbl, struct bt_virnet *vn)
|
||||
if (unlikely(!tbl))
|
||||
return;
|
||||
|
||||
BTDEV_DBG("%s has been removed", NDEV_NAME(vn));
|
||||
btdev_dbg("%s has been removed", ndev_name(vn));
|
||||
mutex_lock(&tbl->tbl_lock);
|
||||
list_del(&vn->virnet_entry);
|
||||
if (tbl->num)
|
||||
@@ -748,12 +746,12 @@ static struct bt_virnet *bt_table_find(struct bt_table *tbl, const char *ifa_nam
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
if (unlikely(!tbl) || unlikely(!ifa_name)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
list_for_each_entry(vnet, &tbl->head, virnet_entry) {
|
||||
if (!strcmp(NDEV_NAME(vnet), ifa_name))
|
||||
if (!strcmp(ndev_name(vnet), ifa_name))
|
||||
return vnet;
|
||||
}
|
||||
|
||||
@@ -763,7 +761,8 @@ static struct bt_virnet *bt_table_find(struct bt_table *tbl, const char *ifa_nam
|
||||
static void __bt_table_delete_all(struct bt_drv *drv)
|
||||
{
|
||||
dev_t number;
|
||||
struct bt_virnet *vnet = NULL, *tmp_vnet = NULL;
|
||||
struct bt_virnet *vnet = NULL;
|
||||
struct bt_virnet *tmp_vnet = NULL;
|
||||
|
||||
if (unlikely(!g_bt_drv->devices_table))
|
||||
return;
|
||||
@@ -777,7 +776,7 @@ static void __bt_table_delete_all(struct bt_drv *drv)
|
||||
if (likely(!err))
|
||||
bt_clear_bit(&drv->bitmap, (u32)MINOR(number));
|
||||
list_del(&vnet->virnet_entry);
|
||||
BTDEV_DBG("%s has been deleted", NDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been deleted", ndev_name(vnet));
|
||||
bt_virnet_destroy(vnet);
|
||||
}
|
||||
drv->devices_table->num = 0;
|
||||
@@ -814,7 +813,7 @@ static struct bt_ring *__bt_ring_create(int size)
|
||||
|
||||
ring = kmalloc(sizeof(*ring), GFP_KERNEL);
|
||||
if (unlikely(!ring)) {
|
||||
BTDEV_DBG_ERR("ring alloc failed");
|
||||
btdev_dbg_err("ring alloc failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -822,7 +821,7 @@ static struct bt_ring *__bt_ring_create(int size)
|
||||
ring->tail = 0;
|
||||
ring->data = kmalloc_array(size, sizeof(void *), GFP_KERNEL);
|
||||
if (unlikely(!ring->data)) {
|
||||
BTDEV_DBG_ERR("ring data allocfailed");
|
||||
btdev_dbg_err("ring data allocfailed");
|
||||
kfree(ring);
|
||||
return NULL;
|
||||
}
|
||||
@@ -893,7 +892,7 @@ static void bt_ring_destroy(struct bt_ring *ring)
|
||||
static int bt_virnet_produce_data(struct bt_virnet *dev, void *data)
|
||||
{
|
||||
if (unlikely(bt_ring_is_full(dev->tx_ring))) {
|
||||
BTDEV_DBG("ring is full");
|
||||
btdev_dbg("ring is full");
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
@@ -916,7 +915,7 @@ static struct class *bt_dev_class_create(void)
|
||||
struct class *cls = class_create(THIS_MODULE, "bt");
|
||||
|
||||
if (IS_ERR(cls)) {
|
||||
BTDEV_DBG_ERR("create struct class failed");
|
||||
btdev_dbg_err("create struct class failed");
|
||||
return NULL;
|
||||
}
|
||||
return cls;
|
||||
@@ -944,25 +943,25 @@ static int bt_cdev_device_create(struct bt_cdev *dev,
|
||||
int ret;
|
||||
|
||||
if (unlikely(!cls)) {
|
||||
BTDEV_DBG_ERR("not a valid class");
|
||||
btdev_dbg_err("not a valid class");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev->bt_class = cls;
|
||||
device = device_create(cls, NULL, devno, NULL, "%s%u", BT_DEV_NAME_PREFIX, id);
|
||||
if (IS_ERR(device)) {
|
||||
BTDEV_DBG_ERR("create device failed, id=%d", id);
|
||||
btdev_dbg_err("create device failed, id=%d", id);
|
||||
return -EIO;
|
||||
}
|
||||
ret = snprintf(dev->dev_filename, sizeof(dev->dev_filename),
|
||||
"%s%u", BT_DEV_PATH_PREFIX, id);
|
||||
if (ret < 0) {
|
||||
BTDEV_DBG_ERR("snprintf failed, id=%d", id);
|
||||
btdev_dbg_err("snprintf failed, id=%d", id);
|
||||
bt_cdev_device_destroy(dev);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been created", dev->dev_filename);
|
||||
btdev_dbg("%s has been created", dev->dev_filename);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -976,13 +975,13 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
|
||||
|
||||
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (unlikely(!dev)) {
|
||||
BTDEV_DBG_ERR("dev alloc failed, id=%d", id);
|
||||
btdev_dbg_err("dev alloc failed, id=%d", id);
|
||||
goto dev_alloc_failed;
|
||||
}
|
||||
|
||||
chrdev = cdev_alloc();
|
||||
if (unlikely(!chrdev)) {
|
||||
BTDEV_DBG_ERR("cdev alloc failed, id=%d", id);
|
||||
btdev_dbg_err("cdev alloc failed, id=%d", id);
|
||||
goto cdev_alloc_failed;
|
||||
}
|
||||
|
||||
@@ -991,12 +990,12 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
|
||||
|
||||
ret = cdev_add(chrdev, MKDEV(BT_DEV_MAJOR, minor), 1);
|
||||
if (unlikely(ret < 0)) {
|
||||
BTDEV_DBG_ERR("cdev add failed, id=%d", id);
|
||||
btdev_dbg_err("cdev add failed, id=%d", id);
|
||||
goto cdev_add_failed;
|
||||
}
|
||||
|
||||
if (unlikely(bt_cdev_device_create(dev, g_bt_drv->bt_class, minor) < 0)) {
|
||||
BTDEV_DBG_ERR("bt cdev device create failed, id=%d", id);
|
||||
btdev_dbg_err("bt cdev device create failed, id=%d", id);
|
||||
goto cdev_device_create_failed;
|
||||
}
|
||||
|
||||
@@ -1029,7 +1028,7 @@ static void bt_cdev_delete(struct bt_cdev *bt_cdev)
|
||||
|
||||
cdev_del(bt_cdev->cdev);
|
||||
} else {
|
||||
BTDEV_DBG_ERR("cdev is null");
|
||||
btdev_dbg_err("cdev is null");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1041,12 +1040,12 @@ static struct bt_io_file *bt_create_io_file(u32 id)
|
||||
struct bt_io_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!file)) {
|
||||
BTDEV_DBG_ERR("file alloc failed, id=%d", id);
|
||||
btdev_dbg_err("file alloc failed, id=%d", id);
|
||||
return NULL;
|
||||
}
|
||||
file->bt_cdev = bt_cdev_create(&g_bt_io_file_ops, id);
|
||||
if (unlikely(!file->bt_cdev)) {
|
||||
BTDEV_DBG_ERR("create cdev failed, id=%d", id);
|
||||
btdev_dbg_err("create cdev failed, id=%d", id);
|
||||
kfree(file);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1062,7 +1061,7 @@ static struct bt_io_file **bt_create_io_files(void)
|
||||
GFP_KERNEL);
|
||||
|
||||
if (unlikely(!all_files)) {
|
||||
BTDEV_DBG_ERR("all_files alloc failed");
|
||||
btdev_dbg_err("all_files alloc failed");
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < BT_VIRNET_MAX_NUM; ++i)
|
||||
@@ -1099,20 +1098,20 @@ static struct bt_mng_file *bt_create_mng_file(int id)
|
||||
struct bt_mng_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!file)) {
|
||||
BTDEV_DBG_ERR("file alloc failed");
|
||||
btdev_dbg_err("file alloc failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
file->bt_cdev = bt_cdev_create(&g_bt_mng_file_ops, id);
|
||||
if (unlikely(!file->bt_cdev)) {
|
||||
BTDEV_DBG_ERR("create cdev failed");
|
||||
btdev_dbg_err("create cdev failed");
|
||||
kfree(file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
atomic_set(&file->open_limit, 1);
|
||||
|
||||
BTDEV_DBG("mng file has been created");
|
||||
btdev_dbg("mng file has been created");
|
||||
return file;
|
||||
}
|
||||
|
||||
@@ -1143,17 +1142,17 @@ static struct net_device *bt_net_device_create(u32 id)
|
||||
char ifa_name[IFNAMSIZ];
|
||||
|
||||
if (unlikely(id < 0) || unlikely(id > BT_VIRNET_MAX_NUM)) {
|
||||
BTDEV_DBG_ERR("invalid id");
|
||||
btdev_dbg_err("invalid id");
|
||||
return NULL;
|
||||
}
|
||||
err = snprintf(ifa_name, sizeof(ifa_name), "%s%d", BT_VIRNET_NAME_PREFIX, id);
|
||||
if (err < 0) {
|
||||
BTDEV_DBG_ERR("snprintf failed, id=%d", id);
|
||||
btdev_dbg_err("snprintf failed, id=%d", id);
|
||||
return NULL;
|
||||
}
|
||||
ndev = alloc_netdev(0, ifa_name, NET_NAME_UNKNOWN, ether_setup);
|
||||
if (unlikely(!ndev)) {
|
||||
BTDEV_DBG_ERR("%s ndev alloc failed", ifa_name);
|
||||
btdev_dbg_err("%s ndev alloc failed", ifa_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1165,12 +1164,12 @@ static struct net_device *bt_net_device_create(u32 id)
|
||||
|
||||
err = register_netdev(ndev);
|
||||
if (unlikely(err)) {
|
||||
BTDEV_DBG_ERR("%s register netdev failed", ifa_name);
|
||||
btdev_dbg_err("%s register netdev failed", ifa_name);
|
||||
free_netdev(ndev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BTDEV_DBG("%s has been created", ifa_name);
|
||||
btdev_dbg("%s has been created", ifa_name);
|
||||
return ndev;
|
||||
}
|
||||
|
||||
@@ -1179,7 +1178,7 @@ static struct net_device *bt_net_device_create(u32 id)
|
||||
*/
|
||||
static void bt_net_device_destroy(struct net_device *dev)
|
||||
{
|
||||
BTDEV_DBG("%s has been destroyed", dev->name);
|
||||
btdev_dbg("%s has been destroyed", dev->name);
|
||||
unregister_netdev(dev);
|
||||
free_netdev(dev);
|
||||
}
|
||||
@@ -1200,32 +1199,32 @@ static struct bt_virnet *bt_virnet_create(struct bt_drv *bt_mng, u32 id)
|
||||
struct bt_virnet *vnet = kmalloc(sizeof(*vnet), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!vnet)) {
|
||||
BTDEV_DBG_ERR("invalid parameter");
|
||||
btdev_dbg_err("invalid parameter");
|
||||
goto out_of_memory;
|
||||
}
|
||||
|
||||
vnet->tx_ring = bt_ring_create();
|
||||
if (unlikely(!vnet->tx_ring)) {
|
||||
BTDEV_DBG_ERR("create ring failed");
|
||||
btdev_dbg_err("create ring failed");
|
||||
goto bt_ring_create_failed;
|
||||
}
|
||||
|
||||
vnet->ndev = bt_net_device_create(id);
|
||||
if (unlikely(!vnet->ndev)) {
|
||||
BTDEV_DBG_ERR("create net device failed");
|
||||
btdev_dbg_err("create net device failed");
|
||||
goto net_device_create_failed;
|
||||
}
|
||||
|
||||
vnet->io_file = bt_get_io_file(bt_mng, id);
|
||||
if (unlikely(!vnet->io_file)) {
|
||||
BTDEV_DBG_ERR("create cdev failed");
|
||||
btdev_dbg_err("create cdev failed");
|
||||
goto get_io_file_failed;
|
||||
}
|
||||
|
||||
init_waitqueue_head(&vnet->rx_queue);
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_CREATED);
|
||||
BTDEV_DBG("%s has been created", CDEV_NAME(vnet));
|
||||
set_state(vnet, BT_VIRNET_STATE_CREATED);
|
||||
btdev_dbg("%s has been created", cdev_name(vnet));
|
||||
return vnet;
|
||||
|
||||
get_io_file_failed:
|
||||
@@ -1243,11 +1242,11 @@ out_of_memory:
|
||||
|
||||
static void bt_virnet_destroy(struct bt_virnet *vnet)
|
||||
{
|
||||
BTDEV_DBG("%s has been destroyed", NDEV_NAME(vnet));
|
||||
btdev_dbg("%s has been destroyed", ndev_name(vnet));
|
||||
bt_ring_destroy(vnet->tx_ring);
|
||||
bt_net_device_destroy(vnet->ndev);
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_DELETED);
|
||||
set_state(vnet, BT_VIRNET_STATE_DELETED);
|
||||
|
||||
kfree(vnet);
|
||||
}
|
||||
@@ -1266,7 +1265,105 @@ static void __exit bt_module_release(void)
|
||||
|
||||
bt_cdev_region_destroy(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM);
|
||||
remove_proc_entry("bt_info_proc", NULL);
|
||||
BTDEV_DBG("success");
|
||||
btdev_dbg("success");
|
||||
}
|
||||
|
||||
static int __bt_module_base_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
g_bt_drv = kmalloc(sizeof(*g_bt_drv), GFP_KERNEL);
|
||||
if (unlikely(!g_bt_drv)) {
|
||||
btdev_dbg_err("bt_drv alloc failed");
|
||||
ret = -ENOMEM;
|
||||
goto btdrv_alloc_failed;
|
||||
}
|
||||
|
||||
if (unlikely(bt_cdev_region_init(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM) < 0)) {
|
||||
btdev_dbg_err("bt cdev region init failed");
|
||||
ret = -EFAULT;
|
||||
goto cdev_region_fail;
|
||||
}
|
||||
|
||||
g_bt_drv->devices_table = bt_table_init();
|
||||
if (unlikely(!g_bt_drv->devices_table)) {
|
||||
btdev_dbg_err("bt table init failed");
|
||||
ret = -ENOMEM;
|
||||
goto table_init_fail;
|
||||
}
|
||||
|
||||
g_bt_drv->bt_class = bt_dev_class_create();
|
||||
if (unlikely(!g_bt_drv->bt_class)) {
|
||||
btdev_dbg_err("class create failed");
|
||||
ret = -ENOMEM;
|
||||
goto class_create_fail;
|
||||
}
|
||||
|
||||
g_bt_drv->io_files = bt_create_io_files();
|
||||
if (unlikely(!g_bt_drv->io_files)) {
|
||||
btdev_dbg_err("bt create io files failed");
|
||||
ret = -ENOMEM;
|
||||
goto io_files_create_fail;
|
||||
}
|
||||
|
||||
mutex_init(&g_bt_drv->bitmap_lock);
|
||||
g_bt_drv->bitmap = 0;
|
||||
return ret;
|
||||
|
||||
io_files_create_fail:
|
||||
bt_dev_class_destroy(g_bt_drv->bt_class);
|
||||
|
||||
class_create_fail:
|
||||
bt_table_destroy(g_bt_drv);
|
||||
|
||||
table_init_fail:
|
||||
bt_cdev_region_destroy(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM);
|
||||
|
||||
cdev_region_fail:
|
||||
kfree(g_bt_drv);
|
||||
g_bt_drv = NULL;
|
||||
|
||||
btdrv_alloc_failed:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __bt_module_dev_create(void)
|
||||
{
|
||||
int mid = 0;
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&g_bt_drv->bitmap_lock);
|
||||
g_bt_drv->mng_file = bt_create_mng_file(mid);
|
||||
if (unlikely(!g_bt_drv->mng_file)) {
|
||||
btdev_dbg_err("bt create mng file failed");
|
||||
ret = -ENOMEM;
|
||||
mutex_unlock(&g_bt_drv->bitmap_lock);
|
||||
goto mng_file_create_fail;
|
||||
}
|
||||
bt_set_bit(&g_bt_drv->bitmap, mid);
|
||||
mutex_unlock(&g_bt_drv->bitmap_lock);
|
||||
|
||||
entry = proc_create_data("bt_info_proc", 0, NULL, &g_bt_proc_fops, NULL);
|
||||
if (unlikely(!entry)) {
|
||||
btdev_dbg_err("create proc data failed");
|
||||
ret = -ENOMEM;
|
||||
goto proc_create_fail;
|
||||
}
|
||||
|
||||
return ret;
|
||||
proc_create_fail:
|
||||
bt_delete_mng_file(g_bt_drv->mng_file);
|
||||
|
||||
mng_file_create_fail:
|
||||
bt_delete_io_files(g_bt_drv);
|
||||
bt_dev_class_destroy(g_bt_drv->bt_class);
|
||||
bt_table_destroy(g_bt_drv);
|
||||
bt_cdev_region_destroy(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM);
|
||||
kfree(g_bt_drv);
|
||||
g_bt_drv = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1274,80 +1371,13 @@ static void __exit bt_module_release(void)
|
||||
*/
|
||||
static int __init bt_module_init(void)
|
||||
{
|
||||
int mid = 0;
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
int ret;
|
||||
|
||||
g_bt_drv = kmalloc(sizeof(*g_bt_drv), GFP_KERNEL);
|
||||
if (unlikely(!g_bt_drv)) {
|
||||
BTDEV_DBG_ERR("bt_drv alloc failed");
|
||||
goto out_of_memory;
|
||||
}
|
||||
ret = __bt_module_base_init();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (unlikely(bt_cdev_region_init(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM) < 0)) {
|
||||
BTDEV_DBG_ERR("bt cdev region init failed");
|
||||
goto cdev_region_failed;
|
||||
}
|
||||
|
||||
g_bt_drv->devices_table = bt_table_init();
|
||||
if (unlikely(!g_bt_drv->devices_table)) {
|
||||
BTDEV_DBG_ERR("bt table init failed");
|
||||
goto table_init_failed;
|
||||
}
|
||||
|
||||
g_bt_drv->bt_class = bt_dev_class_create();
|
||||
if (unlikely(!g_bt_drv->bt_class)) {
|
||||
BTDEV_DBG_ERR("class create failed");
|
||||
goto class_create_failed;
|
||||
}
|
||||
|
||||
g_bt_drv->io_files = bt_create_io_files();
|
||||
if (unlikely(!g_bt_drv->io_files)) {
|
||||
BTDEV_DBG_ERR("bt create io files failed");
|
||||
goto io_files_create_failed;
|
||||
}
|
||||
|
||||
mutex_init(&g_bt_drv->bitmap_lock);
|
||||
g_bt_drv->bitmap = 0;
|
||||
|
||||
mutex_lock(&g_bt_drv->bitmap_lock);
|
||||
g_bt_drv->mng_file = bt_create_mng_file(mid);
|
||||
if (unlikely(!g_bt_drv->mng_file)) {
|
||||
BTDEV_DBG_ERR("bt create mng file failed");
|
||||
mutex_unlock(&g_bt_drv->bitmap_lock);
|
||||
goto mng_file_create_failed;
|
||||
}
|
||||
bt_set_bit(&g_bt_drv->bitmap, mid);
|
||||
mutex_unlock(&g_bt_drv->bitmap_lock);
|
||||
|
||||
entry = proc_create_data("bt_info_proc", 0, NULL, &g_bt_proc_fops, NULL);
|
||||
if (unlikely(!entry)) {
|
||||
BTDEV_DBG_ERR("create proc data failed");
|
||||
goto proc_create_failed;
|
||||
}
|
||||
|
||||
BTDEV_DBG("success");
|
||||
return OK;
|
||||
|
||||
proc_create_failed:
|
||||
bt_delete_mng_file(g_bt_drv->mng_file);
|
||||
|
||||
mng_file_create_failed:
|
||||
bt_delete_io_files(g_bt_drv);
|
||||
|
||||
io_files_create_failed:
|
||||
bt_dev_class_destroy(g_bt_drv->bt_class);
|
||||
|
||||
class_create_failed:
|
||||
bt_table_destroy(g_bt_drv);
|
||||
|
||||
table_init_failed:
|
||||
bt_cdev_region_destroy(BT_DEV_MAJOR, BT_VIRNET_MAX_NUM);
|
||||
|
||||
cdev_region_failed:
|
||||
kfree(g_bt_drv);
|
||||
|
||||
out_of_memory:
|
||||
return -1;
|
||||
return __bt_module_dev_create();
|
||||
}
|
||||
|
||||
module_init(bt_module_init);
|
||||
|
||||
@@ -172,7 +172,7 @@ static inline void bt_clear_bit(u32 *bitmap, u32 idx)
|
||||
*bitmap &= ~(1 << idx);
|
||||
}
|
||||
|
||||
#define SET_STATE(vn, st) bt_virnet_set_state(vn, st)
|
||||
#define set_state(vn, st) bt_virnet_set_state(vn, st)
|
||||
static inline void bt_virnet_set_state(struct bt_virnet *vn,
|
||||
enum bt_virnet_state state)
|
||||
{
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
#define BT_DEV_NAME_PREFIX "btdev"
|
||||
#define BT_DEV_PATH_PREFIX "/dev/" BT_DEV_NAME_PREFIX
|
||||
|
||||
#define BT_DEV_PATH(idx) (BT_DEV_PATH_PREFIX#idx)
|
||||
#define BT_DEV_NAME(idx) (BT_DEV_NAME_PREFIX#idx)
|
||||
#define bt_dev_path(idx) (BT_DEV_PATH_PREFIX#idx)
|
||||
#define bt_dev_name(idx) (BT_DEV_NAME_PREFIX#idx)
|
||||
|
||||
#define BT_DEV_NAME_MNG_FILE BT_DEV_NAME(0)
|
||||
#define BT_DEV_PATH_MNG_FILE BT_DEV_PATH(0)
|
||||
#define BT_DEV_NAME_IO_FILE(idx) BT_DEV_NAME(idx)
|
||||
#define BT_DEV_PATH_IO_FILE(idx) BT_DEV_PATH(idx)
|
||||
#define BT_VIRNET_NAME(idx) (BT_VIRNET_NAME_PREFIX#idx)
|
||||
#define BT_DEV_NAME_MNG_FILE bt_dev_name(0)
|
||||
#define BT_DEV_PATH_MNG_FILE bt_dev_path(0)
|
||||
#define bt_dev_name_to_file(idx) bt_dev_name(idx)
|
||||
#define bt_dev_path_to_file(idx) bt_dev_path(idx)
|
||||
#define bt_virnet_name(idx) (BT_VIRNET_NAME_PREFIX#idx)
|
||||
|
||||
#define BT_PATHNAME_MAX 256
|
||||
#define BT_VIRNET_MAX_NUM 16
|
||||
|
||||
@@ -17,7 +17,7 @@ config NEWIP_FAST_KEEPALIVE
|
||||
Support for NewIP fast keepalive.
|
||||
|
||||
config NEWIP_HOOKS
|
||||
def_bool NEWIP && VENDOR_HOOKS
|
||||
default n
|
||||
help
|
||||
Enable NewIP hooks implemented as tracepoints
|
||||
Allow NewIP modules to attach to tracepoint "hooks" defined via
|
||||
|
||||
@@ -12,25 +12,26 @@
|
||||
#ifdef CONFIG_NEWIP_HOOKS
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": [%s:%d] " fmt, __func__, __LINE__
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/hck/lite_hck_inet.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <net/ninet_hashtables.h> /* ninet_ehashfn */
|
||||
#include <net/if_ninet.h>
|
||||
#include <trace/hooks/inet.h>
|
||||
#include "tcp_nip_parameter.h"
|
||||
|
||||
/* call the newip hook function in sk_ehashfn function (net\ipv4\inet_hashtables.c):
|
||||
* if trace_vendor_ninet_ehashfn_enabled() then call trace_vendor_ninet_ehashfn function.
|
||||
*/
|
||||
void vendor_ninet_ehashfn(void *data, const struct sock *sk, u32 *ret)
|
||||
void nip_ninet_ehashfn(const struct sock *sk, u32 *ret)
|
||||
{
|
||||
*ret = ninet_ehashfn(sock_net(sk), &sk->sk_nip_rcv_saddr,
|
||||
sk->sk_num, &sk->sk_nip_daddr, sk->sk_dport);
|
||||
*ret = ninet_ehashfn(sock_net(sk), &sk->SK_NIP_RCV_SADDR,
|
||||
sk->sk_num, &sk->SK_NIP_DADDR, sk->sk_dport);
|
||||
}
|
||||
|
||||
/* call the newip hook function in inet_gifconf function (net\ipv4\devinet.c):
|
||||
* call the newip trace_vendor_ninet_gifconf function after the IPv4 process.
|
||||
*/
|
||||
void vendor_ninet_gifconf(void *data, struct net_device *dev,
|
||||
char __user *buf, int len, int size, int *ret)
|
||||
void nip_ninet_gifconf(struct net_device *dev,
|
||||
char __user *buf, int len, int size, int *ret)
|
||||
{
|
||||
if (*ret >= 0) {
|
||||
int done = ninet_gifconf(dev, buf + *ret, len - *ret, size);
|
||||
@@ -42,23 +43,28 @@ void vendor_ninet_gifconf(void *data, struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
int ninet_hooks_register(void)
|
||||
void nip_ninet_ehashfn_lhck_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = register_trace_vendor_ninet_ehashfn(&vendor_ninet_ehashfn, NULL);
|
||||
if (ret) {
|
||||
nip_dbg("failed to register to vendor_ninet_ehashfn");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = register_trace_vendor_ninet_gifconf(&vendor_ninet_gifconf, NULL);
|
||||
if (ret) {
|
||||
nip_dbg("failed to register to vendor_ninet_gifconf");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
REGISTER_HCK_LITE_HOOK(nip_ninet_ehashfn_lhck, nip_ninet_ehashfn);
|
||||
}
|
||||
|
||||
void nip_ninet_gifconf_lhck_register(void)
|
||||
{
|
||||
REGISTER_HCK_LITE_HOOK(nip_ninet_gifconf_lhck, nip_ninet_gifconf);
|
||||
}
|
||||
|
||||
void __init ninet_hooks_init(void)
|
||||
{
|
||||
nip_ninet_ehashfn_lhck_register();
|
||||
nip_ninet_gifconf_lhck_register();
|
||||
}
|
||||
|
||||
void __exit ninet_hooks_exit(void)
|
||||
{
|
||||
}
|
||||
|
||||
module_init(ninet_hooks_init);
|
||||
module_exit(ninet_hooks_exit);
|
||||
|
||||
#endif /* CONFIG_NEWIP_HOOKS */
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#define _NIP_HOOKS_REGISTER_H
|
||||
|
||||
#ifdef CONFIG_NEWIP_HOOKS
|
||||
int ninet_hooks_register(void);
|
||||
void __init ninet_hooks_init(void);
|
||||
#endif
|
||||
|
||||
#endif /* _NIP_HOOKS_REGISTER_H */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Based on include/uapi/linux/ipv6_route.h
|
||||
* Authors:
|
||||
* Pedro Roque <roque@di.fc.ul.pt>
|
||||
* Pedro Roque <roque@di.fc.ul.pt>
|
||||
*
|
||||
* Linux NewIP INET implementation
|
||||
*
|
||||
|
||||
+4
-4
@@ -39,12 +39,12 @@
|
||||
#define ETH_P_NEWIP 0xEADD /* NIP */
|
||||
|
||||
/* struct sock_common __sk_common */
|
||||
#define sk_nip_daddr __sk_common.nip_daddr
|
||||
#define sk_nip_rcv_saddr __sk_common.nip_rcv_saddr
|
||||
#define SK_NIP_DADDR __sk_common.nip_daddr
|
||||
#define SK_NIP_RCV_SADDR __sk_common.nip_rcv_saddr
|
||||
|
||||
/* struct request_sock req */
|
||||
#define ir_nip_rmt_addr req.__req_common.nip_daddr
|
||||
#define ir_nip_loc_addr req.__req_common.nip_rcv_saddr
|
||||
#define IR_NIP_RMT_ADDR req.__req_common.nip_daddr
|
||||
#define IR_NIP_LOC_ADDR req.__req_common.nip_rcv_saddr
|
||||
|
||||
struct nip_devconf {
|
||||
__s32 forwarding;
|
||||
|
||||
+4
-4
@@ -12,13 +12,13 @@
|
||||
|
||||
struct flow_nip {
|
||||
struct flowi_common __fl_common;
|
||||
#define flowin_oif __fl_common.flowic_oif
|
||||
#define flowin_iif __fl_common.flowic_iif
|
||||
#define FLOWIN_OIF __fl_common.flowic_oif
|
||||
#define FLOWIN_IIF __fl_common.flowic_iif
|
||||
struct nip_addr daddr;
|
||||
struct nip_addr saddr;
|
||||
union flowi_uli uli;
|
||||
#define fln_sport uli.ports.sport
|
||||
#define fln_dport uli.ports.dport
|
||||
#define FLN_SPORT uli.ports.sport
|
||||
#define FLN_DPORT uli.ports.dport
|
||||
} __attribute__((__aligned__(BITS_PER_LONG / 8)));
|
||||
|
||||
#endif
|
||||
|
||||
@@ -90,16 +90,16 @@ static inline struct sock *__ninet_lookup_skb(struct inet_hashinfo *hashinfo,
|
||||
return sk;
|
||||
|
||||
return __ninet_lookup(dev_net(skb->dev), hashinfo, skb,
|
||||
doff, &(NIPCB(skb)->srcaddr), sport,
|
||||
&(NIPCB(skb)->dstaddr), ntohs(dport),
|
||||
doff, &(nipcb(skb)->srcaddr), sport,
|
||||
&(nipcb(skb)->dstaddr), ntohs(dport),
|
||||
iif, refcounted);
|
||||
}
|
||||
|
||||
#define NINET_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \
|
||||
#define ninet_match(__sk, __net, __saddr, __daddr, __ports, __dif) \
|
||||
(((__sk)->sk_portpair == (__ports)) && \
|
||||
((__sk)->sk_family == AF_NINET) && \
|
||||
nip_addr_eq(&(__sk)->sk_nip_daddr, (__saddr)) && \
|
||||
nip_addr_eq(&(__sk)->sk_nip_rcv_saddr, (__daddr)) && \
|
||||
nip_addr_eq(&(__sk)->SK_NIP_DADDR, (__saddr)) && \
|
||||
nip_addr_eq(&(__sk)->SK_NIP_RCV_SADDR, (__daddr)) && \
|
||||
(!(__sk)->sk_bound_dev_if || \
|
||||
((__sk)->sk_bound_dev_if == (__dif))) && \
|
||||
net_eq(sock_net(__sk), (__net)))
|
||||
|
||||
+1
-1
@@ -56,7 +56,7 @@ struct ninet_protocol {
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
#define NIPCB(skb) ((struct ninet_skb_parm *)&(TCP_SKB_CB(skb)->header.hnip))
|
||||
#define nipcb(skb) ((struct ninet_skb_parm *)&(TCP_SKB_CB(skb)->header.hnip))
|
||||
|
||||
extern const struct ninet_protocol __rcu *ninet_protos[MAX_INET_PROTOS];
|
||||
extern const struct proto_ops ninet_dgram_ops;
|
||||
|
||||
+2
-2
@@ -43,7 +43,7 @@ struct nip_devreq {
|
||||
} devreq;
|
||||
};
|
||||
|
||||
#define nip_dev_addr devreq.addr /* nip address */
|
||||
#define nip_dev_flags devreq.flags /* net device flags */
|
||||
#define NIP_DEV_ADDR devreq.addr /* nip address */
|
||||
#define NIP_DEV_FLAGS devreq.flags /* net device flags */
|
||||
|
||||
#endif /* _UAPI_NEWIP_H */
|
||||
|
||||
+7
-12
@@ -52,7 +52,6 @@
|
||||
#include <linux/netlink.h>
|
||||
|
||||
#ifdef CONFIG_NEWIP_HOOKS
|
||||
#include <trace/hooks/inet.h>
|
||||
#include "nip_hooks_register.h"
|
||||
#endif
|
||||
#include "tcp_nip_parameter.h"
|
||||
@@ -160,8 +159,8 @@ static int ninet_create(struct net *net, struct socket *sock, int protocol,
|
||||
sk->sk_family = PF_NINET;
|
||||
sk->sk_protocol = protocol;
|
||||
sk->sk_backlog_rcv = answer->prot->backlog_rcv;
|
||||
sk->sk_nip_daddr = nip_any_addr;
|
||||
sk->sk_nip_rcv_saddr = nip_any_addr;
|
||||
sk->SK_NIP_DADDR = nip_any_addr;
|
||||
sk->SK_NIP_RCV_SADDR = nip_any_addr;
|
||||
|
||||
inet->uc_ttl = -1;
|
||||
inet->mc_loop = 1;
|
||||
@@ -231,7 +230,7 @@ int ninet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
goto out;
|
||||
}
|
||||
|
||||
sk->sk_nip_rcv_saddr = addr->sin_addr;
|
||||
sk->SK_NIP_RCV_SADDR = addr->sin_addr;
|
||||
|
||||
/* make sure we are allowed to bind here */
|
||||
if ((snum || !inet->bind_address_no_port) &&
|
||||
@@ -320,10 +319,10 @@ int ninet_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
peer == 1)
|
||||
return -ENOTCONN;
|
||||
sin->sin_port = inet->inet_dport;
|
||||
sin->sin_addr = sk->sk_nip_daddr;
|
||||
sin->sin_addr = sk->SK_NIP_DADDR;
|
||||
} else {
|
||||
sin->sin_port = inet->inet_sport;
|
||||
sin->sin_addr = sk->sk_nip_rcv_saddr;
|
||||
sin->sin_addr = sk->SK_NIP_RCV_SADDR;
|
||||
}
|
||||
return sizeof(*sin);
|
||||
}
|
||||
@@ -534,7 +533,7 @@ static int compat_select_ninet_ioctl(struct socket *sock, unsigned int cmd,
|
||||
static int __ninet_ioctl_cmd(struct socket *sock, unsigned int cmd,
|
||||
void __user *iov_base, __kernel_size_t iov_len)
|
||||
{
|
||||
unsigned long arg = (unsigned long)(iov_base + NINET_IOCTL_HEAD_LEN);
|
||||
unsigned long arg = (unsigned long)((char *)iov_base + NINET_IOCTL_HEAD_LEN);
|
||||
#ifdef CONFIG_COMPAT
|
||||
int arglen = iov_len - NINET_IOCTL_HEAD_LEN;
|
||||
|
||||
@@ -803,11 +802,7 @@ static int __init ninet_init(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NEWIP_HOOKS
|
||||
err = ninet_hooks_register();
|
||||
if (err) {
|
||||
nip_dbg("failed to register to nip hooks");
|
||||
goto nip_packet_fail;
|
||||
}
|
||||
ninet_hooks_init();
|
||||
#endif
|
||||
nip_dbg("init newip address family ok");
|
||||
|
||||
|
||||
+16
-17
@@ -111,18 +111,18 @@ static inline u32 nip_portaddr_hash(const struct net *net,
|
||||
const struct nip_addr *saddr,
|
||||
unsigned int port)
|
||||
{
|
||||
u32 v = (__force u32)saddr->nip_addr_field32[0] ^ (__force u32)saddr->nip_addr_field32[1];
|
||||
u32 v = (__force u32)saddr->NIP_ADDR_FIELD32[0] ^ (__force u32)saddr->NIP_ADDR_FIELD32[1];
|
||||
|
||||
return jhash_1word(v, net_hash_mix(net)) ^ port;
|
||||
}
|
||||
|
||||
static u32 __nip_addr_jhash(const struct nip_addr *a, const u32 initval)
|
||||
{
|
||||
u32 v = (__force u32)a->nip_addr_field32[0] ^ (__force u32)a->nip_addr_field32[1];
|
||||
u32 v = (__force u32)a->NIP_ADDR_FIELD32[0] ^ (__force u32)a->NIP_ADDR_FIELD32[1];
|
||||
|
||||
return jhash_3words(v,
|
||||
(__force u32)a->nip_addr_field32[0],
|
||||
(__force u32)a->nip_addr_field32[1],
|
||||
(__force u32)a->NIP_ADDR_FIELD32[0],
|
||||
(__force u32)a->NIP_ADDR_FIELD32[1],
|
||||
initval);
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ static struct inet_listen_hashbucket *
|
||||
ninet_lhash2_bucket_sk(struct inet_hashinfo *h, struct sock *sk)
|
||||
{
|
||||
u32 hash = nip_portaddr_hash(sock_net(sk),
|
||||
&sk->sk_nip_rcv_saddr,
|
||||
&sk->SK_NIP_RCV_SADDR,
|
||||
inet_sk(sk)->inet_num);
|
||||
return inet_lhash2_bucket(h, hash);
|
||||
}
|
||||
@@ -173,7 +173,7 @@ u32 ninet_ehashfn(const struct net *net,
|
||||
net_get_random_once(&ninet_hash_secret, sizeof(ninet_hash_secret));
|
||||
|
||||
/* Ipv6 uses S6_ADdr32 [3], the last 32bits of the address */
|
||||
lhash = (__force u32)laddr->nip_addr_field32[0];
|
||||
lhash = (__force u32)laddr->NIP_ADDR_FIELD32[0];
|
||||
fhash = __nip_addr_jhash(faddr, ninet_hash_secret);
|
||||
|
||||
return __ninet_ehashfn(lhash, lport, fhash, fport,
|
||||
@@ -321,14 +321,14 @@ begin:
|
||||
sk_nulls_for_each_rcu(sk, node, &head->chain) {
|
||||
if (sk->sk_hash != hash)
|
||||
continue;
|
||||
if (!NINET_MATCH(sk, net, saddr, daddr, ports, dif))
|
||||
if (!ninet_match(sk, net, saddr, daddr, ports, dif))
|
||||
continue;
|
||||
if (unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) {
|
||||
nip_dbg("sk->sk_refcnt == 0");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(!NINET_MATCH(sk, net, saddr, daddr, ports, dif))) {
|
||||
if (unlikely(!ninet_match(sk, net, saddr, daddr, ports, dif))) {
|
||||
sock_gen_put(sk);
|
||||
goto begin;
|
||||
}
|
||||
@@ -352,8 +352,8 @@ static inline int nip_tcp_compute_score(struct sock *sk, struct net *net,
|
||||
if (inet_sk(sk)->inet_num == hnum && sk->sk_family == PF_NINET &&
|
||||
net_eq(sock_net(sk), net)) {
|
||||
score = 1;
|
||||
if (!nip_addr_eq(&sk->sk_nip_rcv_saddr, &nip_any_addr)) {
|
||||
if (!nip_addr_eq(&sk->sk_nip_rcv_saddr, daddr))
|
||||
if (!nip_addr_eq(&sk->SK_NIP_RCV_SADDR, &nip_any_addr)) {
|
||||
if (!nip_addr_eq(&sk->SK_NIP_RCV_SADDR, daddr))
|
||||
return -1;
|
||||
score++;
|
||||
}
|
||||
@@ -448,9 +448,8 @@ static int __ninet_check_established(struct inet_timewait_death_row *death_row,
|
||||
{
|
||||
struct inet_hashinfo *hinfo = death_row->hashinfo;
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
struct nip_addr *daddr = &sk->sk_nip_rcv_saddr;
|
||||
struct nip_addr *saddr = &sk->sk_nip_daddr;
|
||||
int dif = sk->sk_bound_dev_if;
|
||||
struct nip_addr *daddr = &sk->SK_NIP_RCV_SADDR;
|
||||
struct nip_addr *saddr = &sk->SK_NIP_DADDR;
|
||||
struct net *net = sock_net(sk);
|
||||
const __portpair ports = INET_COMBINED_PORTS(inet->inet_dport, lport);
|
||||
unsigned int hash = ninet_ehashfn(net, daddr, lport,
|
||||
@@ -466,8 +465,8 @@ static int __ninet_check_established(struct inet_timewait_death_row *death_row,
|
||||
if (sk2->sk_hash != hash)
|
||||
continue;
|
||||
|
||||
if (likely(NINET_MATCH(sk2, net,
|
||||
saddr, daddr, ports, dif))) {
|
||||
if (likely(ninet_match(sk2, net,
|
||||
saddr, daddr, ports, sk->sk_bound_dev_if))) {
|
||||
nip_dbg("found same sk in ehash");
|
||||
goto not_unique;
|
||||
}
|
||||
@@ -496,8 +495,8 @@ static u64 ninet_sk_port_offset(const struct sock *sk)
|
||||
{
|
||||
const struct inet_sock *inet = inet_sk(sk);
|
||||
|
||||
return secure_newip_port_ephemeral(sk->sk_nip_rcv_saddr.nip_addr_field32,
|
||||
sk->sk_nip_daddr.nip_addr_field32,
|
||||
return secure_newip_port_ephemeral(sk->SK_NIP_RCV_SADDR.NIP_ADDR_FIELD32,
|
||||
sk->SK_NIP_DADDR.NIP_ADDR_FIELD32,
|
||||
inet->inet_dport);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -724,7 +724,7 @@ static int nip_addr_proc_show(struct seq_file *seq, void *v)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < ifp->addr.bitlen / NIP_ADDR_BIT_LEN_8; j++)
|
||||
seq_printf(seq, "%02x", ifp->addr.nip_addr_field8[j]);
|
||||
seq_printf(seq, "%02x", ifp->addr.NIP_ADDR_FIELD8[j]);
|
||||
seq_printf(seq, "\t%8s\n", ifp->idev->dev ? ifp->idev->dev->name : "");
|
||||
}
|
||||
|
||||
@@ -842,7 +842,7 @@ int nip_addrconf_get_ifaddr(struct net *net, unsigned int cmd, void __user *arg)
|
||||
goto out;
|
||||
|
||||
ifr.nip_ifr_name[IFNAMSIZ - 1] = 0;
|
||||
snin = (struct sockaddr_nin *)&ifr.nip_dev_addr;
|
||||
snin = (struct sockaddr_nin *)&ifr.NIP_DEV_ADDR;
|
||||
|
||||
nip_dbg("dev name is %s", ifr.nip_ifr_name);
|
||||
dev_load(net, ifr.nip_ifr_name);
|
||||
@@ -886,7 +886,7 @@ void nip_addr_to_str(const struct nip_addr *addr, unsigned char *buf, int buf_le
|
||||
|
||||
total_len = sprintf(buf, "%s", "0x");
|
||||
for (i = 0; (i < addr_num) && (total_len < buf_len); i++) {
|
||||
int len = sprintf(buf + total_len, "%02x", addr->nip_addr_field8[i]);
|
||||
int len = sprintf(buf + total_len, "%02x", addr->NIP_ADDR_FIELD8[i]);
|
||||
|
||||
if (len <= 0)
|
||||
break;
|
||||
|
||||
+8
-8
@@ -8,7 +8,7 @@
|
||||
* Changes
|
||||
*
|
||||
* Mitsuru KANDA @USAGI and
|
||||
* YOSHIFUJI Hideaki @USAGI: Remove ipv6_parse_exthdrs().
|
||||
* YOSHIFUJI Hideaki @USAGI: Remove ipv6_parse_exthdrs().
|
||||
*
|
||||
* NewIP input
|
||||
* Linux NewIP INET implementation
|
||||
@@ -63,8 +63,8 @@ static int nip_rcv_finish(struct sk_buff *skb)
|
||||
if (net->ipv4.sysctl_ip_early_demux && !skb_dst(skb) && !skb->sk) {
|
||||
const struct ninet_protocol *ipprot;
|
||||
|
||||
nip_dbg("try to early demux skb, nexthdr=0x%x", NIPCB(skb)->nexthdr);
|
||||
ipprot = rcu_dereference(ninet_protos[NIPCB(skb)->nexthdr]);
|
||||
nip_dbg("try to early demux skb, nexthdr=0x%x", nipcb(skb)->nexthdr);
|
||||
ipprot = rcu_dereference(ninet_protos[nipcb(skb)->nexthdr]);
|
||||
if (ipprot)
|
||||
edemux = READ_ONCE(ipprot->early_demux);
|
||||
if (edemux)
|
||||
@@ -99,7 +99,7 @@ int nip_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
if (!skb)
|
||||
goto out;
|
||||
|
||||
memset(NIPCB(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
memset(nipcb(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
offset = nip_hdr_parse(skb->data, skb->len, &niph);
|
||||
if (offset <= 0) {
|
||||
nip_dbg("check in failure, errcode=%d, Drop a packet (nexthdr=%u, hdr_len=%u)",
|
||||
@@ -114,9 +114,9 @@ int nip_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
}
|
||||
|
||||
niph.total_len = ntohs(niph.total_len);
|
||||
NIPCB(skb)->dstaddr = niph.daddr;
|
||||
NIPCB(skb)->srcaddr = niph.saddr;
|
||||
NIPCB(skb)->nexthdr = niph.nexthdr;
|
||||
nipcb(skb)->dstaddr = niph.daddr;
|
||||
nipcb(skb)->srcaddr = niph.saddr;
|
||||
nipcb(skb)->nexthdr = niph.nexthdr;
|
||||
skb->transport_header = skb->network_header + offset;
|
||||
skb_orphan(skb);
|
||||
|
||||
@@ -142,7 +142,7 @@ void nip_protocol_deliver_rcu(struct sk_buff *skb)
|
||||
if (!pskb_pull(skb, skb_transport_offset(skb)))
|
||||
goto discard;
|
||||
|
||||
ipprot = rcu_dereference(ninet_protos[NIPCB(skb)->nexthdr]);
|
||||
ipprot = rcu_dereference(ninet_protos[nipcb(skb)->nexthdr]);
|
||||
if (ipprot) {
|
||||
ipprot->handler(skb);
|
||||
} else {
|
||||
|
||||
+19
-19
@@ -77,7 +77,7 @@ int nip_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
skb->dev = dev;
|
||||
|
||||
/* prepare to build ethernet header */
|
||||
nexthop = nip_nexthop((struct nip_rt_info *)dst, &NIPCB(skb)->dstaddr);
|
||||
nexthop = nip_nexthop((struct nip_rt_info *)dst, &nipcb(skb)->dstaddr);
|
||||
|
||||
rcu_read_lock_bh();
|
||||
|
||||
@@ -134,8 +134,8 @@ unsigned short nip_get_output_checksum(struct sk_buff *skb,
|
||||
unsigned short check_len = head->trans_hdr_len + head->usr_data_len;
|
||||
|
||||
nph.nexthdr = IPPROTO_UDP;
|
||||
nph.saddr = NIPCB(skb)->srcaddr;
|
||||
nph.daddr = NIPCB(skb)->dstaddr;
|
||||
nph.saddr = nipcb(skb)->srcaddr;
|
||||
nph.daddr = nipcb(skb)->dstaddr;
|
||||
nph.check_len = htons(check_len);
|
||||
return nip_check_sum_build(udp_hdr, check_len, &nph);
|
||||
}
|
||||
@@ -165,7 +165,7 @@ static struct sk_buff *_nip_alloc_skb(struct sock *sk,
|
||||
dst_hold(dst);
|
||||
nip_dbg("malloc_len=%d, dst->__refcnt=%u", len, atomic_read(&dst->__refcnt));
|
||||
skb_dst_set(skb, dst);
|
||||
memset(NIPCB(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
memset(nipcb(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
|
||||
return skb;
|
||||
}
|
||||
@@ -196,9 +196,9 @@ static int _nip_udp_single_output(struct sock *sk,
|
||||
head->hdr_buf = skb->data;
|
||||
nip_hdr_udp_encap(head);
|
||||
skb_reserve(skb, head->hdr_buf_pos);
|
||||
NIPCB(skb)->dstaddr = head->daddr;
|
||||
NIPCB(skb)->srcaddr = head->saddr;
|
||||
NIPCB(skb)->nexthdr = IPPROTO_UDP;
|
||||
nipcb(skb)->dstaddr = head->daddr;
|
||||
nipcb(skb)->srcaddr = head->saddr;
|
||||
nipcb(skb)->nexthdr = IPPROTO_UDP;
|
||||
|
||||
/* Fill in the Transport Layer Header (UDP) */
|
||||
skb_reset_transport_header(skb);
|
||||
@@ -292,7 +292,7 @@ static int nip_sk_dst_check(struct dst_entry *dst,
|
||||
if (!dst)
|
||||
goto out;
|
||||
|
||||
if (fln->flowin_oif && fln->flowin_oif != dst->dev->ifindex)
|
||||
if (fln->FLOWIN_OIF && fln->FLOWIN_OIF != dst->dev->ifindex)
|
||||
err = -EPERM;
|
||||
|
||||
out:
|
||||
@@ -385,8 +385,8 @@ int tcp_nip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
||||
skb->protocol = htons(ETH_P_NEWIP);
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb->csum = 0;
|
||||
saddr = &sk->sk_nip_rcv_saddr;
|
||||
daddr = &sk->sk_nip_daddr;
|
||||
saddr = &sk->SK_NIP_RCV_SADDR;
|
||||
daddr = &sk->SK_NIP_DADDR;
|
||||
|
||||
head.saddr = *saddr;
|
||||
head.daddr = *daddr;
|
||||
@@ -397,7 +397,7 @@ int tcp_nip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
||||
head.total_len = head.hdr_buf_pos + skb->len;
|
||||
nip_update_total_len(&head, htons(head.total_len));
|
||||
|
||||
fln.daddr = sk->sk_nip_daddr;
|
||||
fln.daddr = sk->SK_NIP_DADDR;
|
||||
dst = __sk_dst_check(sk, 0);
|
||||
if (!dst) {
|
||||
nip_dbg("no dst cache for sk, search newip rt");
|
||||
@@ -417,9 +417,9 @@ int tcp_nip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)
|
||||
memcpy(skb->data, head.hdr_buf, head.hdr_buf_pos);
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
NIPCB(skb)->srcaddr = *saddr;
|
||||
NIPCB(skb)->dstaddr = *daddr;
|
||||
NIPCB(skb)->nexthdr = head.nexthdr;
|
||||
nipcb(skb)->srcaddr = *saddr;
|
||||
nipcb(skb)->dstaddr = *daddr;
|
||||
nipcb(skb)->nexthdr = head.nexthdr;
|
||||
|
||||
skb->priority = sk->sk_priority;
|
||||
head.total_len = skb->len;
|
||||
@@ -471,8 +471,8 @@ void tcp_nip_actual_send_reset(struct sock *sk, struct sk_buff *skb, u32 seq,
|
||||
skb_reserve(buff, MAX_TCP_HEADER);
|
||||
|
||||
buff->sk = sk; // sk could be NULL
|
||||
saddr = &(NIPCB(skb)->dstaddr);
|
||||
daddr = &(NIPCB(skb)->srcaddr);
|
||||
saddr = &(nipcb(skb)->dstaddr);
|
||||
daddr = &(nipcb(skb)->srcaddr);
|
||||
|
||||
/* Fill in tcp header */
|
||||
t1 = skb_push(buff, sizeof(struct tcphdr));
|
||||
@@ -520,9 +520,9 @@ void tcp_nip_actual_send_reset(struct sock *sk, struct sk_buff *skb, u32 seq,
|
||||
memcpy(buff->data, head.hdr_buf, head.hdr_buf_pos);
|
||||
|
||||
skb_reset_network_header(buff);
|
||||
NIPCB(buff)->srcaddr = *saddr;
|
||||
NIPCB(buff)->dstaddr = *daddr;
|
||||
NIPCB(buff)->nexthdr = head.nexthdr;
|
||||
nipcb(buff)->srcaddr = *saddr;
|
||||
nipcb(buff)->dstaddr = *daddr;
|
||||
nipcb(buff)->nexthdr = head.nexthdr;
|
||||
|
||||
buff->priority = priority;
|
||||
head.total_len = buff->len;
|
||||
|
||||
+10
-10
@@ -237,9 +237,9 @@ bool nip_get_nndisc_rcv_checksum(struct sk_buff *skb,
|
||||
struct nip_pseudo_header nph = {0};
|
||||
unsigned short check_len = (unsigned short)(transport_tail - (skb_transport_header(skb)));
|
||||
|
||||
nph.nexthdr = NIPCB(skb)->nexthdr;
|
||||
nph.saddr = NIPCB(skb)->srcaddr;
|
||||
nph.daddr = NIPCB(skb)->dstaddr;
|
||||
nph.nexthdr = nipcb(skb)->nexthdr;
|
||||
nph.saddr = nipcb(skb)->srcaddr;
|
||||
nph.daddr = nipcb(skb)->dstaddr;
|
||||
nph.check_len = htons(check_len);
|
||||
|
||||
return nip_check_sum_parse(skb_transport_header(skb), check_len, &nph)
|
||||
@@ -327,11 +327,11 @@ static struct sk_buff *nndisc_alloc_skb(struct net_device *dev,
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
skb->csum = 0;
|
||||
skb->dev = dev;
|
||||
memset(NIPCB(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
memset(nipcb(skb), 0, sizeof(struct ninet_skb_parm));
|
||||
|
||||
NIPCB(skb)->dstaddr = head->daddr;
|
||||
NIPCB(skb)->srcaddr = head->saddr;
|
||||
NIPCB(skb)->nexthdr = head->nexthdr;
|
||||
nipcb(skb)->dstaddr = head->daddr;
|
||||
nipcb(skb)->srcaddr = head->saddr;
|
||||
nipcb(skb)->nexthdr = head->nexthdr;
|
||||
/* reserve space for hardware header */
|
||||
skb_reserve(skb, NIP_ETH_HDR_LEN);
|
||||
skb_reset_network_header(skb);
|
||||
@@ -523,13 +523,13 @@ int nndisc_rcv_ns(struct sk_buff *skb)
|
||||
goto out;
|
||||
}
|
||||
|
||||
neigh = __neigh_lookup(&nnd_tbl, &NIPCB(skb)->srcaddr, dev, lladdr || !dev->addr_len);
|
||||
neigh = __neigh_lookup(&nnd_tbl, &nipcb(skb)->srcaddr, dev, lladdr || !dev->addr_len);
|
||||
if (neigh) {
|
||||
neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE, 0);
|
||||
neigh_release(neigh);
|
||||
}
|
||||
|
||||
nndisc_send_na(dev, &NIPCB(skb)->srcaddr, &addr);
|
||||
nndisc_send_na(dev, &nipcb(skb)->srcaddr, &addr);
|
||||
out:
|
||||
kfree_skb(skb);
|
||||
return err;
|
||||
@@ -555,7 +555,7 @@ int nndisc_rcv_na(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
neigh = neigh_lookup(&nnd_tbl, &NIPCB(skb)->srcaddr, dev);
|
||||
neigh = neigh_lookup(&nnd_tbl, &nipcb(skb)->srcaddr, dev);
|
||||
if (neigh) {
|
||||
neigh_update(neigh, lladdr, NUD_REACHABLE, NEIGH_UPDATE_F_OVERRIDE, 0);
|
||||
neigh_release(neigh);
|
||||
|
||||
+7
-7
@@ -311,7 +311,7 @@ static struct nip_rt_info *nip_pol_route_input(struct net *net,
|
||||
struct nip_fib_table *table,
|
||||
struct flow_nip *fln, int flags)
|
||||
{
|
||||
return nip_pol_route(net, table, fln->flowin_iif, fln, flags);
|
||||
return nip_pol_route(net, table, fln->FLOWIN_IIF, fln, flags);
|
||||
}
|
||||
|
||||
struct dst_entry *nip_route_input_lookup(struct net *net,
|
||||
@@ -326,9 +326,9 @@ int nip_route_input(struct sk_buff *skb)
|
||||
struct net *net = dev_net(skb->dev);
|
||||
int flags = 0;
|
||||
struct flow_nip fln = {
|
||||
.flowin_iif = skb->skb_iif,
|
||||
.daddr = NIPCB(skb)->dstaddr,
|
||||
.saddr = NIPCB(skb)->srcaddr,
|
||||
.FLOWIN_IIF = skb->skb_iif,
|
||||
.daddr = nipcb(skb)->dstaddr,
|
||||
.saddr = nipcb(skb)->srcaddr,
|
||||
};
|
||||
struct dst_entry *out_dst;
|
||||
int tbl_type = 0;
|
||||
@@ -366,7 +366,7 @@ static struct nip_rt_info *nip_pol_route_output(struct net *net,
|
||||
struct nip_fib_table *table,
|
||||
struct flow_nip *fln, int flags)
|
||||
{
|
||||
return nip_pol_route(net, table, fln->flowin_oif, fln, flags);
|
||||
return nip_pol_route(net, table, fln->FLOWIN_OIF, fln, flags);
|
||||
}
|
||||
|
||||
struct dst_entry *nip_route_output_flags(struct net *net, const struct sock *sk,
|
||||
@@ -717,7 +717,7 @@ static inline const void *nip_choose_neigh_daddr(struct nip_rt_info *rt,
|
||||
if (rt->rt_flags & RTF_GATEWAY)
|
||||
return (const void *)p;
|
||||
else if (skb)
|
||||
return &NIPCB(skb)->dstaddr;
|
||||
return &nipcb(skb)->dstaddr;
|
||||
return daddr;
|
||||
}
|
||||
|
||||
@@ -961,7 +961,7 @@ static void seq_printf_nipaddr_to_proc(struct seq_file *seq,
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < addr->bitlen / NIP_ADDR_BIT_LEN_8; i++)
|
||||
seq_printf(seq, "%02x", addr->nip_addr_field8[i]);
|
||||
seq_printf(seq, "%02x", addr->NIP_ADDR_FIELD8[i]);
|
||||
|
||||
seq_puts(seq, "\t");
|
||||
}
|
||||
|
||||
+26
-25
@@ -402,7 +402,7 @@
|
||||
#include "nip_checksum.h"
|
||||
#include "tcp_nip_parameter.h"
|
||||
|
||||
#define TCP_HEADER_LENGTH(th) ((th)->doff << 2)
|
||||
#define tcp_header_length(th) ((th)->doff << 2)
|
||||
#define TCP_ACK_NUM_MULTIPLIER 20
|
||||
#define TCP_WINDOW_RAISE_THRESHOLD 2
|
||||
#define TCP_BACKLOG_HEADROOM (64 * 1024)
|
||||
@@ -437,9 +437,9 @@ bool nip_get_tcp_input_checksum(struct sk_buff *skb)
|
||||
{
|
||||
struct nip_pseudo_header nph = {0};
|
||||
|
||||
nph.nexthdr = NIPCB(skb)->nexthdr;
|
||||
nph.saddr = NIPCB(skb)->srcaddr;
|
||||
nph.daddr = NIPCB(skb)->dstaddr;
|
||||
nph.nexthdr = nipcb(skb)->nexthdr;
|
||||
nph.saddr = nipcb(skb)->srcaddr;
|
||||
nph.daddr = nipcb(skb)->dstaddr;
|
||||
|
||||
nph.check_len = htons(skb->len);
|
||||
return nip_check_sum_parse(skb_transport_header(skb),
|
||||
@@ -583,8 +583,8 @@ static void tcp_nip_init_req(struct request_sock *req,
|
||||
{
|
||||
struct inet_request_sock *ireq = inet_rsk(req);
|
||||
|
||||
ireq->ir_nip_rmt_addr = NIPCB(skb)->srcaddr;
|
||||
ireq->ir_nip_loc_addr = NIPCB(skb)->dstaddr;
|
||||
ireq->IR_NIP_RMT_ADDR = nipcb(skb)->srcaddr;
|
||||
ireq->IR_NIP_LOC_ADDR = nipcb(skb)->dstaddr;
|
||||
}
|
||||
|
||||
/* Function
|
||||
@@ -596,8 +596,8 @@ static void tcp_nip_init_req(struct request_sock *req,
|
||||
*/
|
||||
static __u32 tcp_nip_init_sequence(const struct sk_buff *skb)
|
||||
{
|
||||
return secure_tcp_nip_sequence_number(NIPCB(skb)->dstaddr.nip_addr_field32,
|
||||
NIPCB(skb)->srcaddr.nip_addr_field32,
|
||||
return secure_tcp_nip_sequence_number(nipcb(skb)->dstaddr.NIP_ADDR_FIELD32,
|
||||
nipcb(skb)->srcaddr.NIP_ADDR_FIELD32,
|
||||
tcp_hdr(skb)->dest,
|
||||
tcp_hdr(skb)->source);
|
||||
}
|
||||
@@ -610,7 +610,7 @@ static struct dst_entry *tcp_nip_route_req(const struct sock *sk,
|
||||
struct inet_request_sock *ireq = inet_rsk(req);
|
||||
struct flow_nip fln;
|
||||
|
||||
fln.daddr = ireq->ir_nip_rmt_addr;
|
||||
fln.daddr = ireq->IR_NIP_RMT_ADDR;
|
||||
dst = nip_route_output(sock_net(sk), sk, &fln);
|
||||
return dst;
|
||||
}
|
||||
@@ -653,7 +653,7 @@ static int tcp_nip_connect(struct sock *sk, struct sockaddr *uaddr,
|
||||
|
||||
/* Find the route and obtain the source address */
|
||||
nip_dbg("sk->sk_bound_dev_if is %d", sk->sk_bound_dev_if);
|
||||
fln.flowin_oif = sk->sk_bound_dev_if;
|
||||
fln.FLOWIN_OIF = sk->sk_bound_dev_if;
|
||||
dst = nip_dst_lookup_flow(sock_net(sk), sk, &fln, NULL);
|
||||
if (IS_ERR(dst)) {
|
||||
nip_dbg("cannot find dst");
|
||||
@@ -661,10 +661,10 @@ static int tcp_nip_connect(struct sock *sk, struct sockaddr *uaddr,
|
||||
goto failure;
|
||||
}
|
||||
|
||||
/* find the actual source addr for sk->sk_nip_rcv_saddr */
|
||||
if (nip_addr_eq(&sk->sk_nip_rcv_saddr, &nip_any_addr))
|
||||
sk->sk_nip_rcv_saddr = fln.saddr;
|
||||
fln.saddr = sk->sk_nip_rcv_saddr;
|
||||
/* find the actual source addr for sk->SK_NIP_RCV_SADDR */
|
||||
if (nip_addr_eq(&sk->SK_NIP_RCV_SADDR, &nip_any_addr))
|
||||
sk->SK_NIP_RCV_SADDR = fln.saddr;
|
||||
fln.saddr = sk->SK_NIP_RCV_SADDR;
|
||||
|
||||
if (nip_addr_invalid(&fln.daddr)) {
|
||||
nip_dbg("nip daddr invalid, bitlen=%u", fln.daddr.bitlen);
|
||||
@@ -680,7 +680,7 @@ static int tcp_nip_connect(struct sock *sk, struct sockaddr *uaddr,
|
||||
|
||||
/* The destination address and port are set to the transport control block */
|
||||
inet->inet_dport = usin->sin_port;
|
||||
sk->sk_nip_daddr = usin->sin_addr;
|
||||
sk->SK_NIP_DADDR = usin->sin_addr;
|
||||
|
||||
inet_csk(sk)->icsk_ext_hdr_len = 0;
|
||||
if (inet_opt)
|
||||
@@ -707,8 +707,8 @@ static int tcp_nip_connect(struct sock *sk, struct sockaddr *uaddr,
|
||||
|
||||
if (!tp->write_seq)
|
||||
tp->write_seq =
|
||||
secure_tcp_nip_sequence_number(sk->sk_nip_rcv_saddr.nip_addr_field32,
|
||||
sk->sk_nip_daddr.nip_addr_field32,
|
||||
secure_tcp_nip_sequence_number(sk->SK_NIP_RCV_SADDR.NIP_ADDR_FIELD32,
|
||||
sk->SK_NIP_DADDR.NIP_ADDR_FIELD32,
|
||||
inet->inet_sport,
|
||||
usin->sin_port);
|
||||
|
||||
@@ -746,7 +746,7 @@ static void tcp_nip_send_reset(struct sock *sk, struct sk_buff *skb)
|
||||
seq = ntohl(th->ack_seq);
|
||||
else
|
||||
ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
|
||||
TCP_HEADER_LENGTH(th);
|
||||
tcp_header_length(th);
|
||||
|
||||
tcp_nip_actual_send_reset(sk, skb, seq, ack_seq, 0, 1, priority);
|
||||
}
|
||||
@@ -870,7 +870,7 @@ static struct sock *tcp_nip_syn_recv_sock(const struct sock *sk, struct sk_buff
|
||||
if (sk_acceptq_is_full(sk))
|
||||
goto out_overflow;
|
||||
|
||||
fln.daddr = ireq->ir_nip_rmt_addr;
|
||||
fln.daddr = ireq->IR_NIP_RMT_ADDR;
|
||||
if (!dst) {
|
||||
dst = nip_route_output(sock_net(sk), sk, &fln);
|
||||
if (!dst)
|
||||
@@ -890,8 +890,8 @@ static struct sock *tcp_nip_syn_recv_sock(const struct sock *sk, struct sk_buff
|
||||
newtp = tcp_sk(newsk);
|
||||
newinet = inet_sk(newsk);
|
||||
|
||||
newsk->sk_nip_daddr = ireq->ir_nip_rmt_addr;
|
||||
newsk->sk_nip_rcv_saddr = ireq->ir_nip_loc_addr;
|
||||
newsk->SK_NIP_DADDR = ireq->IR_NIP_RMT_ADDR;
|
||||
newsk->SK_NIP_RCV_SADDR = ireq->IR_NIP_LOC_ADDR;
|
||||
|
||||
newinet->inet_opt = NULL;
|
||||
|
||||
@@ -1842,8 +1842,8 @@ static void tcp_nip_early_demux(struct sk_buff *skb)
|
||||
return;
|
||||
|
||||
sk = __ninet_lookup_established(dev_net(skb->dev), &tcp_hashinfo,
|
||||
&NIPCB(skb)->srcaddr, th->source,
|
||||
&NIPCB(skb)->dstaddr, ntohs(th->dest), skb->skb_iif);
|
||||
&nipcb(skb)->srcaddr, th->source,
|
||||
&nipcb(skb)->dstaddr, ntohs(th->dest), skb->skb_iif);
|
||||
if (sk) {
|
||||
skb->sk = sk;
|
||||
skb->destructor = sock_edemux;
|
||||
@@ -1990,8 +1990,9 @@ struct sock *ninet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
|
||||
u32 sk_max_ack_backlog = READ_ONCE(sk->sk_max_ack_backlog);
|
||||
|
||||
newsk = inet_csk_accept(sk, flags, err, kern);
|
||||
nip_dbg("accept %s, sk_ack_backlog_last=%u, sk_max_ack_backlog=%u",
|
||||
(newsk ? "ok" : "fail"), sk_ack_backlog_last, sk_max_ack_backlog);
|
||||
nip_dbg("accept %s, sk_ack_backlog_last=%u, sk_max_ack_backlog=%u, err=%d",
|
||||
(newsk ? "ok" : "fail"), sk_ack_backlog_last, sk_max_ack_backlog,
|
||||
*err);
|
||||
|
||||
return newsk;
|
||||
}
|
||||
|
||||
+11
-11
@@ -84,7 +84,7 @@ static inline int __tcp_nip_mtu_to_mss(struct sock *sk, int pmtu)
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
int mss_now;
|
||||
int nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &sk->sk_nip_rcv_saddr, &sk->sk_nip_daddr);
|
||||
int nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &sk->SK_NIP_RCV_SADDR, &sk->SK_NIP_DADDR);
|
||||
|
||||
/* Calculate base mss without TCP options: It is MMS_S - sizeof(tcphdr) of rfc1122 */
|
||||
nip_hdr_len = nip_hdr_len == 0 ? NIP_HDR_MAX : nip_hdr_len;
|
||||
@@ -393,8 +393,8 @@ static __u16 tcp_nip_advertise_mss(struct sock *sk)
|
||||
}
|
||||
|
||||
mtu = dst_mtu(dst);
|
||||
nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &sk->sk_nip_rcv_saddr,
|
||||
&sk->sk_nip_daddr);
|
||||
nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &sk->SK_NIP_RCV_SADDR,
|
||||
&sk->SK_NIP_DADDR);
|
||||
nip_hdr_len = nip_hdr_len == 0 ? NIP_HDR_MAX : nip_hdr_len;
|
||||
nip_mss = mtu - nip_hdr_len - sizeof(struct tcphdr);
|
||||
if (nip_mss > mss) {
|
||||
@@ -577,7 +577,7 @@ static int __tcp_nip_transmit_skb(struct sock *sk, struct sk_buff *skb,
|
||||
sk->sk_rcvbuf, atomic_read(&sk->sk_rmem_alloc), ack, skb->len);
|
||||
|
||||
/* Fill in checksum */
|
||||
check = nip_get_output_checksum_tcp(skb, sk->sk_nip_rcv_saddr, sk->sk_nip_daddr);
|
||||
check = nip_get_output_checksum_tcp(skb, sk->SK_NIP_RCV_SADDR, sk->SK_NIP_DADDR);
|
||||
th->check = htons(check);
|
||||
|
||||
if (likely(tcb->tcp_flags & TCPHDR_ACK))
|
||||
@@ -759,7 +759,7 @@ static int get_nip_mss(const struct sock *sk, struct dst_entry *dst, struct requ
|
||||
mss = user_mss;
|
||||
|
||||
mtu = dst_mtu(dst);
|
||||
nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &ireq->ir_nip_loc_addr, &ireq->ir_nip_rmt_addr);
|
||||
nip_hdr_len = get_nip_hdr_len(NIP_HDR_COMM, &ireq->IR_NIP_LOC_ADDR, &ireq->IR_NIP_RMT_ADDR);
|
||||
nip_hdr_len = nip_hdr_len == 0 ? NIP_HDR_MAX : nip_hdr_len;
|
||||
nip_mss = mtu - nip_hdr_len - sizeof(struct tcphdr);
|
||||
|
||||
@@ -853,7 +853,7 @@ struct sk_buff *tcp_nip_make_synack(const struct sock *sk, struct dst_entry *dst
|
||||
__TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS);
|
||||
|
||||
/* Fill in checksum */
|
||||
check = nip_get_output_checksum_tcp(skb, ireq->ir_nip_loc_addr, ireq->ir_nip_rmt_addr);
|
||||
check = nip_get_output_checksum_tcp(skb, ireq->IR_NIP_LOC_ADDR, ireq->IR_NIP_RMT_ADDR);
|
||||
th->check = htons(check);
|
||||
|
||||
/* Do not fool tcpdump (if any), clean our debris */
|
||||
@@ -879,8 +879,8 @@ int __nip_send_synack(struct request_sock *req, struct sk_buff *skb)
|
||||
skb->protocol = htons(ETH_P_NEWIP);
|
||||
skb->ip_summed = csummode;
|
||||
skb->csum = 0;
|
||||
saddr = &ireq->ir_nip_loc_addr;
|
||||
daddr = &ireq->ir_nip_rmt_addr;
|
||||
saddr = &ireq->IR_NIP_LOC_ADDR;
|
||||
daddr = &ireq->IR_NIP_RMT_ADDR;
|
||||
|
||||
head.saddr = *saddr;
|
||||
head.daddr = *daddr;
|
||||
@@ -894,9 +894,9 @@ int __nip_send_synack(struct request_sock *req, struct sk_buff *skb)
|
||||
skb_push(skb, head.hdr_buf_pos);
|
||||
memcpy(skb->data, head.hdr_buf, head.hdr_buf_pos);
|
||||
skb_reset_network_header(skb);
|
||||
NIPCB(skb)->srcaddr = *saddr;
|
||||
NIPCB(skb)->dstaddr = *daddr;
|
||||
NIPCB(skb)->nexthdr = head.nexthdr;
|
||||
nipcb(skb)->srcaddr = *saddr;
|
||||
nipcb(skb)->dstaddr = *daddr;
|
||||
nipcb(skb)->nexthdr = head.nexthdr;
|
||||
|
||||
head.total_len = skb->len;
|
||||
err = nip_send_skb(skb);
|
||||
|
||||
+12
-12
@@ -133,7 +133,7 @@ int nip_udp_get_port(struct sock *sk, unsigned short snum)
|
||||
|
||||
hash2_nulladdr = nip_udp_portaddr_hash(sock_net(sk), &nip_any_addr, snum);
|
||||
/* hash2_partial is the hash result of nip_addr only */
|
||||
hash2_partial = nip_udp_portaddr_hash(sock_net(sk), &sk->sk_nip_rcv_saddr, 0);
|
||||
hash2_partial = nip_udp_portaddr_hash(sock_net(sk), &sk->SK_NIP_RCV_SADDR, 0);
|
||||
|
||||
/* precompute partial secondary hash */
|
||||
udp_sk(sk)->udp_portaddr_hash = hash2_partial;
|
||||
@@ -166,8 +166,8 @@ static int nip_udp_compute_score(struct sock *sk, struct net *net,
|
||||
/* Source ADDRESS of the local device
|
||||
* In the header sent by the peer device, it is the destination address
|
||||
*/
|
||||
if (!nip_addr_any(&sk->sk_nip_rcv_saddr)) {
|
||||
if (!nip_addr_eq(&sk->sk_nip_rcv_saddr, daddr))
|
||||
if (!nip_addr_any(&sk->SK_NIP_RCV_SADDR)) {
|
||||
if (!nip_addr_eq(&sk->SK_NIP_RCV_SADDR, daddr))
|
||||
return -1;
|
||||
score++;
|
||||
}
|
||||
@@ -175,8 +175,8 @@ static int nip_udp_compute_score(struct sock *sk, struct net *net,
|
||||
/* Address of the peer device
|
||||
* In the packet header sent by the peer device, is the source ADDRESS
|
||||
*/
|
||||
if (!nip_addr_any(&sk->sk_nip_daddr)) {
|
||||
if (!nip_addr_eq(&sk->sk_nip_daddr, saddr))
|
||||
if (!nip_addr_any(&sk->SK_NIP_DADDR)) {
|
||||
if (!nip_addr_eq(&sk->SK_NIP_DADDR, saddr))
|
||||
return -1;
|
||||
score++;
|
||||
}
|
||||
@@ -261,8 +261,8 @@ static struct sock *__nip_udp_lib_lookup_skb(struct sk_buff *skb,
|
||||
struct udp_table *udptable)
|
||||
{
|
||||
return __nip_udp_lib_lookup(dev_net(skb->dev),
|
||||
&NIPCB(skb)->srcaddr, sport,
|
||||
&NIPCB(skb)->dstaddr, dport, skb->skb_iif,
|
||||
&nipcb(skb)->srcaddr, sport,
|
||||
&nipcb(skb)->dstaddr, dport, skb->skb_iif,
|
||||
0, udptable, skb);
|
||||
}
|
||||
|
||||
@@ -309,7 +309,7 @@ int nip_udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||
|
||||
sin->sin_family = AF_NINET;
|
||||
sin->sin_port = udp_hdr(skb)->source;
|
||||
sin->sin_addr = NIPCB(skb)->srcaddr;
|
||||
sin->sin_addr = nipcb(skb)->srcaddr;
|
||||
*addr_len = sizeof(*sin);
|
||||
}
|
||||
|
||||
@@ -349,9 +349,9 @@ bool nip_get_udp_input_checksum(struct sk_buff *skb)
|
||||
struct udphdr *udphead = udp_hdr(skb);
|
||||
unsigned short check_len = ntohs(udphead->len);
|
||||
|
||||
nph.nexthdr = NIPCB(skb)->nexthdr;
|
||||
nph.saddr = NIPCB(skb)->srcaddr;
|
||||
nph.daddr = NIPCB(skb)->dstaddr;
|
||||
nph.nexthdr = nipcb(skb)->nexthdr;
|
||||
nph.saddr = nipcb(skb)->srcaddr;
|
||||
nph.daddr = nipcb(skb)->dstaddr;
|
||||
nph.check_len = udphead->len;
|
||||
|
||||
return nip_check_sum_parse(skb_transport_header(skb), check_len, &nph)
|
||||
@@ -433,7 +433,7 @@ int nip_udp_output(struct sock *sk, struct msghdr *msg, size_t len)
|
||||
sport = htons(inet->inet_num);
|
||||
|
||||
/* Check the dev index */
|
||||
fln.flowin_oif = sk->sk_bound_dev_if;
|
||||
fln.FLOWIN_OIF = sk->sk_bound_dev_if;
|
||||
|
||||
/* Query the route & Obtain the Saddr */
|
||||
dst = nip_sk_dst_lookup_flow(sk, &fln);
|
||||
|
||||
Reference in New Issue
Block a user