diff options
Diffstat (limited to 'drivers/ieee802154/fakehard.c')
| -rw-r--r-- | drivers/ieee802154/fakehard.c | 130 |
1 files changed, 125 insertions, 5 deletions
diff --git a/drivers/ieee802154/fakehard.c b/drivers/ieee802154/fakehard.c index 14045a7ba388..c94d2c24c352 100644 --- a/drivers/ieee802154/fakehard.c +++ b/drivers/ieee802154/fakehard.c | |||
| @@ -26,11 +26,17 @@ | |||
| 26 | #include <linux/skbuff.h> | 26 | #include <linux/skbuff.h> |
| 27 | #include <linux/if_arp.h> | 27 | #include <linux/if_arp.h> |
| 28 | 28 | ||
| 29 | #include <net/ieee802154/af_ieee802154.h> | 29 | #include <net/af_ieee802154.h> |
| 30 | #include <net/ieee802154/netdevice.h> | 30 | #include <net/ieee802154_netdev.h> |
| 31 | #include <net/ieee802154/mac_def.h> | 31 | #include <net/ieee802154.h> |
| 32 | #include <net/ieee802154/nl802154.h> | 32 | #include <net/nl802154.h> |
| 33 | 33 | ||
| 34 | /** | ||
| 35 | * fake_get_pan_id - Retrieve the PAN ID of the device. | ||
| 36 | * @dev: The network device to retrieve the PAN of. | ||
| 37 | * | ||
| 38 | * Return the ID of the PAN from the PIB. | ||
| 39 | */ | ||
| 34 | static u16 fake_get_pan_id(struct net_device *dev) | 40 | static u16 fake_get_pan_id(struct net_device *dev) |
| 35 | { | 41 | { |
| 36 | BUG_ON(dev->type != ARPHRD_IEEE802154); | 42 | BUG_ON(dev->type != ARPHRD_IEEE802154); |
| @@ -38,6 +44,14 @@ static u16 fake_get_pan_id(struct net_device *dev) | |||
| 38 | return 0xeba1; | 44 | return 0xeba1; |
| 39 | } | 45 | } |
| 40 | 46 | ||
| 47 | /** | ||
| 48 | * fake_get_short_addr - Retrieve the short address of the device. | ||
| 49 | * @dev: The network device to retrieve the short address of. | ||
| 50 | * | ||
| 51 | * Returns the IEEE 802.15.4 short-form address cached for this | ||
| 52 | * device. If the device has not yet had a short address assigned | ||
| 53 | * then this should return 0xFFFF to indicate a lack of association. | ||
| 54 | */ | ||
| 41 | static u16 fake_get_short_addr(struct net_device *dev) | 55 | static u16 fake_get_short_addr(struct net_device *dev) |
| 42 | { | 56 | { |
| 43 | BUG_ON(dev->type != ARPHRD_IEEE802154); | 57 | BUG_ON(dev->type != ARPHRD_IEEE802154); |
| @@ -45,6 +59,19 @@ static u16 fake_get_short_addr(struct net_device *dev) | |||
| 45 | return 0x1; | 59 | return 0x1; |
| 46 | } | 60 | } |
| 47 | 61 | ||
| 62 | /** | ||
| 63 | * fake_get_dsn - Retrieve the DSN of the device. | ||
| 64 | * @dev: The network device to retrieve the DSN for. | ||
| 65 | * | ||
| 66 | * Returns the IEEE 802.15.4 DSN for the network device. | ||
| 67 | * The DSN is the sequence number which will be added to each | ||
| 68 | * packet or MAC command frame by the MAC during transmission. | ||
| 69 | * | ||
| 70 | * DSN means 'Data Sequence Number'. | ||
| 71 | * | ||
| 72 | * Note: This is in section 7.2.1.2 of the IEEE 802.15.4-2006 | ||
| 73 | * document. | ||
| 74 | */ | ||
| 48 | static u8 fake_get_dsn(struct net_device *dev) | 75 | static u8 fake_get_dsn(struct net_device *dev) |
| 49 | { | 76 | { |
| 50 | BUG_ON(dev->type != ARPHRD_IEEE802154); | 77 | BUG_ON(dev->type != ARPHRD_IEEE802154); |
| @@ -52,6 +79,19 @@ static u8 fake_get_dsn(struct net_device *dev) | |||
| 52 | return 0x00; /* DSN are implemented in HW, so return just 0 */ | 79 | return 0x00; /* DSN are implemented in HW, so return just 0 */ |
| 53 | } | 80 | } |
| 54 | 81 | ||
| 82 | /** | ||
| 83 | * fake_get_bsn - Retrieve the BSN of the device. | ||
| 84 | * @dev: The network device to retrieve the BSN for. | ||
| 85 | * | ||
| 86 | * Returns the IEEE 802.15.4 BSN for the network device. | ||
| 87 | * The BSN is the sequence number which will be added to each | ||
| 88 | * beacon frame sent by the MAC. | ||
| 89 | * | ||
| 90 | * BSN means 'Beacon Sequence Number'. | ||
| 91 | * | ||
| 92 | * Note: This is in section 7.2.1.2 of the IEEE 802.15.4-2006 | ||
| 93 | * document. | ||
| 94 | */ | ||
| 55 | static u8 fake_get_bsn(struct net_device *dev) | 95 | static u8 fake_get_bsn(struct net_device *dev) |
| 56 | { | 96 | { |
| 57 | BUG_ON(dev->type != ARPHRD_IEEE802154); | 97 | BUG_ON(dev->type != ARPHRD_IEEE802154); |
| @@ -59,6 +99,19 @@ static u8 fake_get_bsn(struct net_device *dev) | |||
| 59 | return 0x00; /* BSN are implemented in HW, so return just 0 */ | 99 | return 0x00; /* BSN are implemented in HW, so return just 0 */ |
| 60 | } | 100 | } |
| 61 | 101 | ||
| 102 | /** | ||
| 103 | * fake_assoc_req - Make an association request to the HW. | ||
| 104 | * @dev: The network device which we are associating to a network. | ||
| 105 | * @addr: The coordinator with which we wish to associate. | ||
| 106 | * @channel: The channel on which to associate. | ||
| 107 | * @cap: The capability information field to use in the association. | ||
| 108 | * | ||
| 109 | * Start an association with a coordinator. The coordinator's address | ||
| 110 | * and PAN ID can be found in @addr. | ||
| 111 | * | ||
| 112 | * Note: This is in section 7.3.1 and 7.5.3.1 of the IEEE | ||
| 113 | * 802.15.4-2006 document. | ||
| 114 | */ | ||
| 62 | static int fake_assoc_req(struct net_device *dev, | 115 | static int fake_assoc_req(struct net_device *dev, |
| 63 | struct ieee802154_addr *addr, u8 channel, u8 cap) | 116 | struct ieee802154_addr *addr, u8 channel, u8 cap) |
| 64 | { | 117 | { |
| @@ -67,18 +120,70 @@ static int fake_assoc_req(struct net_device *dev, | |||
| 67 | IEEE802154_SUCCESS); | 120 | IEEE802154_SUCCESS); |
| 68 | } | 121 | } |
| 69 | 122 | ||
| 123 | /** | ||
| 124 | * fake_assoc_resp - Send an association response to a device. | ||
| 125 | * @dev: The network device on which to send the response. | ||
| 126 | * @addr: The address of the device to respond to. | ||
| 127 | * @short_addr: The assigned short address for the device (if any). | ||
| 128 | * @status: The result of the association request. | ||
| 129 | * | ||
| 130 | * Queue the association response of the coordinator to another | ||
| 131 | * device's attempt to associate with the network which we | ||
| 132 | * coordinate. This is then added to the indirect-send queue to be | ||
| 133 | * transmitted to the end device when it polls for data. | ||
| 134 | * | ||
| 135 | * Note: This is in section 7.3.2 and 7.5.3.1 of the IEEE | ||
| 136 | * 802.15.4-2006 document. | ||
| 137 | */ | ||
| 70 | static int fake_assoc_resp(struct net_device *dev, | 138 | static int fake_assoc_resp(struct net_device *dev, |
| 71 | struct ieee802154_addr *addr, u16 short_addr, u8 status) | 139 | struct ieee802154_addr *addr, u16 short_addr, u8 status) |
| 72 | { | 140 | { |
| 73 | return 0; | 141 | return 0; |
| 74 | } | 142 | } |
| 75 | 143 | ||
| 144 | /** | ||
| 145 | * fake_disassoc_req - Disassociate a device from a network. | ||
| 146 | * @dev: The network device on which we're disassociating a device. | ||
| 147 | * @addr: The device to disassociate from the network. | ||
| 148 | * @reason: The reason to give to the device for being disassociated. | ||
| 149 | * | ||
| 150 | * This sends a disassociation notification to the device being | ||
| 151 | * disassociated from the network. | ||
| 152 | * | ||
| 153 | * Note: This is in section 7.5.3.2 of the IEEE 802.15.4-2006 | ||
| 154 | * document, with the reason described in 7.3.3.2. | ||
| 155 | */ | ||
| 76 | static int fake_disassoc_req(struct net_device *dev, | 156 | static int fake_disassoc_req(struct net_device *dev, |
| 77 | struct ieee802154_addr *addr, u8 reason) | 157 | struct ieee802154_addr *addr, u8 reason) |
| 78 | { | 158 | { |
| 79 | return ieee802154_nl_disassoc_confirm(dev, IEEE802154_SUCCESS); | 159 | return ieee802154_nl_disassoc_confirm(dev, IEEE802154_SUCCESS); |
| 80 | } | 160 | } |
| 81 | 161 | ||
| 162 | /** | ||
| 163 | * fake_start_req - Start an IEEE 802.15.4 PAN. | ||
| 164 | * @dev: The network device on which to start the PAN. | ||
| 165 | * @addr: The coordinator address to use when starting the PAN. | ||
| 166 | * @channel: The channel on which to start the PAN. | ||
| 167 | * @bcn_ord: Beacon order. | ||
| 168 | * @sf_ord: Superframe order. | ||
| 169 | * @pan_coord: Whether or not we are the PAN coordinator or just | ||
| 170 | * requesting a realignment perhaps? | ||
| 171 | * @blx: Battery Life Extension feature bitfield. | ||
| 172 | * @coord_realign: Something to realign something else. | ||
| 173 | * | ||
| 174 | * If pan_coord is non-zero then this starts a network with the | ||
| 175 | * provided parameters, otherwise it attempts a coordinator | ||
| 176 | * realignment of the stated network instead. | ||
| 177 | * | ||
| 178 | * Note: This is in section 7.5.2.3 of the IEEE 802.15.4-2006 | ||
| 179 | * document, with 7.3.8 describing coordinator realignment. | ||
| 180 | * | ||
| 181 | * Note: There is currently no way to notify the coordinator userland | ||
| 182 | * program of whether or not the PAN has started successfully. As | ||
| 183 | * such, the coordinator program cannot know when the MAC has | ||
| 184 | * completed starting the network and will simply have to assume | ||
| 185 | * completeness based on some form of time delay. | ||
| 186 | */ | ||
| 82 | static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, | 187 | static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, |
| 83 | u8 channel, | 188 | u8 channel, |
| 84 | u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, | 189 | u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, |
| @@ -87,6 +192,21 @@ static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, | |||
| 87 | return 0; | 192 | return 0; |
| 88 | } | 193 | } |
| 89 | 194 | ||
| 195 | /** | ||
| 196 | * fake_scan_req - Start a channel scan. | ||
| 197 | * @dev: The network device on which to perform a channel scan. | ||
| 198 | * @type: The type of scan to perform. | ||
| 199 | * @channels: The channel bitmask to scan. | ||
| 200 | * @duration: How long to spend on each channel. | ||
| 201 | * | ||
| 202 | * This starts either a passive (energy) scan or an active (PAN) scan | ||
| 203 | * on the channels indicated in the @channels bitmask. The duration of | ||
| 204 | * the scan is measured in terms of superframe duration. Specifically, | ||
| 205 | * the scan will spend aBaseSuperFrameDuration * ((2^n) + 1) on each | ||
| 206 | * channel. | ||
| 207 | * | ||
| 208 | * Note: This is in section 7.5.2.1 of the IEEE 802.15.4-2006 document. | ||
| 209 | */ | ||
| 90 | static int fake_scan_req(struct net_device *dev, u8 type, u32 channels, | 210 | static int fake_scan_req(struct net_device *dev, u8 type, u32 channels, |
| 91 | u8 duration) | 211 | u8 duration) |
| 92 | { | 212 | { |
