From 198e79f0e8f0b24c1e36ab6032d348f40de20262 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Fri, 22 Dec 2017 12:07:34 +0000 Subject: backports: bluetooth: Support 4.9 kernels Signed-off-by: Dominik Sliwa --- backport-include/crypto/skcipher.h | 99 ++++++++++++++++++++++++++++++++ backport-include/linux/kernel.h | 4 ++ backport-include/linux/kref.h | 13 +++++ backport-include/linux/skbuff.h | 17 ++++++ backport-include/linux/string.h | 4 ++ backport-include/linux/uio.h | 7 +++ backport-include/net/sock.h | 10 ++++ backport-include/uapi/linux/cryptouser.h | 12 ++++ 8 files changed, 166 insertions(+) create mode 100644 backport-include/linux/kref.h create mode 100644 backport-include/linux/uio.h create mode 100644 backport-include/uapi/linux/cryptouser.h (limited to 'backport-include') diff --git a/backport-include/crypto/skcipher.h b/backport-include/crypto/skcipher.h index 73ba783..900c359 100644 --- a/backport-include/crypto/skcipher.h +++ b/backport-include/crypto/skcipher.h @@ -441,6 +441,105 @@ static inline void skcipher_request_set_crypt( } #endif /* < 4.3 */ +#if LINUX_VERSION_IS_LESS(4,8,0) +#define skcipher_walk LINUX_BACKPORT(skcipher_walk) +struct skcipher_walk { + union { + struct { + struct page *page; + unsigned long offset; + } phys; + + struct { + u8 *page; + void *addr; + } virt; + } src, dst; + + struct scatter_walk in; + unsigned int nbytes; + + struct scatter_walk out; + unsigned int total; + + struct list_head buffers; + + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + + unsigned int ivsize; + + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keylen); + int (*encrypt)(struct skcipher_request *req); + int (*decrypt)(struct skcipher_request *req); + int (*init)(struct crypto_skcipher *tfm); + void (*exit)(struct crypto_skcipher *tfm); + + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int walksize; + + struct crypto_alg base; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *inst); + union { + struct { + char head[offsetof(struct skcipher_alg, base)]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +static inline unsigned int crypto_skcipher_alg_walksize( + struct skcipher_alg *alg) +{ + if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) == + CRYPTO_ALG_TYPE_BLKCIPHER) + return alg->base.cra_blocksize; + + if (alg->base.cra_ablkcipher.encrypt) + return alg->base.cra_blocksize; + + return alg->walksize; +} + +static inline struct skcipher_alg *crypto_skcipher_alg( + struct crypto_skcipher *tfm) +{ + return container_of(crypto_skcipher_tfm(tfm)->__crt_alg, + struct skcipher_alg, base); +} + +static inline unsigned int crypto_skcipher_walksize( + struct crypto_skcipher *tfm) +{ + return crypto_skcipher_alg_walksize(crypto_skcipher_alg(tfm)); +} + +static inline struct crypto_instance *skcipher_crypto_instance( + struct skcipher_instance *inst) +{ + return &inst->s.base; +} + +#define CRYPTO_ALG_TYPE_SKCIPHER CRYPTO_ALG_TYPE_ABLKCIPHER +#endif /* < 4.8 */ + #if LINUX_VERSION_IS_LESS(4,6,0) #define skcipher_request_zero LINUX_BACKPORT(skcipher_request_zero) static inline void skcipher_request_zero(struct skcipher_request *req) diff --git a/backport-include/linux/kernel.h b/backport-include/linux/kernel.h index 3ddeb13..4b2f153 100644 --- a/backport-include/linux/kernel.h +++ b/backport-include/linux/kernel.h @@ -206,6 +206,10 @@ int __must_check kstrtobool_from_user(const char __user *s, size_t count, bool * #endif +#if LINUX_VERSION_IS_LESS(4,5,0) +const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list args); +#endif /* < 4.4 */ + #if LINUX_VERSION_IS_LESS(3,14,0) static inline u32 reciprocal_scale(u32 val, u32 ep_ro) { diff --git a/backport-include/linux/kref.h b/backport-include/linux/kref.h new file mode 100644 index 0000000..631488f --- /dev/null +++ b/backport-include/linux/kref.h @@ -0,0 +1,13 @@ +#ifndef __BACKPORT_LINUX_KREF_H +#define __BACKPORT_LINUX_KREF_H +#include_next + +#if LINUX_VERSION_IS_LESS(4,11,0) +#include +static inline unsigned int kref_read(const struct kref *kref) +{ + return refcount_read((const refcount_t *)&kref->refcount); +} +#endif /* < 4.11 */ + +#endif /* __BACKPORT_LINUX_KREF_H */ diff --git a/backport-include/linux/skbuff.h b/backport-include/linux/skbuff.h index 034206b..af40b8d 100644 --- a/backport-include/linux/skbuff.h +++ b/backport-include/linux/skbuff.h @@ -371,6 +371,23 @@ static inline void skb_put_u8(struct sk_buff *skb, u8 val) { *(u8 *)skb_put(skb, 1) = val; } + +static inline void *__skb_put_zero(struct sk_buff *skb, unsigned int len) +{ + void *tmp = __skb_put(skb, len); + + memset(tmp, 0, len); + return tmp; +} + +static inline void *__skb_put_data(struct sk_buff *skb, const void *data, + unsigned int len) +{ + void *tmp = __skb_put(skb, len); + + memcpy(tmp, data, len); + return tmp; +} #endif #endif /* __BACKPORT_SKBUFF_H */ diff --git a/backport-include/linux/string.h b/backport-include/linux/string.h index b85d9c7..b1d26d1 100644 --- a/backport-include/linux/string.h +++ b/backport-include/linux/string.h @@ -29,4 +29,8 @@ void memzero_explicit(void *s, size_t count); ssize_t strscpy(char *dest, const char *src, size_t count); #endif +#if LINUX_VERSION_IS_LESS(4,0,0) +extern void kfree_const(const void *x); +extern const char *kstrdup_const(const char *s, gfp_t gfp); +#endif #endif /* __BACKPORT_LINUX_STRING_H */ diff --git a/backport-include/linux/uio.h b/backport-include/linux/uio.h new file mode 100644 index 0000000..fe27e68 --- /dev/null +++ b/backport-include/linux/uio.h @@ -0,0 +1,7 @@ +#ifndef _BP_LINUX_UIO_H +#define _BP_LINUX_UIO_H +#include_next + +bool _copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i); + +#endif /* _BP_LINUX_UIO_H */ diff --git a/backport-include/net/sock.h b/backport-include/net/sock.h index 89191f3..ea3c474 100644 --- a/backport-include/net/sock.h +++ b/backport-include/net/sock.h @@ -63,4 +63,14 @@ static inline void sk_clear_bit(int nr, struct sock *sk) } #endif /* < 4.5 */ +#if LINUX_VERSION_IS_LESS(4,7,0) +/* no reclassification while locks are held */ +static inline bool sock_allow_reclassification(const struct sock *csk) +{ + struct sock *sk = (struct sock *)csk; + + return !sk->sk_lock.owned && !spin_is_locked(&sk->sk_lock.slock); +} +#endif /* < 4.7 */ + #endif /* __BACKPORT_NET_SOCK_H */ diff --git a/backport-include/uapi/linux/cryptouser.h b/backport-include/uapi/linux/cryptouser.h new file mode 100644 index 0000000..ea4a9a5 --- /dev/null +++ b/backport-include/uapi/linux/cryptouser.h @@ -0,0 +1,12 @@ +#ifndef __BACKPORT_LINUX_CRYPTOUSER_H +#define __BACKPORT_LINUX_CRYPTOUSER_H +#include_next +#include + +#if LINUX_VERSION_IS_LESS(4,8,0) +struct crypto_report_kpp { + char type[CRYPTO_MAX_NAME]; +}; +#endif /* < 4.8 */ + +#endif -- cgit v1.2.3