From 168d0ed79b2e4ee413e7f7682d4cd8ae42252e60 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 26 Jan 2012 10:23:25 +0100 Subject: cleo/devkit/plcdrv: add service type based priority, refs #2595 --- cleopatre/devkit/plcdrv/src/frame.c | 35 ++--------------------------------- cleopatre/devkit/plcdrv/src/plcdrv.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 33 deletions(-) (limited to 'cleopatre/devkit/plcdrv/src') diff --git a/cleopatre/devkit/plcdrv/src/frame.c b/cleopatre/devkit/plcdrv/src/frame.c index 5f19eaaaa9..3673f1c9c2 100644 --- a/cleopatre/devkit/plcdrv/src/frame.c +++ b/cleopatre/devkit/plcdrv/src/frame.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -39,17 +38,6 @@ #define HPAV_MME_P_DRV_BASE 0xB000 -/** Define VLAN format */ -#define VLAN_CFI_MASK 0x1000 -#define VLAN_PRIO_MASK 0xe000 -#define VLAN_VID_SHIFT 0 -#define VLAN_CFI_SHIFT 12 -#define VLAN_PRIO_SHIFT 13 - -#define VLAN_PRIO(tci) ((tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT) -#define VLAN_MAX_PRIO 7 -#define VLAN_MME_PRIO 6 /** VLAN priorities 6 and 7 correspond to CAP 3. */ - /** Frame info magic word. */ #define FRAME_INFO_MAGIC 0xc742a74e @@ -83,18 +71,6 @@ frame_get_eth_mme_type (uint8_t *eth_frame) return *(uint16_t *) (eth_frame + ETH_MME_TYPE_OFFSET); } -/** - * Find the Ethernet type. - * \param eth_frame Ethernet frame pointer. - * \return Ethernet type. - */ -static inline uint16_t -frame_get_eth_type (uint8_t *eth_frame) -{ - struct ethhdr *eth = (struct ethhdr *) eth_frame; - return ntohs (eth->h_proto); -} - /** * Prepare a sk buff for sending to firmware. * \param priv PLC device private context @@ -340,8 +316,7 @@ frame_rx_debug_dump (plcdrv_t *priv, uint32_t data_addr, int frame_tx_data (struct sk_buff *skb, struct net_device *dev) { - uint16_t eth_type; - unsigned int vlan_prio = 0; + unsigned short vlan_prio; uint32_t phy_addr; plcdrv_t *priv = netdev_priv (dev); @@ -360,13 +335,7 @@ frame_tx_data (struct sk_buff *skb, struct net_device *dev) seq_check_tx (&priv->seq_check_ctx, skb); /* Get VLAN priority. */ - eth_type = frame_get_eth_type ((uint8_t *) skb->data); - if (eth_type == ETH_P_8021Q) - vlan_prio - = (unsigned int) VLAN_PRIO (ntohs (((struct vlan_ethhdr *) - skb->data)->h_vlan_TCI)); - else if (eth_type == ETH_P_HPAV) - vlan_prio = VLAN_MME_PRIO; + vlan_prio = qos_frame_prio_get (&priv->qos, skb); /* TX pool full? This can not happen because netif queue would have been * stopped before data queue is full. */ diff --git a/cleopatre/devkit/plcdrv/src/plcdrv.c b/cleopatre/devkit/plcdrv/src/plcdrv.c index a78386ea46..375ba770a5 100644 --- a/cleopatre/devkit/plcdrv/src/plcdrv.c +++ b/cleopatre/devkit/plcdrv/src/plcdrv.c @@ -539,12 +539,45 @@ plcdrv_set_mac_address (struct net_device *dev, void *p) static int plcdrv_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) { + int i; plcdrv_t *priv = netdev_priv (dev); struct plcdrv_setpid user_data; + plcdrv_qos_rules_t qos_rules; + qos_service_type_t qos_service_type; /* Find the command. */ switch (cmd) { + case PLCDRV_IOCTL_SETQOS_RULES: + /* Get user data */ + if (copy_from_user (&qos_rules, ifr->ifr_data, + sizeof (plcdrv_qos_rules_t))) + return -EFAULT; + /* Check user provided rules. */ + if (qos_rules.rules_nb > PLCDRV_SERVICES_MAX_NB) + return -EINVAL; + for (i = 0; i < qos_rules.rules_nb; i++) + { + if (qos_rules.rules[i].packet_prio + > (VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT)) + return -EINVAL; + } + /* Copy to context. */ + priv->qos.rules = qos_rules; + break; + + case PLCDRV_IOCTL_SETQOS_TYPE: + /* Get user data */ + if (copy_from_user (&qos_service_type, ifr->ifr_data, + sizeof (qos_service_type_t))) + return -EFAULT; + /* Check user provided data. */ + if (qos_service_type >= QOS_SERVICE_TYPE_NB) + return -EINVAL; + /* Copy to context. */ + priv->qos.service_type = qos_service_type; + break; + case PLCDRV_IOCTL_SETPID: /* Get user data */ if (copy_from_user (&user_data, ifr->ifr_data, sizeof (user_data))) -- cgit v1.2.3