mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 21:51:05 +00:00
wext: Emit event stream entries correctly when compat.
Three major portions to this change: 1) Add IW_EV_COMPAT_LCP_LEN, IW_EV_COMPAT_POINT_OFF, and IW_EV_COMPAT_POINT_LEN helper defines. 2) Delete iw_stream_check_add_*(), they are unused. 3) Add iw_request_info argument to iwe_stream_add_*(), and use it to size the event and pointer lengths correctly depending upon whether IW_REQUEST_FLAG_COMPAT is set or not. 4) The mechanical transformations to the drivers and wireless stack bits to get the iw_request_info passed down into the routines modified in #3. Also, explicit references to IW_EV_LCP_LEN are replaced with iwe_stream_lcp_len(info). With a lot of help and bug fixes from Masakazu Mokuno. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0f5cabba49
commit
ccc580571c
18 changed files with 351 additions and 314 deletions
|
@ -478,24 +478,56 @@ extern void wireless_spy_update(struct net_device * dev,
|
|||
* Function that are so simple that it's more efficient inlining them
|
||||
*/
|
||||
|
||||
static inline int iwe_stream_lcp_len(struct iw_request_info *info)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (info->flags & IW_REQUEST_FLAG_COMPAT)
|
||||
return IW_EV_COMPAT_LCP_LEN;
|
||||
#endif
|
||||
return IW_EV_LCP_LEN;
|
||||
}
|
||||
|
||||
static inline int iwe_stream_point_len(struct iw_request_info *info)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (info->flags & IW_REQUEST_FLAG_COMPAT)
|
||||
return IW_EV_COMPAT_POINT_LEN;
|
||||
#endif
|
||||
return IW_EV_POINT_LEN;
|
||||
}
|
||||
|
||||
static inline int iwe_stream_event_len_adjust(struct iw_request_info *info,
|
||||
int event_len)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (info->flags & IW_REQUEST_FLAG_COMPAT) {
|
||||
event_len -= IW_EV_LCP_LEN;
|
||||
event_len += IW_EV_COMPAT_LCP_LEN;
|
||||
}
|
||||
#endif
|
||||
|
||||
return event_len;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wrapper to add an Wireless Event to a stream of events.
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_add_event(char * stream, /* Stream of events */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload */
|
||||
int event_len) /* Real size of payload */
|
||||
iwe_stream_add_event(struct iw_request_info *info, char *stream, char *ends,
|
||||
struct iw_event *iwe, int event_len)
|
||||
{
|
||||
int lcp_len = iwe_stream_lcp_len(info);
|
||||
|
||||
event_len = iwe_stream_event_len_adjust(info, event_len);
|
||||
|
||||
/* Check if it's possible */
|
||||
if(likely((stream + event_len) < ends)) {
|
||||
iwe->len = event_len;
|
||||
/* Beware of alignement issues on 64 bits */
|
||||
memcpy(stream, (char *) iwe, IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_LCP_LEN,
|
||||
((char *) iwe) + IW_EV_LCP_LEN,
|
||||
event_len - IW_EV_LCP_LEN);
|
||||
memcpy(stream + lcp_len, &iwe->u,
|
||||
event_len - lcp_len);
|
||||
stream += event_len;
|
||||
}
|
||||
return stream;
|
||||
|
@ -507,20 +539,21 @@ iwe_stream_add_event(char * stream, /* Stream of events */
|
|||
* stream of events.
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_add_point(char * stream, /* Stream of events */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload length + flags */
|
||||
char * extra) /* More payload */
|
||||
iwe_stream_add_point(struct iw_request_info *info, char *stream, char *ends,
|
||||
struct iw_event *iwe, char *extra)
|
||||
{
|
||||
int event_len = IW_EV_POINT_LEN + iwe->u.data.length;
|
||||
int event_len = iwe_stream_point_len(info) + iwe->u.data.length;
|
||||
int point_len = iwe_stream_point_len(info);
|
||||
int lcp_len = iwe_stream_lcp_len(info);
|
||||
|
||||
/* Check if it's possible */
|
||||
if(likely((stream + event_len) < ends)) {
|
||||
iwe->len = event_len;
|
||||
memcpy(stream, (char *) iwe, IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_LCP_LEN,
|
||||
((char *) iwe) + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
|
||||
memcpy(stream + lcp_len,
|
||||
((char *) &iwe->u) + IW_EV_POINT_OFF,
|
||||
IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_POINT_LEN, extra, iwe->u.data.length);
|
||||
memcpy(stream + point_len, extra, iwe->u.data.length);
|
||||
stream += event_len;
|
||||
}
|
||||
return stream;
|
||||
|
@ -533,110 +566,24 @@ iwe_stream_add_point(char * stream, /* Stream of events */
|
|||
* At the first run, you need to have (value = event + IW_EV_LCP_LEN).
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_add_value(char * event, /* Event in the stream */
|
||||
char * value, /* Value in event */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload */
|
||||
int event_len) /* Real size of payload */
|
||||
iwe_stream_add_value(struct iw_request_info *info, char *event, char *value,
|
||||
char *ends, struct iw_event *iwe, int event_len)
|
||||
{
|
||||
int lcp_len = iwe_stream_lcp_len(info);
|
||||
|
||||
/* Don't duplicate LCP */
|
||||
event_len -= IW_EV_LCP_LEN;
|
||||
|
||||
/* Check if it's possible */
|
||||
if(likely((value + event_len) < ends)) {
|
||||
/* Add new value */
|
||||
memcpy(value, (char *) iwe + IW_EV_LCP_LEN, event_len);
|
||||
memcpy(value, &iwe->u, event_len);
|
||||
value += event_len;
|
||||
/* Patch LCP */
|
||||
iwe->len = value - event;
|
||||
memcpy(event, (char *) iwe, IW_EV_LCP_LEN);
|
||||
memcpy(event, (char *) iwe, lcp_len);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wrapper to add an Wireless Event to a stream of events.
|
||||
* Same as above, with explicit error check...
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_check_add_event(char * stream, /* Stream of events */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload */
|
||||
int event_len, /* Size of payload */
|
||||
int * perr) /* Error report */
|
||||
{
|
||||
/* Check if it's possible, set error if not */
|
||||
if(likely((stream + event_len) < ends)) {
|
||||
iwe->len = event_len;
|
||||
/* Beware of alignement issues on 64 bits */
|
||||
memcpy(stream, (char *) iwe, IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_LCP_LEN,
|
||||
((char *) iwe) + IW_EV_LCP_LEN,
|
||||
event_len - IW_EV_LCP_LEN);
|
||||
stream += event_len;
|
||||
} else
|
||||
*perr = -E2BIG;
|
||||
return stream;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wrapper to add an short Wireless Event containing a pointer to a
|
||||
* stream of events.
|
||||
* Same as above, with explicit error check...
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_check_add_point(char * stream, /* Stream of events */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload length + flags */
|
||||
char * extra, /* More payload */
|
||||
int * perr) /* Error report */
|
||||
{
|
||||
int event_len = IW_EV_POINT_LEN + iwe->u.data.length;
|
||||
/* Check if it's possible */
|
||||
if(likely((stream + event_len) < ends)) {
|
||||
iwe->len = event_len;
|
||||
memcpy(stream, (char *) iwe, IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_LCP_LEN,
|
||||
((char *) iwe) + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
|
||||
IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN);
|
||||
memcpy(stream + IW_EV_POINT_LEN, extra, iwe->u.data.length);
|
||||
stream += event_len;
|
||||
} else
|
||||
*perr = -E2BIG;
|
||||
return stream;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Wrapper to add a value to a Wireless Event in a stream of events.
|
||||
* Be careful, this one is tricky to use properly :
|
||||
* At the first run, you need to have (value = event + IW_EV_LCP_LEN).
|
||||
* Same as above, with explicit error check...
|
||||
*/
|
||||
static inline char *
|
||||
iwe_stream_check_add_value(char * event, /* Event in the stream */
|
||||
char * value, /* Value in event */
|
||||
char * ends, /* End of stream */
|
||||
struct iw_event *iwe, /* Payload */
|
||||
int event_len, /* Size of payload */
|
||||
int * perr) /* Error report */
|
||||
{
|
||||
/* Don't duplicate LCP */
|
||||
event_len -= IW_EV_LCP_LEN;
|
||||
|
||||
/* Check if it's possible */
|
||||
if(likely((value + event_len) < ends)) {
|
||||
/* Add new value */
|
||||
memcpy(value, (char *) iwe + IW_EV_LCP_LEN, event_len);
|
||||
value += event_len;
|
||||
/* Patch LCP */
|
||||
iwe->len = value - event;
|
||||
memcpy(event, (char *) iwe, IW_EV_LCP_LEN);
|
||||
} else
|
||||
*perr = -E2BIG;
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* _IW_HANDLER_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue