Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
ce41525e
Commit
ce41525e
authored
Jun 09, 2002
by
Martin Dalecki
Committed by
Linus Torvalds
Jun 09, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] kill warinigs 14/19
irlap_frame this time. Let me guess they used emacs?!
parent
d7bd8ce5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
192 additions
and
193 deletions
+192
-193
net/irda/irlap_frame.c
net/irda/irlap_frame.c
+192
-193
No files found.
net/irda/irlap_frame.c
View file @
ce41525e
/*********************************************************************
*
*
* Filename: irlap_frame.c
* Version: 1.0
* Description: Build and transmit IrLAP frames
...
...
@@ -8,18 +8,18 @@
* Created at: Tue Aug 19 10:27:26 1997
* Modified at: Wed Jan 5 08:59:04 2000
* Modified by: Dag Brattli <dagb@cs.uit.no>
*
* Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>,
*
* Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>,
* All Rights Reserved.
* Copyright (c) 2000-2001 Jean Tourrilhes <jt@hpl.hp.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Neither Dag Brattli nor University of Troms admit liability nor
* provide warranty for any of this software. This material is
* provide warranty for any of this software. This material is
* provided "AS-IS" and at no charge.
*
********************************************************************/
...
...
@@ -29,10 +29,10 @@
#include <linux/if_ether.h>
#include <linux/netdevice.h>
#include <linux/irda.h>
#include <net/pkt_sched.h>
#include <net/sock.h>
#include <asm/byteorder.h>
#include <net/irda/irda.h>
...
...
@@ -46,18 +46,18 @@
/*
* Function irlap_insert_info (self, skb)
*
* Insert minimum turnaround time and speed information into the skb. We
* Insert minimum turnaround time and speed information into the skb. We
* need to do this since it's per packet relevant information. Safe to
* have this function inlined since it's only called from one place
*/
static
inline
void
irlap_insert_info
(
struct
irlap_cb
*
self
,
static
inline
void
irlap_insert_info
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
{
struct
irda_skb_cb
*
cb
=
(
struct
irda_skb_cb
*
)
skb
->
cb
;
/*
/*
* Insert MTT (min. turn time) and speed into skb, so that the
* device driver knows which settings to use
* device driver knows which settings to use
*/
cb
->
magic
=
LAP_MAGIC
;
cb
->
mtt
=
self
->
mtt_required
;
...
...
@@ -65,15 +65,15 @@ static inline void irlap_insert_info(struct irlap_cb *self,
/* Reset */
self
->
mtt_required
=
0
;
/*
* Delay equals negotiated BOFs count, plus the number of BOFs to
* force the negotiated minimum turnaround time
/*
* Delay equals negotiated BOFs count, plus the number of BOFs to
* force the negotiated minimum turnaround time
*/
cb
->
xbofs
=
self
->
bofs_count
;
cb
->
next_xbofs
=
self
->
next_bofs
;
cb
->
xbofs_delay
=
self
->
xbofs_delay
;
/* Reset XBOF's delay (used only for getting min turn time) */
self
->
xbofs_delay
=
0
;
/* Put the correct xbofs value for the next packet */
...
...
@@ -91,7 +91,7 @@ void irlap_queue_xmit(struct irlap_cb *self, struct sk_buff *skb)
/* Some common init stuff */
skb
->
dev
=
self
->
netdev
;
skb
->
h
.
raw
=
skb
->
nh
.
raw
=
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
protocol
=
htons
(
ETH_P_IRDA
);
skb
->
protocol
=
htons
(
ETH_P_IRDA
);
skb
->
priority
=
TC_PRIO_BESTEFFORT
;
irlap_insert_info
(
self
,
skb
);
...
...
@@ -104,7 +104,7 @@ void irlap_queue_xmit(struct irlap_cb *self, struct sk_buff *skb)
*
* Transmits a connect SNRM command frame
*/
void
irlap_send_snrm_frame
(
struct
irlap_cb
*
self
,
struct
qos_info
*
qos
)
void
irlap_send_snrm_frame
(
struct
irlap_cb
*
self
,
struct
qos_info
*
qos
)
{
struct
sk_buff
*
skb
;
struct
snrm_frame
*
frame
;
...
...
@@ -118,7 +118,7 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
if
(
!
skb
)
return
;
frame
=
(
struct
snrm_frame
*
)
skb_put
(
skb
,
2
);
frame
=
(
struct
snrm_frame
*
)
skb_put
(
skb
,
2
);
/* Insert connection address field */
if
(
qos
)
...
...
@@ -127,10 +127,10 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
frame
->
caddr
=
CMD_FRAME
|
self
->
caddr
;
/* Insert control field */
frame
->
control
=
SNRM_CMD
|
PF_BIT
;
frame
->
control
=
SNRM_CMD
|
PF_BIT
;
/*
* If we are establishing a connection then insert QoS paramerters
* If we are establishing a connection then insert QoS paramerters
*/
if
(
qos
)
{
skb_put
(
skb
,
9
);
/* 21 left */
...
...
@@ -138,7 +138,7 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
frame
->
daddr
=
cpu_to_le32
(
self
->
daddr
);
frame
->
ncaddr
=
self
->
caddr
;
ret
=
irlap_insert_qos_negotiation_params
(
self
,
skb
);
if
(
ret
<
0
)
{
dev_kfree_skb
(
skb
);
...
...
@@ -154,28 +154,28 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
* Received SNRM (Set Normal Response Mode) command frame
*
*/
static
void
irlap_recv_snrm_cmd
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
static
void
irlap_recv_snrm_cmd
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
struct
snrm_frame
*
frame
;
frame
=
(
struct
snrm_frame
*
)
skb
->
data
;
if
(
skb
->
len
>=
sizeof
(
struct
snrm_frame
))
{
/* Copy the new connection address */
info
->
caddr
=
frame
->
ncaddr
;
/* Check if the new connection address is valid */
if
((
info
->
caddr
==
0x00
)
||
(
info
->
caddr
==
0xfe
))
{
IRDA_DEBUG
(
3
,
__FUNCTION__
IRDA_DEBUG
(
3
,
__FUNCTION__
"(), invalid connection address!
\n
"
);
return
;
}
/* Copy peer device address */
info
->
daddr
=
le32_to_cpu
(
frame
->
saddr
);
info
->
saddr
=
le32_to_cpu
(
frame
->
daddr
);
/* Only accept if addressed directly to us */
if
(
info
->
saddr
!=
self
->
saddr
)
{
IRDA_DEBUG
(
2
,
__FUNCTION__
"(), not addressed to us!
\n
"
);
...
...
@@ -199,9 +199,9 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
struct
sk_buff
*
skb
;
struct
ua_frame
*
frame
;
int
ret
;
IRDA_DEBUG
(
2
,
__FUNCTION__
"() <%ld>
\n
"
,
jiffies
);
ASSERT
(
self
!=
NULL
,
return
;);
ASSERT
(
self
->
magic
==
LAP_MAGIC
,
return
;);
...
...
@@ -213,10 +213,10 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
return
;
frame
=
(
struct
ua_frame
*
)
skb_put
(
skb
,
10
);
/* Build UA response */
frame
->
caddr
=
self
->
caddr
;
frame
->
control
=
UA_RSP
|
PF_BIT
;
frame
->
control
=
UA_RSP
|
PF_BIT
;
frame
->
saddr
=
cpu_to_le32
(
self
->
saddr
);
frame
->
daddr
=
cpu_to_le32
(
self
->
daddr
);
...
...
@@ -244,7 +244,7 @@ void irlap_send_dm_frame( struct irlap_cb *self)
{
struct
sk_buff
*
skb
=
NULL
;
__u8
*
frame
;
ASSERT
(
self
!=
NULL
,
return
;);
ASSERT
(
self
->
magic
==
LAP_MAGIC
,
return
;);
...
...
@@ -253,7 +253,7 @@ void irlap_send_dm_frame( struct irlap_cb *self)
return
;
frame
=
skb_put
(
skb
,
2
);
if
(
self
->
state
==
LAP_NDM
)
frame
[
0
]
=
CBROADCAST
;
else
...
...
@@ -261,7 +261,7 @@ void irlap_send_dm_frame( struct irlap_cb *self)
frame
[
1
]
=
DM_RSP
|
PF_BIT
;
irlap_queue_xmit
(
self
,
skb
);
irlap_queue_xmit
(
self
,
skb
);
}
/*
...
...
@@ -270,11 +270,11 @@ void irlap_send_dm_frame( struct irlap_cb *self)
* Send disconnect (DISC) frame
*
*/
void
irlap_send_disc_frame
(
struct
irlap_cb
*
self
)
void
irlap_send_disc_frame
(
struct
irlap_cb
*
self
)
{
struct
sk_buff
*
skb
=
NULL
;
__u8
*
frame
;
IRDA_DEBUG
(
3
,
__FUNCTION__
"()
\n
"
);
ASSERT
(
self
!=
NULL
,
return
;);
...
...
@@ -285,7 +285,7 @@ void irlap_send_disc_frame(struct irlap_cb *self)
return
;
frame
=
skb_put
(
skb
,
2
);
frame
[
0
]
=
self
->
caddr
|
CMD_FRAME
;
frame
[
1
]
=
DISC_CMD
|
PF_BIT
;
...
...
@@ -296,17 +296,17 @@ void irlap_send_disc_frame(struct irlap_cb *self)
* Function irlap_send_discovery_xid_frame (S, s, command)
*
* Build and transmit a XID (eXchange station IDentifier) discovery
* frame.
* frame.
*/
void
irlap_send_discovery_xid_frame
(
struct
irlap_cb
*
self
,
int
S
,
__u8
s
,
__u8
command
,
discovery_t
*
discovery
)
void
irlap_send_discovery_xid_frame
(
struct
irlap_cb
*
self
,
int
S
,
__u8
s
,
__u8
command
,
discovery_t
*
discovery
)
{
struct
sk_buff
*
skb
=
NULL
;
struct
xid_frame
*
frame
;
__u32
bcast
=
BROADCAST
;
__u8
*
info
;
IRDA_DEBUG
(
4
,
__FUNCTION__
"(), s=%d, S=%d, command=%d
\n
"
,
s
,
S
,
IRDA_DEBUG
(
4
,
__FUNCTION__
"(), s=%d, S=%d, command=%d
\n
"
,
s
,
S
,
command
);
ASSERT
(
self
!=
NULL
,
return
;);
...
...
@@ -335,7 +335,7 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
frame
->
daddr
=
cpu_to_le32
(
bcast
);
else
frame
->
daddr
=
cpu_to_le32
(
discovery
->
daddr
);
switch
(
S
)
{
case
1
:
frame
->
flags
=
0x00
;
...
...
@@ -354,10 +354,10 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
break
;
}
frame
->
slotnr
=
s
;
frame
->
slotnr
=
s
;
frame
->
version
=
0x00
;
/*
/*
* Provide info for final slot only in commands, and for all
* responses. Send the second byte of the hint only if the
* EXTENSION bit is set in the first byte.
...
...
@@ -366,7 +366,7 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
int
len
;
if
(
discovery
->
hints
.
byte
[
0
]
&
HINT_EXTENSION
)
{
info
=
skb_put
(
skb
,
2
);
info
=
skb_put
(
skb
,
2
);
info
[
0
]
=
discovery
->
hints
.
byte
[
0
];
info
[
1
]
=
discovery
->
hints
.
byte
[
1
];
}
else
{
...
...
@@ -379,7 +379,7 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
len
=
IRDA_MIN
(
discovery
->
name_len
,
skb_tailroom
(
skb
));
info
=
skb_put
(
skb
,
len
);
memcpy
(
info
,
discovery
->
nickname
,
len
);
}
}
irlap_queue_xmit
(
self
,
skb
);
}
...
...
@@ -389,9 +389,9 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s,
* Received a XID discovery response
*
*/
static
void
irlap_recv_discovery_xid_rsp
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
static
void
irlap_recv_discovery_xid_rsp
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
struct
xid_frame
*
xid
;
discovery_t
*
discovery
=
NULL
;
...
...
@@ -410,13 +410,13 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
/* Make sure frame is addressed to us */
if
((
info
->
saddr
!=
self
->
saddr
)
&&
(
info
->
saddr
!=
BROADCAST
))
{
IRDA_DEBUG
(
0
,
__FUNCTION__
IRDA_DEBUG
(
0
,
__FUNCTION__
"(), frame is not addressed to us!
\n
"
);
return
;
}
if
((
discovery
=
kmalloc
(
sizeof
(
discovery_t
),
GFP_ATOMIC
))
==
NULL
)
{
WARNING
(
__FUNCTION__
"(), kmalloc failed!
\n
"
);
WARNING
(
"%s: kmalloc failed!
\n
"
,
__FUNCTION__
);
return
;
}
memset
(
discovery
,
0
,
sizeof
(
discovery_t
));
...
...
@@ -441,11 +441,11 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
discovery
->
charset
=
discovery_info
[
1
];
text
=
(
char
*
)
&
discovery_info
[
2
];
}
/*
* Terminate info string, should be safe since this is where the
/*
* Terminate info string, should be safe since this is where the
* FCS bytes resides.
*/
skb
->
data
[
skb
->
len
]
=
'\0'
;
skb
->
data
[
skb
->
len
]
=
'\0'
;
strncpy
(
discovery
->
nickname
,
text
,
NICKNAME_MAX_LEN
);
discovery
->
name_len
=
strlen
(
discovery
->
nickname
);
...
...
@@ -460,9 +460,9 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
* Received a XID discovery command
*
*/
static
void
irlap_recv_discovery_xid_cmd
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
static
void
irlap_recv_discovery_xid_cmd
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
struct
xid_frame
*
xid
;
discovery_t
*
discovery
=
NULL
;
...
...
@@ -476,7 +476,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
/* Make sure frame is addressed to us */
if
((
info
->
saddr
!=
self
->
saddr
)
&&
(
info
->
saddr
!=
BROADCAST
))
{
IRDA_DEBUG
(
0
,
__FUNCTION__
IRDA_DEBUG
(
0
,
__FUNCTION__
"(), frame is not addressed to us!
\n
"
);
return
;
}
...
...
@@ -500,16 +500,16 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
return
;
}
info
->
s
=
xid
->
slotnr
;
discovery_info
=
skb_pull
(
skb
,
sizeof
(
struct
xid_frame
));
/*
* Check if last frame
/*
* Check if last frame
*/
if
(
info
->
s
==
0xff
)
{
/* Check if things are sane at this point... */
if
((
discovery_info
==
NULL
)
||
(
skb
->
len
<
3
))
{
ERROR
(
__FUNCTION__
"(), discovery frame to short!
\n
"
);
ERROR
(
"%s: discovery frame to short!
\n
"
,
__FUNCTION__
);
return
;
}
...
...
@@ -518,10 +518,10 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
*/
discovery
=
kmalloc
(
sizeof
(
discovery_t
),
GFP_ATOMIC
);
if
(
!
discovery
)
{
WARNING
(
__FUNCTION__
"(), unable to malloc!
\n
"
);
WARNING
(
"%s: unable to malloc!
\n
"
,
__FUNCTION__
);
return
;
}
discovery
->
daddr
=
info
->
daddr
;
discovery
->
saddr
=
self
->
saddr
;
discovery
->
timestamp
=
jiffies
;
...
...
@@ -536,11 +536,11 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
discovery
->
charset
=
discovery_info
[
1
];
text
=
(
char
*
)
&
discovery_info
[
2
];
}
/*
* Terminate string, should be safe since this is where the
/*
* Terminate string, should be safe since this is where the
* FCS bytes resides.
*/
skb
->
data
[
skb
->
len
]
=
'\0'
;
skb
->
data
[
skb
->
len
]
=
'\0'
;
strncpy
(
discovery
->
nickname
,
text
,
NICKNAME_MAX_LEN
);
discovery
->
name_len
=
strlen
(
discovery
->
nickname
);
...
...
@@ -557,7 +557,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
* Build and transmit RR (Receive Ready) frame. Notice that it is currently
* only possible to send RR frames with the poll bit set.
*/
void
irlap_send_rr_frame
(
struct
irlap_cb
*
self
,
int
command
)
void
irlap_send_rr_frame
(
struct
irlap_cb
*
self
,
int
command
)
{
struct
sk_buff
*
skb
;
__u8
*
frame
;
...
...
@@ -565,9 +565,9 @@ void irlap_send_rr_frame(struct irlap_cb *self, int command)
skb
=
dev_alloc_skb
(
16
);
if
(
!
skb
)
return
;
frame
=
skb_put
(
skb
,
2
);
frame
[
0
]
=
self
->
caddr
;
frame
[
0
]
|=
(
command
)
?
CMD_FRAME
:
0
;
...
...
@@ -579,7 +579,7 @@ void irlap_send_rr_frame(struct irlap_cb *self, int command)
/*
* Function irlap_send_rd_frame (self)
*
* Request disconnect. Used by a secondary station to request the
* Request disconnect. Used by a secondary station to request the
* disconnection of the link.
*/
void
irlap_send_rd_frame
(
struct
irlap_cb
*
self
)
...
...
@@ -590,9 +590,9 @@ void irlap_send_rd_frame(struct irlap_cb *self)
skb
=
dev_alloc_skb
(
16
);
if
(
!
skb
)
return
;
frame
=
skb_put
(
skb
,
2
);
frame
[
0
]
=
self
->
caddr
;
frame
[
1
]
=
RD_RSP
|
PF_BIT
;
...
...
@@ -606,8 +606,8 @@ void irlap_send_rd_frame(struct irlap_cb *self)
* making it inline since its called only from one single place
* (irlap_driver_rcv).
*/
static
inline
void
irlap_recv_rr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
inline
void
irlap_recv_rr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
info
->
nr
=
skb
->
data
[
1
]
>>
5
;
...
...
@@ -623,7 +623,7 @@ void irlap_send_frmr_frame( struct irlap_cb *self, int command)
{
struct
sk_buff
*
skb
=
NULL
;
__u8
*
frame
;
ASSERT
(
self
!=
NULL
,
return
;);
ASSERT
(
self
->
magic
==
LAP_MAGIC
,
return
;);
...
...
@@ -632,7 +632,7 @@ void irlap_send_frmr_frame( struct irlap_cb *self, int command)
return
;
frame
=
skb_put
(
skb
,
2
);
frame
[
0
]
=
self
->
caddr
;
frame
[
0
]
|=
(
command
)
?
CMD_FRAME
:
0
;
...
...
@@ -642,7 +642,7 @@ void irlap_send_frmr_frame( struct irlap_cb *self, int command)
frame
[
2
]
=
0
;
IRDA_DEBUG
(
4
,
__FUNCTION__
"(), vr=%d, %ld
\n
"
,
self
->
vr
,
jiffies
);
IRDA_DEBUG
(
4
,
__FUNCTION__
"(), vr=%d, %ld
\n
"
,
self
->
vr
,
jiffies
);
irlap_queue_xmit
(
self
,
skb
);
}
...
...
@@ -653,8 +653,8 @@ void irlap_send_frmr_frame( struct irlap_cb *self, int command)
* Received RNR (Receive Not Ready) frame from peer station
*
*/
static
void
irlap_recv_rnr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
static
void
irlap_recv_rnr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
info
->
nr
=
skb
->
data
[
1
]
>>
5
;
...
...
@@ -666,13 +666,13 @@ static void irlap_recv_rnr_frame(struct irlap_cb *self, struct sk_buff *skb,
irlap_do_event
(
self
,
RECV_RNR_RSP
,
skb
,
info
);
}
static
void
irlap_recv_rej_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
void
irlap_recv_rej_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
IRDA_DEBUG
(
0
,
__FUNCTION__
"()
\n
"
);
info
->
nr
=
skb
->
data
[
1
]
>>
5
;
/* Check if this is a command or a response frame */
if
(
command
)
irlap_do_event
(
self
,
RECV_REJ_CMD
,
skb
,
info
);
...
...
@@ -680,13 +680,13 @@ static void irlap_recv_rej_frame(struct irlap_cb *self, struct sk_buff *skb,
irlap_do_event
(
self
,
RECV_REJ_RSP
,
skb
,
info
);
}
static
void
irlap_recv_srej_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
void
irlap_recv_srej_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
IRDA_DEBUG
(
0
,
__FUNCTION__
"()
\n
"
);
info
->
nr
=
skb
->
data
[
1
]
>>
5
;
/* Check if this is a command or a response frame */
if
(
command
)
irlap_do_event
(
self
,
RECV_SREJ_CMD
,
skb
,
info
);
...
...
@@ -694,7 +694,7 @@ static void irlap_recv_srej_frame(struct irlap_cb *self, struct sk_buff *skb,
irlap_do_event
(
self
,
RECV_SREJ_RSP
,
skb
,
info
);
}
static
void
irlap_recv_disc_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
void
irlap_recv_disc_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
IRDA_DEBUG
(
2
,
__FUNCTION__
"()
\n
"
);
...
...
@@ -712,9 +712,9 @@ static void irlap_recv_disc_frame(struct irlap_cb *self, struct sk_buff *skb,
* Received UA (Unnumbered Acknowledgement) frame
*
*/
static
inline
void
irlap_recv_ua_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
static
inline
void
irlap_recv_ua_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
irlap_do_event
(
self
,
RECV_UA_RSP
,
skb
,
info
);
}
...
...
@@ -731,25 +731,25 @@ void irlap_send_data_primary(struct irlap_cb *self, struct sk_buff *skb)
if
(
skb
->
data
[
1
]
==
I_FRAME
)
{
/*
/*
* Insert frame sequence number (Vs) in control field before
* inserting into transmit window queue.
*/
skb
->
data
[
1
]
=
I_FRAME
|
(
self
->
vs
<<
1
);
/* Copy buffer */
tx_skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
tx_skb
==
NULL
)
{
return
;
}
/*
* Insert frame in store, in case of retransmissions
/*
* Insert frame in store, in case of retransmissions
*/
skb_queue_tail
(
&
self
->
wx_list
,
skb_get
(
skb
));
self
->
vs
=
(
self
->
vs
+
1
)
%
8
;
self
->
ack_required
=
FALSE
;
self
->
ack_required
=
FALSE
;
self
->
window
-=
1
;
irlap_send_i_frame
(
self
,
tx_skb
,
CMD_FRAME
);
...
...
@@ -764,40 +764,40 @@ void irlap_send_data_primary(struct irlap_cb *self, struct sk_buff *skb)
*
* Send I(nformation) frame as primary with poll bit set
*/
void
irlap_send_data_primary_poll
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
void
irlap_send_data_primary_poll
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
{
struct
sk_buff
*
tx_skb
;
/* Stop P timer */
del_timer
(
&
self
->
poll_timer
);
/* Is this reliable or unreliable data? */
if
(
skb
->
data
[
1
]
==
I_FRAME
)
{
/*
/*
* Insert frame sequence number (Vs) in control field before
* inserting into transmit window queue.
*/
skb
->
data
[
1
]
=
I_FRAME
|
(
self
->
vs
<<
1
);
/* Copy buffer */
tx_skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
tx_skb
==
NULL
)
{
return
;
}
/*
* Insert frame in store, in case of retransmissions
/*
* Insert frame in store, in case of retransmissions
*/
skb_queue_tail
(
&
self
->
wx_list
,
skb_get
(
skb
));
/*
/*
* Set poll bit if necessary. We do this to the copied
* skb, since retransmitted need to set or clear the poll
* bit depending on when they are sent.
* bit depending on when they are sent.
*/
tx_skb
->
data
[
1
]
|=
PF_BIT
;
self
->
vs
=
(
self
->
vs
+
1
)
%
8
;
self
->
ack_required
=
FALSE
;
...
...
@@ -830,8 +830,8 @@ void irlap_send_data_primary_poll(struct irlap_cb *self, struct sk_buff *skb)
* Send I(nformation) frame as secondary with final bit set
*
*/
void
irlap_send_data_secondary_final
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
void
irlap_send_data_secondary_final
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
{
struct
sk_buff
*
tx_skb
=
NULL
;
...
...
@@ -842,26 +842,26 @@ void irlap_send_data_secondary_final(struct irlap_cb *self,
/* Is this reliable or unreliable data? */
if
(
skb
->
data
[
1
]
==
I_FRAME
)
{
/*
/*
* Insert frame sequence number (Vs) in control field before
* inserting into transmit window queue.
*/
skb
->
data
[
1
]
=
I_FRAME
|
(
self
->
vs
<<
1
);
tx_skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
tx_skb
==
NULL
)
{
return
;
}
}
/* Insert frame in store */
skb_queue_tail
(
&
self
->
wx_list
,
skb_get
(
skb
));
tx_skb
->
data
[
1
]
|=
PF_BIT
;
self
->
vs
=
(
self
->
vs
+
1
)
%
8
;
self
->
vs
=
(
self
->
vs
+
1
)
%
8
;
self
->
ack_required
=
FALSE
;
irlap_send_i_frame
(
self
,
tx_skb
,
RSP_FRAME
);
irlap_send_i_frame
(
self
,
tx_skb
,
RSP_FRAME
);
}
else
{
if
(
self
->
ack_required
)
{
irlap_send_ui_frame
(
self
,
skb_get
(
skb
),
self
->
caddr
,
RSP_FRAME
);
...
...
@@ -888,32 +888,32 @@ void irlap_send_data_secondary_final(struct irlap_cb *self,
* Send I(nformation) frame as secondary without final bit set
*
*/
void
irlap_send_data_secondary
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
void
irlap_send_data_secondary
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
)
{
struct
sk_buff
*
tx_skb
=
NULL
;
/* Is this reliable or unreliable data? */
if
(
skb
->
data
[
1
]
==
I_FRAME
)
{
/*
/*
* Insert frame sequence number (Vs) in control field before
* inserting into transmit window queue.
*/
skb
->
data
[
1
]
=
I_FRAME
|
(
self
->
vs
<<
1
);
tx_skb
=
skb_clone
(
skb
,
GFP_ATOMIC
);
if
(
tx_skb
==
NULL
)
{
return
;
}
}
/* Insert frame in store */
skb_queue_tail
(
&
self
->
wx_list
,
skb_get
(
skb
));
self
->
vs
=
(
self
->
vs
+
1
)
%
8
;
self
->
ack_required
=
FALSE
;
self
->
ack_required
=
FALSE
;
self
->
window
-=
1
;
irlap_send_i_frame
(
self
,
tx_skb
,
RSP_FRAME
);
irlap_send_i_frame
(
self
,
tx_skb
,
RSP_FRAME
);
}
else
{
irlap_send_ui_frame
(
self
,
skb_get
(
skb
),
self
->
caddr
,
RSP_FRAME
);
self
->
window
-=
1
;
...
...
@@ -923,8 +923,8 @@ void irlap_send_data_secondary(struct irlap_cb *self, struct sk_buff *skb)
/*
* Function irlap_resend_rejected_frames (nr)
*
* Resend frames which has not been acknowledged. Should be safe to
* traverse the list without locking it since this function will only be
* Resend frames which has not been acknowledged. Should be safe to
* traverse the list without locking it since this function will only be
* called from interrupt context (BH)
*/
void
irlap_resend_rejected_frames
(
struct
irlap_cb
*
self
,
int
command
)
...
...
@@ -946,8 +946,8 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
while
(
skb
!=
NULL
)
{
irlap_wait_min_turn_around
(
self
,
&
self
->
qos_tx
);
/* We copy the skb to be retransmitted since we will have to
* modify it. Cloning will confuse packet sniffers
/* We copy the skb to be retransmitted since we will have to
* modify it. Cloning will confuse packet sniffers
*/
/* tx_skb = skb_clone( skb, GFP_ATOMIC); */
tx_skb
=
skb_copy
(
skb
,
GFP_ATOMIC
);
...
...
@@ -962,17 +962,17 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
/* Clear old Nr field + poll bit */
tx_skb
->
data
[
1
]
&=
0x0f
;
/*
/*
* Set poll bit on the last frame retransmitted
*/
if
(
count
--
==
1
)
tx_skb
->
data
[
1
]
|=
PF_BIT
;
/* Set p/f bit */
if
(
count
--
==
1
)
tx_skb
->
data
[
1
]
|=
PF_BIT
;
/* Set p/f bit */
else
tx_skb
->
data
[
1
]
&=
~
PF_BIT
;
/* Clear p/f bit */
irlap_send_i_frame
(
self
,
tx_skb
,
command
);
/*
/*
* If our skb is the last buffer in the list, then
* we are finished, if not, move to the next sk-buffer
*/
...
...
@@ -982,23 +982,23 @@ void irlap_resend_rejected_frames(struct irlap_cb *self, int command)
skb
=
skb
->
next
;
}
#if 0 /* Not yet */
/*
/*
* We can now fill the window with additinal data frames
*/
while (skb_queue_len( &self->txq) > 0) {
IRDA_DEBUG(0, __FUNCTION__ "(), sending additional frames!\n");
if ((skb_queue_len( &self->txq) > 0) &&
if ((skb_queue_len( &self->txq) > 0) &&
(self->window > 0)) {
skb = skb_dequeue( &self->txq);
skb = skb_dequeue( &self->txq);
ASSERT(skb != NULL, return;);
/*
* If send window > 1 then send frame with pf
* If send window > 1 then send frame with pf
* bit cleared
*/
if ((self->window > 1) &&
skb_queue_len(&self->txq) > 0)
*/
if ((self->window > 1) &&
skb_queue_len(&self->txq) > 0)
{
irlap_send_data_primary(self, skb);
} else {
...
...
@@ -1026,14 +1026,14 @@ void irlap_resend_rejected_frame(struct irlap_cb *self, int command)
if
(
skb
!=
NULL
)
{
irlap_wait_min_turn_around
(
self
,
&
self
->
qos_tx
);
/* We copy the skb to be retransmitted since we will have to
* modify it. Cloning will confuse packet sniffers
/* We copy the skb to be retransmitted since we will have to
* modify it. Cloning will confuse packet sniffers
*/
/* tx_skb = skb_clone( skb, GFP_ATOMIC); */
tx_skb
=
skb_copy
(
skb
,
GFP_ATOMIC
);
if
(
!
tx_skb
)
{
IRDA_DEBUG
(
0
,
__FUNCTION__
"(), unable to copy
\n
"
);
return
;
return
;
}
/* Unlink tx_skb from list */
tx_skb
->
next
=
tx_skb
->
prev
=
NULL
;
...
...
@@ -1044,7 +1044,7 @@ void irlap_resend_rejected_frame(struct irlap_cb *self, int command)
/* Set poll/final bit */
tx_skb
->
data
[
1
]
|=
PF_BIT
;
/* Set p/f bit */
irlap_send_i_frame
(
self
,
tx_skb
,
command
);
}
}
...
...
@@ -1055,15 +1055,15 @@ void irlap_resend_rejected_frame(struct irlap_cb *self, int command)
* Contruct and transmit an Unnumbered Information (UI) frame
*
*/
void
irlap_send_ui_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
void
irlap_send_ui_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
__u8
caddr
,
int
command
)
{
IRDA_DEBUG
(
4
,
__FUNCTION__
"()
\n
"
);
ASSERT
(
self
!=
NULL
,
return
;);
ASSERT
(
self
->
magic
==
LAP_MAGIC
,
return
;);
ASSERT
(
skb
!=
NULL
,
return
;);
/* Insert connection address */
skb
->
data
[
0
]
=
caddr
|
((
command
)
?
CMD_FRAME
:
0
);
...
...
@@ -1075,13 +1075,13 @@ void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb,
*
* Contruct and transmit Information (I) frame
*/
void
irlap_send_i_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
int
command
)
void
irlap_send_i_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
int
command
)
{
/* Insert connection address */
skb
->
data
[
0
]
=
self
->
caddr
;
skb
->
data
[
0
]
|=
(
command
)
?
CMD_FRAME
:
0
;
/* Insert next to receive (Vr) */
skb
->
data
[
1
]
|=
(
self
->
vr
<<
5
);
/* insert nr */
...
...
@@ -1094,9 +1094,9 @@ void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb,
* Receive and parse an I (Information) frame, no harm in making it inline
* since it's called only from one single place (irlap_driver_rcv).
*/
static
inline
void
irlap_recv_i_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
static
inline
void
irlap_recv_i_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
info
->
nr
=
skb
->
data
[
1
]
>>
5
;
/* Next to receive */
info
->
pf
=
skb
->
data
[
1
]
&
PF_BIT
;
/* Final bit */
...
...
@@ -1115,7 +1115,7 @@ static inline void irlap_recv_i_frame(struct irlap_cb *self,
* Receive and parse an Unnumbered Information (UI) frame
*
*/
static
void
irlap_recv_ui_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
void
irlap_recv_ui_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
IRDA_DEBUG
(
4
,
__FUNCTION__
"()
\n
"
);
...
...
@@ -1131,19 +1131,19 @@ static void irlap_recv_ui_frame(struct irlap_cb *self, struct sk_buff *skb,
* Received Frame Reject response.
*
*/
static
void
irlap_recv_frmr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
static
void
irlap_recv_frmr_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
)
{
__u8
*
frame
;
int
w
,
x
,
y
,
z
;
IRDA_DEBUG
(
0
,
__FUNCTION__
"()
\n
"
);
ASSERT
(
self
!=
NULL
,
return
;);
ASSERT
(
self
->
magic
==
LAP_MAGIC
,
return
;);
ASSERT
(
skb
!=
NULL
,
return
;);
ASSERT
(
info
!=
NULL
,
return
;);
frame
=
skb
->
data
;
info
->
nr
=
frame
[
2
]
>>
5
;
/* Next to receive */
...
...
@@ -1154,11 +1154,11 @@ static void irlap_recv_frmr_frame(struct irlap_cb *self, struct sk_buff *skb,
x
=
frame
[
3
]
&
0x02
;
y
=
frame
[
3
]
&
0x04
;
z
=
frame
[
3
]
&
0x08
;
if
(
w
)
{
IRDA_DEBUG
(
0
,
"Rejected control field is undefined or not "
"implemented.
\n
"
);
}
}
if
(
x
)
{
IRDA_DEBUG
(
0
,
"Rejected control field was invalid because it "
"contained a non permitted I field.
\n
"
);
...
...
@@ -1181,7 +1181,7 @@ static void irlap_recv_frmr_frame(struct irlap_cb *self, struct sk_buff *skb,
* Send a test frame response
*
*/
void
irlap_send_test_frame
(
struct
irlap_cb
*
self
,
__u8
caddr
,
__u32
daddr
,
void
irlap_send_test_frame
(
struct
irlap_cb
*
self
,
__u8
caddr
,
__u32
daddr
,
struct
sk_buff
*
cmd
)
{
struct
sk_buff
*
skb
;
...
...
@@ -1194,7 +1194,7 @@ void irlap_send_test_frame(struct irlap_cb *self, __u8 caddr, __u32 daddr,
/* Broadcast frames must include saddr and daddr fields */
if
(
caddr
==
CBROADCAST
)
{
frame
=
(
struct
test_frame
*
)
frame
=
(
struct
test_frame
*
)
skb_put
(
skb
,
sizeof
(
struct
test_frame
));
/* Insert the swapped addresses */
...
...
@@ -1221,29 +1221,29 @@ void irlap_send_test_frame(struct irlap_cb *self, __u8 caddr, __u32 daddr,
* Receive a test frame
*
*/
static
void
irlap_recv_test_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
static
void
irlap_recv_test_frame
(
struct
irlap_cb
*
self
,
struct
sk_buff
*
skb
,
struct
irlap_info
*
info
,
int
command
)
{
struct
test_frame
*
frame
;
IRDA_DEBUG
(
2
,
__FUNCTION__
"()
\n
"
);
frame
=
(
struct
test_frame
*
)
skb
->
data
;
/* Broadcast frames must carry saddr and daddr fields */
if
(
info
->
caddr
==
CBROADCAST
)
{
if
(
skb
->
len
<
sizeof
(
struct
test_frame
))
{
IRDA_DEBUG
(
0
,
__FUNCTION__
IRDA_DEBUG
(
0
,
__FUNCTION__
"() test frame to short!
\n
"
);
return
;
}
/* Read and swap addresses */
info
->
daddr
=
le32_to_cpu
(
frame
->
saddr
);
info
->
saddr
=
le32_to_cpu
(
frame
->
daddr
);
/* Make sure frame is addressed to us */
if
((
info
->
saddr
!=
self
->
saddr
)
&&
if
((
info
->
saddr
!=
self
->
saddr
)
&&
(
info
->
saddr
!=
BROADCAST
))
{
return
;
}
...
...
@@ -1258,18 +1258,18 @@ static void irlap_recv_test_frame(struct irlap_cb *self, struct sk_buff *skb,
/*
* Function irlap_driver_rcv (skb, netdev, ptype)
*
* Called when a frame is received. Dispatches the right receive function
* Called when a frame is received. Dispatches the right receive function
* for processing of the frame.
*
*/
int
irlap_driver_rcv
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
int
irlap_driver_rcv
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
packet_type
*
ptype
)
{
struct
irlap_info
info
;
struct
irlap_cb
*
self
;
int
command
;
__u8
control
;
/* FIXME: should we get our own field? */
self
=
(
struct
irlap_cb
*
)
dev
->
atalk_ptr
;
...
...
@@ -1281,14 +1281,14 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
/* Check if frame is large enough for parsing */
if
(
skb
->
len
<
2
)
{
ERROR
(
__FUNCTION__
"(), frame to short!
\n
"
);
ERROR
(
"%s: frame to short!
\n
"
,
__FUNCTION__
);
dev_kfree_skb
(
skb
);
return
-
1
;
}
command
=
skb
->
data
[
0
]
&
CMD_FRAME
;
info
.
caddr
=
skb
->
data
[
0
]
&
CBROADCAST
;
info
.
pf
=
skb
->
data
[
1
]
&
PF_BIT
;
info
.
control
=
skb
->
data
[
1
]
&
~
PF_BIT
;
/* Mask away poll/final bit */
...
...
@@ -1299,7 +1299,7 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
IRDA_DEBUG
(
0
,
__FUNCTION__
"(), wrong connection address!
\n
"
);
goto
out
;
}
/*
/*
* Optimize for the common case and check if the frame is an
* I(nformation) frame. Only I-frames have bit 0 set to 0
*/
...
...
@@ -1308,11 +1308,11 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
goto
out
;
}
/*
* We now check is the frame is an S(upervisory) frame. Only
* We now check is the frame is an S(upervisory) frame. Only
* S-frames have bit 0 set to 1 and bit 1 set to 0
*/
if
(
~
control
&
0x02
)
{
/*
/*
* Received S(upervisory) frame, check which frame type it is
* only the first nibble is of interest
*/
...
...
@@ -1330,15 +1330,14 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
irlap_recv_srej_frame
(
self
,
skb
,
&
info
,
command
);
break
;
default:
WARNING
(
__FUNCTION__
"() Unknown S-frame %02x received!
\n
"
,
info
.
control
);
WARNING
(
"%s: Unknown S-frame %02x received!
\n
"
,
__FUNCTION__
,
info
.
control
);
break
;
}
goto
out
;
}
/*
* This must be a C(ontrol) frame
/*
* This must be a C(ontrol) frame
*/
switch
(
control
)
{
case
XID_RSP
:
...
...
@@ -1369,11 +1368,11 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
irlap_recv_ui_frame
(
self
,
skb
,
&
info
);
break
;
default:
WARNING
(
__FUNCTION__
"(), Unknown frame %02x received!
\n
"
,
info
.
control
);
WARNING
(
"%s: Unknown frame %02x received!
\n
"
,
__FUNCTION__
,
info
.
control
);
break
;
}
out:
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment