|
@@ -320,13 +320,9 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
|
|
|
struct sk_buff *nskb;
|
|
|
int err, confirm_recv = 0;
|
|
|
|
|
|
- memset(skb->head, 0, ETH_HLEN);
|
|
|
- phs_hdr = skb_push(skb, sizeof(struct af_iucv_trans_hdr));
|
|
|
- skb_reset_mac_header(skb);
|
|
|
+ phs_hdr = skb_push(skb, sizeof(*phs_hdr));
|
|
|
+ memset(phs_hdr, 0, sizeof(*phs_hdr));
|
|
|
skb_reset_network_header(skb);
|
|
|
- skb_push(skb, ETH_HLEN);
|
|
|
- skb_reset_mac_header(skb);
|
|
|
- memset(phs_hdr, 0, sizeof(struct af_iucv_trans_hdr));
|
|
|
|
|
|
phs_hdr->magic = ETH_P_AF_IUCV;
|
|
|
phs_hdr->version = 1;
|
|
@@ -350,6 +346,9 @@ static int afiucv_hs_send(struct iucv_message *imsg, struct sock *sock,
|
|
|
if (imsg)
|
|
|
memcpy(&phs_hdr->iucv_hdr, imsg, sizeof(struct iucv_message));
|
|
|
|
|
|
+ skb_push(skb, ETH_HLEN);
|
|
|
+ memset(skb->data, 0, ETH_HLEN);
|
|
|
+
|
|
|
skb->dev = iucv->hs_dev;
|
|
|
if (!skb->dev) {
|
|
|
err = -ENODEV;
|
|
@@ -1943,8 +1942,7 @@ static void iucv_callback_shutdown(struct iucv_path *path, u8 ipuser[16])
|
|
|
/***************** HiperSockets transport callbacks ********************/
|
|
|
static void afiucv_swap_src_dest(struct sk_buff *skb)
|
|
|
{
|
|
|
- struct af_iucv_trans_hdr *trans_hdr =
|
|
|
- (struct af_iucv_trans_hdr *)skb->data;
|
|
|
+ struct af_iucv_trans_hdr *trans_hdr = iucv_trans_hdr(skb);
|
|
|
char tmpID[8];
|
|
|
char tmpName[8];
|
|
|
|
|
@@ -1967,13 +1965,12 @@ static void afiucv_swap_src_dest(struct sk_buff *skb)
|
|
|
**/
|
|
|
static int afiucv_hs_callback_syn(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
+ struct af_iucv_trans_hdr *trans_hdr = iucv_trans_hdr(skb);
|
|
|
struct sock *nsk;
|
|
|
struct iucv_sock *iucv, *niucv;
|
|
|
- struct af_iucv_trans_hdr *trans_hdr;
|
|
|
int err;
|
|
|
|
|
|
iucv = iucv_sk(sk);
|
|
|
- trans_hdr = (struct af_iucv_trans_hdr *)skb->data;
|
|
|
if (!iucv) {
|
|
|
/* no sock - connection refused */
|
|
|
afiucv_swap_src_dest(skb);
|
|
@@ -2034,15 +2031,13 @@ out:
|
|
|
static int afiucv_hs_callback_synack(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct iucv_sock *iucv = iucv_sk(sk);
|
|
|
- struct af_iucv_trans_hdr *trans_hdr =
|
|
|
- (struct af_iucv_trans_hdr *)skb->data;
|
|
|
|
|
|
if (!iucv)
|
|
|
goto out;
|
|
|
if (sk->sk_state != IUCV_BOUND)
|
|
|
goto out;
|
|
|
bh_lock_sock(sk);
|
|
|
- iucv->msglimit_peer = trans_hdr->window;
|
|
|
+ iucv->msglimit_peer = iucv_trans_hdr(skb)->window;
|
|
|
sk->sk_state = IUCV_CONNECTED;
|
|
|
sk->sk_state_change(sk);
|
|
|
bh_unlock_sock(sk);
|
|
@@ -2098,8 +2093,6 @@ out:
|
|
|
static int afiucv_hs_callback_win(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct iucv_sock *iucv = iucv_sk(sk);
|
|
|
- struct af_iucv_trans_hdr *trans_hdr =
|
|
|
- (struct af_iucv_trans_hdr *)skb->data;
|
|
|
|
|
|
if (!iucv)
|
|
|
return NET_RX_SUCCESS;
|
|
@@ -2107,7 +2100,7 @@ static int afiucv_hs_callback_win(struct sock *sk, struct sk_buff *skb)
|
|
|
if (sk->sk_state != IUCV_CONNECTED)
|
|
|
return NET_RX_SUCCESS;
|
|
|
|
|
|
- atomic_sub(trans_hdr->window, &iucv->msg_sent);
|
|
|
+ atomic_sub(iucv_trans_hdr(skb)->window, &iucv->msg_sent);
|
|
|
iucv_sock_wake_msglim(sk);
|
|
|
return NET_RX_SUCCESS;
|
|
|
}
|
|
@@ -2170,22 +2163,13 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
|
int err = NET_RX_SUCCESS;
|
|
|
char nullstring[8];
|
|
|
|
|
|
- if (skb->len < (ETH_HLEN + sizeof(struct af_iucv_trans_hdr))) {
|
|
|
- WARN_ONCE(1, "AF_IUCV too short skb, len=%d, min=%d",
|
|
|
- (int)skb->len,
|
|
|
- (int)(ETH_HLEN + sizeof(struct af_iucv_trans_hdr)));
|
|
|
+ if (!pskb_may_pull(skb, sizeof(*trans_hdr))) {
|
|
|
+ WARN_ONCE(1, "AF_IUCV failed to receive skb, len=%u", skb->len);
|
|
|
kfree_skb(skb);
|
|
|
return NET_RX_SUCCESS;
|
|
|
}
|
|
|
- if (skb_headlen(skb) < (ETH_HLEN + sizeof(struct af_iucv_trans_hdr)))
|
|
|
- if (skb_linearize(skb)) {
|
|
|
- WARN_ONCE(1, "AF_IUCV skb_linearize failed, len=%d",
|
|
|
- (int)skb->len);
|
|
|
- kfree_skb(skb);
|
|
|
- return NET_RX_SUCCESS;
|
|
|
- }
|
|
|
- skb_pull(skb, ETH_HLEN);
|
|
|
- trans_hdr = (struct af_iucv_trans_hdr *)skb->data;
|
|
|
+
|
|
|
+ trans_hdr = iucv_trans_hdr(skb);
|
|
|
EBCASC(trans_hdr->destAppName, sizeof(trans_hdr->destAppName));
|
|
|
EBCASC(trans_hdr->destUserID, sizeof(trans_hdr->destUserID));
|
|
|
EBCASC(trans_hdr->srcAppName, sizeof(trans_hdr->srcAppName));
|