Предыдущий цикл обновлений рукописи "Драйверы и модули ядра Linux" завершён 10 июля 2014 года, одновременно с завершением цикла лекций по этому материалу для разработчиков компании Global Logic, а также преподавателей и аспирантов некскольких киевских университетов.
Я предполагал некоторое время ... пожить спокойно, не возвращаться к этому тексту и архиву примеров кодов к нему. Если бы не...
... в версии ядра 3.17 разработчики радикально поменяли прототипы ключевых макросов ... по-крайней мере, то что мне сразу удалось отследить - в подсистеме сетевого стека ("удалось отследить" - это то, что сразу перестали компилироваться как драйвер, например, WiFi чипа Broadcom Corporation BCM43228, так и полтора десятка примеров модулей в архиве этой рукописи).
Какие изменения (те, что я заметил):
1. В <linux/netdevice.h> - создание сетевого интерфейса:
- было:
#define alloc_netdev( sizeof_priv, name, setup )
#define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */
#define NET_NAME_ENUM 1 /* enumerated by kernel */
#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */
#define NET_NAME_USER 3 /* provided by user-space */
#define NET_NAME_RENAMED 4 /* renamed by user-space */
Я предполагал некоторое время ... пожить спокойно, не возвращаться к этому тексту и архиву примеров кодов к нему. Если бы не...
... в версии ядра 3.17 разработчики радикально поменяли прототипы ключевых макросов ... по-крайней мере, то что мне сразу удалось отследить - в подсистеме сетевого стека ("удалось отследить" - это то, что сразу перестали компилироваться как драйвер, например, WiFi чипа Broadcom Corporation BCM43228, так и полтора десятка примеров модулей в архиве этой рукописи).
Какие изменения (те, что я заметил):
1. В <linux/netdevice.h> - создание сетевого интерфейса:
- было:
#define alloc_netdev( sizeof_priv, name, setup )
- стало:
#define alloc_netdev( sizeof_priv, name, name_assign_type, setup )
Как легко видеть, теперь вместо 3-х
параметров 4, 3-й из которых — константа,
определяющая порядок нумерации
создаваемых интерфейсов, описанная в
том же файле определений:
/* interface name assignment types (sysfs name_assign_type attribute) */#define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */
#define NET_NAME_ENUM 1 /* enumerated by kernel */
#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */
#define NET_NAME_USER 3 /* provided by user-space */
#define NET_NAME_RENAMED 4 /* renamed by user-space */
2. Во всём, что касается стандартов WiFi (файл <net/cfg802211.h>) ... в тексте и примерах это никак не нашло отражения, но всё же : начиная с 3.14 ядра изменилось число параметров и стало:
/*
* cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
* @dev: network device
* @bssid: the BSSID of the IBSS joined
* @channel: the channel of the IBSS joined
* @gfp: allocation flags
*
* This function notifies cfg80211 that the device joined an IBSS or
* switched to a different BSSID. Before this function can be called,
* either a beacon has to have been received from the IBSS, or one of
* the cfg80211_inform_bss{,_frame} functions must have been called
* with the locally generated beacon -- this guarantees that there is
* always a scan result for this IBSS. cfg80211 will handle the rest.
*/
void cfg80211_ibss_joined( struct net_device *dev, const u8 *bssid,
struct ieee80211_channel *channel, gfp_t gfp );
Здесь новый 3-й параметр имеет определение (в том же <net/cfg802211.h>):
/*
* struct ieee80211_channel - channel definition
*
* This structure describes a single channel for use
* with cfg80211.
*
* @center_freq: center frequency in MHz
* @hw_value: hardware-specific value for the channel
* @flags: channel flags from &enum ieee80211_channel_flags.
* @orig_flags: channel flags at registration time, used by regulatory
* code to support devices with additional restrictions
* @band: band this channel belongs to.
* @max_antenna_gain: maximum antenna gain in dBi
* @max_power: maximum transmission power (in dBm)
* @max_reg_power: maximum regulatory transmission power (in dBm)
* @beacon_found: helper to regulatory code to indicate when a beacon
* has been found on this channel. Use regulatory_hint_found_beacon()
* to enable this, this is useful only on 5 GHz band.
* @orig_mag: internal use
* @orig_mpwr: internal use
* @dfs_state: current state of this channel. Only relevant if radar is required
* on this channel.
* @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
* @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
*/
struct ieee80211_channel { enum ieee80211_band band;
u16 center_freq;
u16 hw_value;
u32 flags;
int max_antenna_gain;
int max_power;
int max_reg_power;
bool beacon_found;
u32 orig_flags;
int orig_mag, orig_mpwr;
enum nl80211_dfs_state dfs_state;
unsigned long dfs_state_entered;
unsigned int dfs_cac_ms;
};
Как это обычно бывает, в старых кодах драйверов, вместо этого 3-го параметра в вызовах cfg80211_ibss_joined(), можно поставить просто NULL (проверено - работает для BCM43228).
В итоге - пришлось сесть за пересмотр текста и примеров раньше, чем это планировалось.
Желающие смогут свободно обновить свой экземпляр текста и примеров кода.
Как и раньше, всё это предоставляется под лицензией Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/), о которой, если кому неизвестно, читайте подробнее в более ранних сообщениях.
Номер последней редакции: 223
Объём (страниц): 425
Размер файла текста: 1478880
Размер архива кодов: 893557
Дата размещения: 20 января 2015
Скачать эту редакцию текст и архив примеров к нему можно:
Google: текст и архив
Yandex: текст и архивРазмер файла текста: 1478880
Размер архива кодов: 893557
Дата размещения: 20 января 2015
Скачать эту редакцию текст и архив примеров к нему можно:
Google: текст и архив