aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-10-13 00:38:46 -0400
committerDavid S. Miller <davem@davemloft.net>2018-10-13 00:38:46 -0400
commitd864991b220b7c62e81d21209e1fd978fd67352c (patch)
treeb570a1ad6fc1b959c5bcda6ceca0b321319c01e0 /net/core/devlink.c
parenta688c53a0277d8ea21d86a5c56884892e3442c5e (diff)
parentbab5c80b211035739997ebd361a679fa85b39465 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts were easy to resolve using immediate context mostly, except the cls_u32.c one where I simply too the entire HEAD chunk. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r--net/core/devlink.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 6dae81d65d5c..3a4b29a13d31 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -3012,6 +3012,8 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
3012 struct genl_info *info, 3012 struct genl_info *info,
3013 union devlink_param_value *value) 3013 union devlink_param_value *value)
3014{ 3014{
3015 int len;
3016
3015 if (param->type != DEVLINK_PARAM_TYPE_BOOL && 3017 if (param->type != DEVLINK_PARAM_TYPE_BOOL &&
3016 !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) 3018 !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])
3017 return -EINVAL; 3019 return -EINVAL;
@@ -3027,10 +3029,13 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
3027 value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); 3029 value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]);
3028 break; 3030 break;
3029 case DEVLINK_PARAM_TYPE_STRING: 3031 case DEVLINK_PARAM_TYPE_STRING:
3030 if (nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) > 3032 len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]),
3031 DEVLINK_PARAM_MAX_STRING_VALUE) 3033 nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
3034 if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) ||
3035 len >= __DEVLINK_PARAM_MAX_STRING_VALUE)
3032 return -EINVAL; 3036 return -EINVAL;
3033 value->vstr = nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); 3037 strcpy(value->vstr,
3038 nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
3034 break; 3039 break;
3035 case DEVLINK_PARAM_TYPE_BOOL: 3040 case DEVLINK_PARAM_TYPE_BOOL:
3036 value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? 3041 value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ?
@@ -3117,7 +3122,10 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
3117 return -EOPNOTSUPP; 3122 return -EOPNOTSUPP;
3118 3123
3119 if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) { 3124 if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) {
3120 param_item->driverinit_value = value; 3125 if (param->type == DEVLINK_PARAM_TYPE_STRING)
3126 strcpy(param_item->driverinit_value.vstr, value.vstr);
3127 else
3128 param_item->driverinit_value = value;
3121 param_item->driverinit_value_valid = true; 3129 param_item->driverinit_value_valid = true;
3122 } else { 3130 } else {
3123 if (!param->set) 3131 if (!param->set)
@@ -4557,7 +4565,10 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
4557 DEVLINK_PARAM_CMODE_DRIVERINIT)) 4565 DEVLINK_PARAM_CMODE_DRIVERINIT))
4558 return -EOPNOTSUPP; 4566 return -EOPNOTSUPP;
4559 4567
4560 *init_val = param_item->driverinit_value; 4568 if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
4569 strcpy(init_val->vstr, param_item->driverinit_value.vstr);
4570 else
4571 *init_val = param_item->driverinit_value;
4561 4572
4562 return 0; 4573 return 0;
4563} 4574}
@@ -4588,7 +4599,10 @@ int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
4588 DEVLINK_PARAM_CMODE_DRIVERINIT)) 4599 DEVLINK_PARAM_CMODE_DRIVERINIT))
4589 return -EOPNOTSUPP; 4600 return -EOPNOTSUPP;
4590 4601
4591 param_item->driverinit_value = init_val; 4602 if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
4603 strcpy(param_item->driverinit_value.vstr, init_val.vstr);
4604 else
4605 param_item->driverinit_value = init_val;
4592 param_item->driverinit_value_valid = true; 4606 param_item->driverinit_value_valid = true;
4593 4607
4594 devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW); 4608 devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW);
@@ -4621,6 +4635,23 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
4621EXPORT_SYMBOL_GPL(devlink_param_value_changed); 4635EXPORT_SYMBOL_GPL(devlink_param_value_changed);
4622 4636
4623/** 4637/**
4638 * devlink_param_value_str_fill - Safely fill-up the string preventing
4639 * from overflow of the preallocated buffer
4640 *
4641 * @dst_val: destination devlink_param_value
4642 * @src: source buffer
4643 */
4644void devlink_param_value_str_fill(union devlink_param_value *dst_val,
4645 const char *src)
4646{
4647 size_t len;
4648
4649 len = strlcpy(dst_val->vstr, src, __DEVLINK_PARAM_MAX_STRING_VALUE);
4650 WARN_ON(len >= __DEVLINK_PARAM_MAX_STRING_VALUE);
4651}
4652EXPORT_SYMBOL_GPL(devlink_param_value_str_fill);
4653
4654/**
4624 * devlink_region_create - create a new address region 4655 * devlink_region_create - create a new address region
4625 * 4656 *
4626 * @devlink: devlink 4657 * @devlink: devlink