summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/plcdrv/src/plcdrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/devkit/plcdrv/src/plcdrv.c')
-rw-r--r--cleopatre/devkit/plcdrv/src/plcdrv.c33
1 files changed, 33 insertions, 0 deletions
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)))