generic device driver checks link up/down

This commit is contained in:
Martin Troxler
2010-01-04 14:16:53 +01:00
parent 5d6ce8b992
commit c739fca04e

View File

@@ -70,14 +70,16 @@ struct list_head generic_devices;
typedef struct {
struct list_head list;
struct net_device *netdev;
struct socket *socket;
struct net_device *used_netdev;
struct socket *socket;
ec_device_t *ecdev;
uint8_t *rx_buf;
} ec_gen_device_t;
typedef struct {
struct list_head list;
char name[IFNAMSIZ];
struct net_device *netdev;
char name[IFNAMSIZ];
int ifindex;
uint8_t dev_addr[ETH_ALEN];
} ec_gen_interface_desc_t;
@@ -200,7 +202,7 @@ int ec_gen_device_create_socket(
int ret;
struct sockaddr_ll sa;
dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL);
dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL);
if (!dev->rx_buf) {
return -ENOMEM;
}
@@ -240,7 +242,8 @@ int ec_gen_device_offer(
{
int ret = 0;
memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN);
dev->used_netdev = desc->netdev;
memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN);
dev->ecdev = ecdev_offer(dev->netdev, ec_gen_poll, THIS_MODULE);
if (dev->ecdev) {
@@ -251,7 +254,7 @@ int ec_gen_device_offer(
ecdev_withdraw(dev->ecdev);
dev->ecdev = NULL;
} else {
ecdev_set_link(dev->ecdev, 1); // FIXME
ecdev_set_link(dev->ecdev, netif_carrier_ok(dev->used_netdev)); // FIXME
ret = 1;
}
}
@@ -293,6 +296,8 @@ int ec_gen_device_start_xmit(
size_t len = skb->len;
int ret;
ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev));
iov.iov_base = skb->data;
iov.iov_len = len;
memset(&msg, 0, sizeof(msg));
@@ -314,7 +319,8 @@ void ec_gen_device_poll(
struct kvec iov;
int ret, budget = 10; // FIXME
do {
ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev));
do {
iov.iov_base = dev->rx_buf;
iov.iov_len = EC_GEN_RX_BUF_SIZE;
memset(&msg, 0, sizeof(msg));
@@ -408,6 +414,7 @@ int __init ec_gen_init_module(void)
goto out_err;
}
strncpy(desc->name, netdev->name, IFNAMSIZ);
desc->netdev = netdev;
desc->ifindex = netdev->ifindex;
memcpy(desc->dev_addr, netdev->dev_addr, ETH_ALEN);
list_add_tail(&desc->list, &descs);