diff options
| author | Michael Bestas <mkbestas@lineageos.org> | 2021-02-06 01:33:49 +0200 |
|---|---|---|
| committer | Michael Bestas <mkbestas@lineageos.org> | 2021-02-06 01:33:49 +0200 |
| commit | 4d2544c30eab39bfe0eed6027fe4059f58ee91ad (patch) | |
| tree | cdb839bc415cbac2a2342c8f82ffe963e40faa48 /net | |
| parent | 141849eac5defb4bb6cf6e6f1381cb24ffcfdba5 (diff) | |
| parent | c3cd6d0f0f73c7f0b0b5173ac7ad6753fb3b8ce1 (diff) | |
Merge tag 'LA.UM.9.2.r1-02000-SDMxx0.0' of https://source.codeaurora.org/quic/la/kernel/msm-4.4 into lineage-18.1-caf-msm8998
* tag 'LA.UM.9.2.r1-02000-SDMxx0.0' of https://source.codeaurora.org/quic/la/kernel/msm-4.4:
net: ipv6: Use passed in table for nexthop lookups
ipv6: addrconf: use stable address generator for ARPHRD_NONE
msm: kgsl: Protect the memdesc->gpuaddr in SVM use cases
msm: kgsl: Stop using memdesc->usermem
msm: kgsl: Correct the refcount on current process PID
HID: sony: Update hid_have_special_driver
UPSTREAM: HID: input: map digitizer battery usage
HID: input: ignore the battery in OKLICK Laser BTmouse
defconfig: Enable CONFIG_HID_NINTENDO for msm8998
iio: qcom-rradc: Update logic to monitor health of RRADC peripheral
qcom: fg-memif: Correct timeout condition for memory grant
power: qpnp-fg-gen3: Add a property to reset FG BCL device
msm: ipa3: Add check to validate rule_cnt
power_supply: add FG_RESET_CLOCK property
defconfig: Enable CONFIG_HID_NINTENDO for SDM660
FROMLIST: HID: nintendo: add nintendo switch controller driver
defconfig: Enable UTS_NS for sdm660
Conflicts:
drivers/hid/hid-input.c
drivers/power/power_supply_sysfs.c
include/linux/power_supply.h
Change-Id: I577e4b1d9410887224dbdb192c6eea1f2de6aded
Diffstat (limited to 'net')
| -rw-r--r-- | net/ipv6/addrconf.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 441f6519e2e7..7061b435072b 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2396,6 +2396,12 @@ static void manage_tempaddrs(struct inet6_dev *idev, } } +static bool is_addr_mode_generate_stable(struct inet6_dev *idev) +{ + return idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || + idev->addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; +} + void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) { struct prefix_info *pinfo; @@ -2512,8 +2518,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) in6_dev->token.s6_addr + 8, 8); read_unlock_bh(&in6_dev->lock); tokenized = true; - } else if (in6_dev->addr_gen_mode == - IN6_ADDR_GEN_MODE_STABLE_PRIVACY && + } else if (is_addr_mode_generate_stable(in6_dev) && !ipv6_generate_stable_address(&addr, 0, in6_dev)) { addr_flags |= IFA_F_STABLE_PRIVACY; @@ -3113,6 +3118,17 @@ retry: return 0; } +static void ipv6_gen_mode_random_init(struct inet6_dev *idev) +{ + struct ipv6_stable_secret *s = &idev->cnf.stable_secret; + + if (s->initialized) + return; + s = &idev->cnf.stable_secret; + get_random_bytes(&s->secret, sizeof(s->secret)); + s->initialized = true; +} + static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) { struct in6_addr addr; @@ -3123,13 +3139,18 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); - if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY) { + switch (idev->addr_gen_mode) { + case IN6_ADDR_GEN_MODE_RANDOM: + ipv6_gen_mode_random_init(idev); + /* fallthrough */ + case IN6_ADDR_GEN_MODE_STABLE_PRIVACY: if (!ipv6_generate_stable_address(&addr, 0, idev)) addrconf_add_linklocal(idev, &addr, IFA_F_STABLE_PRIVACY); else if (prefix_route) addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); - } else if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) { + break; + case IN6_ADDR_GEN_MODE_EUI64: /* addrconf_add_linklocal also adds a prefix_route and we * only need to care about prefix routes if ipv6_generate_eui64 * couldn't generate one. @@ -3138,6 +3159,11 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) addrconf_add_linklocal(idev, &addr, 0); else if (prefix_route) addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); + break; + case IN6_ADDR_GEN_MODE_NONE: + default: + /* will not add any link local address */ + break; } } @@ -3155,6 +3181,7 @@ static void addrconf_dev_config(struct net_device *dev) (dev->type != ARPHRD_IEEE1394) && (dev->type != ARPHRD_TUNNEL6) && (dev->type != ARPHRD_6LOWPAN) && + (dev->type != ARPHRD_NONE) && (dev->type != ARPHRD_RAWIP) && (dev->type != ARPHRD_INFINIBAND)) { /* Alas, we support only Ethernet autoconfiguration. */ @@ -3165,6 +3192,11 @@ static void addrconf_dev_config(struct net_device *dev) if (IS_ERR(idev)) return; + /* this device type has no EUI support */ + if (dev->type == ARPHRD_NONE && + idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) + idev->addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; + addrconf_addr_gen(idev, false); } @@ -5041,7 +5073,8 @@ static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla) if (mode != IN6_ADDR_GEN_MODE_EUI64 && mode != IN6_ADDR_GEN_MODE_NONE && - mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY) + mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY && + mode != IN6_ADDR_GEN_MODE_RANDOM) return -EINVAL; if (mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY && |
